Sehr Umfangreiche Webseite zum Programmieren in C Perl CGI, Skripting, Linux, SystemprogrammierungEin Beispiel der Praxis: Eine Formmail Cgi-Skript Ein Beispiel der Praxis: Eine Formmail GGI Kurs Kapitel 11

Ein Beispiel der Praxis: Eine Formmail           zurück zum Inhaltsverzeichnis

Jetzt folgt ein einfaches Beispiel, wie man eine Formmail mit Hilfe eines CGI-Skript realisieren kann. Vorraussetzung für diese Kapitel ist, dass bei Ihnen sendmail installiert und konfiguriert ist.

MS-Windows-Anwender können sich ja mal das E-Mailprogramm blat dazu ansehen oder das Perl-Modul Mail::Mailer welches natürlich auch für Unix erhältich ist.

Sind Sie kein Freund der Kommandozeilen-Programme, so können Sie sendmail auch mit Kmail, dem Mailprogramm von KDE, konfigurieren. Dies machen Sie unter dem Menü "Einstellungen". Aktivieren Sie unter "Netzwerk", die Versandart "sendmail" und richten Sie für den Mail-Eingang ein lokales Postfach mit dem Pfad dazu ein. In meinem Fall ist dies zum Beispiel /var/spool/mail/root.

Bevor wir jetzt Anfangen die HTML-Datei zu erstellen, wollen wir uns erst mal ansehen wie wir eine Mail verschicken können ...

#!/usr/bin/perl -w

$sendmail =  "/usr/sbin/sendmail";
#Pfad von sendmail kann ermittelt werden mit "which sendmail"

open(MAIL, "|$sendmail -oi -t") or die "Can't open pipe to $sendmail: $!\n";
print MAIL "To: tot\@linux\n";      #Bitte anpassen
print MAIL "From: Anonymus\@anoymus.de\n";
print MAIL "Subject: Hallo Test\n\n";
print MAIL "Dies stellt den Inhalt der Mail da\n";
close(MAIL) or die "Can't close pipe to $sendmail: $!\n";

print "Die Mail wurde erfolgreich verschickt\n"

Um Sie zu Beruhigen, welches Mailprogramm auf Ihrem Webhoster läuft, sendmail wird meistens verwendet sofern es sich bei dem Webserver um Apache handelt. Sollten Sie nicht sendmail für das Lokale Testen zur Verfügung haben, bleibt Ihnen wohl nichts anderes Übrig, als das CGI-Skript online auf Ihrem Webhoster zu testen.

Bitte passen die Mailadresse an wohin Sie diese Mail schicken wollen. Testen Sie das Perl-Skript und wenn alles erfolgreich Verlaufen ist, müsste in Ihrem Posteingang eine Mail liegen. Wenn nicht überprüfen Sie denn Pfad zu sendmail und die E-Mailadresse.

Somit hätten wir eigentlich schon das CGI-Skript in der Rohfassung. Wir müssen eigentlich "nur" noch die Daten empfangen und weiterverarbeiten. Mit ...

open(MAIL, "|$sendmail -oi -t");

... richten wir einen Filehandle auf das Programm sendmail ein. Die weiteren Eingaben an sendmail machen wir einfach mit Hilfe des Filedeskriptors MAIL und der print-Anweisung.

Zuerst schreiben wir nun die HTML-Datei für die Formmail erstellen. Sie können dies Selbstverständlich auch mit dem HTML-Tags des CGI.pm Modul machen wenn Sie wollen ...

<html>
<head>
<title>Formmail</title>
</head>
<body>
   <p><b>Beispiel einer Formmail</b><br>
   <tt>
   <form action="http://localhost/cgi-bin/form.cgi" method="post">
     <p>Dein Name :<br><input name="name" size="30">
     <p>E-Mailadresse :<br><input name="email" size="30">
     <p>Bitte geben sie Ihre Kritik, Lob oder Anregungen hier ein :<br>
     <textarea name="msg" rows="5" cols="30"></textarea><br>
     <input type="submit" name="action" value="Senden">
     <input type="reset"  value="Zurücksetzen">
   </form>
   </tt>
</body>
</html>

Und so sieht es aus:

Beispiel einer Formmail

Dein Name :

E-Mailadresse :

Bitte geben sie Ihre Kritik, Lob oder Anregungen hier ein :

Nun benötigen wir das CGI-Skript form.cgi, welches die Formulareingaben auswerten soll. Das Layout und weitere optische Sachen überlasse ich Ihrem Geschmack. Hier gibt es nur die pure funktionsweise. Wir wollen natürlich überprüfen ob alle Eingaben gemacht wurden und ob ein gültige E-Mailadresse eingeben wurde. Wenn alles in Ordnung war, schicken wir die Mail mit sendmail an unsere Adresse. Hier nun das CGI-Skript ...

#!/usr/bin/perl

use CGI;
#zur Fehlerausgabe auf dem Browser
use CGI::Carp qw(fatalsToBrowser);

my $sendmail='/usr/sbin/sendmail';#Pfad von sendmail
my $empfaenger="tot\@linux"; #Ihre Mailadresse (Anpassen)
my $sender='Formmail <root\@localhost.localdomain>';#Absender (Anpassen nach belieben)
my $subject='Formmail der Homepage www.pronix.de'; #Für den Betreff (Anpassen)
my @message="";
my $ok=1;

$q=new CGI;

#Eingaben einlesen
my $name=$q->param('name');
my $email=$q->param('email');
my $msg=$q->param('nachricht');
#Eingaben überprüfen
if(!$name)
  { push(@message,"Sie haben keinen Namen eingeben<br>"); $ok=0;}
if(!$email)
  { push(@message,"Sie haben keine E-Mailadresse angegeben<br>"); $ok=0; }
elsif($email!~/^.*?(\@).*?(\.).*?/)
  { push(@message,"Keine gueltige E-Mailadresse<br>"); $ok=0; }
if(!$msg)
  { push(@message,"Sie haben nichts in das Textfeld geschrieben<br>"); $ok=0;}

print $q->header;

if($ok==1){
 open(MAIL,"|$sendmail -oi -t") or die "Can't open pipe to $sendmail: $!\n";
 print MAIL "To: $empfaenger\n";
 print MAIL "From: $sender\n";
 print MAIL "Subject: $subject\n\n";
 print MAIL "$msg\n";
 close(MAIL) or die "Can't close pipe to $sendmail: $!\n";

 print "<html><head><title>Ihre Eingabebestätigung der Formmail</title><head>";
 print "<body><center><b><u>Folgende Daten wurden mir soeben übermittelt :</u></b><br><br>";
 print "Name   : <i>$name</i><br>";
 print "E-Mail : <i>$email</i><br>";
 print "Ihre Nachricht : <br><i>$msg</i>";
 print "<br><br><a href=\"../index.html\">Hier kommen sie
        wieder zurück auf meine Startseite</a>";
 }
else{
 print "<html><head><title>Fehler bei Eingabe der Formmail</title><head>";
 print "<body><center><b><u>Folgende Fehler traten bei Ihrer Eingabe auf :</u></b><br><br>";
 print "@message\n";
 print "<br><br><a href=\"./formmail.html\">Hier geht es zurück zur Formmail";
}

Speichern Sie das Skript unter dem Namen form.cgi. Rufen Sie Ihre HTML-Datei formmail.html auf tippen etwas ein und schon erleben Sie das Skript in Action. Es ist simpel, aber reicht für den Normalbedarf völlig aus.