Mail in CGIs
Hier sind einige Notizen über das Senden von eMails mit CGI-Skripten
Empfänger
Die eMail-Adresse des Empfängers soll immer geprüft werden. Am
besten wird nach RFC822 geprüft. Die Datei
rfc822-syntax.txt enthält eine Perl Regular Expression,
die eine eMail-Adresse nach RFC822 prüft.
Weitere Möglichkeiten:
-
Der String enthält genau einen Klammeraffen (@) und sonst keine
Zeichen außer Buchstaben, Ziffern, Punkt (.), Minus
(-) und Unterstrich (_).
-
Man könnte eine volle Syntaxprüfung der Form
"name" <email-adresse>
machen.
Besonders gefährlich sind eMail-Adressen, die von einem HTML-Formular
kommen. Bei back ticks (`kommando`) in Perl
(oder PHP in nicht safe Mode) ist große Vorsicht geboten: Zeichen
wie Strichpunkt (;) innerhalb einer eMail-Adresse in eine Anweisung
wie
system("/usr/lib/sendmail -t $form_address <
$input_file");
können verheerende Auswirkungen haben: Wenn $input_file einen
Strichpunkt enthält, kann der Benutzer beliebige Anweisungen auf dem
CGI-Server ausführen lassen!
Das
PHP-Skript
(hier als
lesbare
Text-Datei - Leider wird diese Datei mit M$ Internet Exploder falsch
angezeigt.) zeigt, wie man die Prüfungen mit PHP machen kann.
Headers
Damit eine eMail ankommt, sind einige Headers notwendig:
-
To:eMail-Adresse
-
notwendig (sonst kommt's nirgendwo an)
-
Subject:Text
-
Betreff: sollte immer vorhanden sein. Wenn Nicht-ASCII-Zeichen vorkommen,
sollen sie mit der entsprechenden Zeichensaztcodierung versehen werden
(s. unten).
-
From:eMail-Adresse
-
sollte immer dabei sein.
-
Reply-to:eMail-Adresse
-
notwendig, wenn der Empfänger seine Antwort an jemand anderen als an
den Absender schicken soll,
-
return-path:eMail-Adresse
-
ist immer dabei; gibt die Adresse an, an die nicht lieferbare eMails
zurückgeschickt werden. Wer die Fehlermeldung bekommt, wird
unten beschrieben.
-
Content-Transfer-Encoding:
-
wenn nicht angegeben, wird 7BIT als Wert angenommen. Dies bedeutet,
dass nur 7-Bit-ASCII-Zeichen in der eMail vorkommen. Wenn man Umlaute verwenden
will muss der Wert quoted-printable hier stehen.
(Weiteres zu quoted-printable s. unten)
-
MIME-Version: 1.0
-
nur notwendig, wenn Attachments dabei sind, ist aber immer sinnvoll.
-
X-Mailer:Name des Mail-Programms
-
Diese Angabe ist nicht zwingend notwendig. Einige Mail-Server (z.B. GMX und
Hotmail) ignorieren Mails, die keinen X-Mailer-Header haben. (Sie
betrachten solche eMails als Spam.) Man könnte etwas wie
PHP-Mailer (Uni-Regensburg.de
Institut)
benutzen.
Was mit einer nicht zustellbaren eMail passiert ist etwas kompliziert zu
beschreiben. Die Fehlermeldung geht an die eMail-Adresse, die im
"return-path:"-Header in der eMail steht. Dieser Header wird meist
vom Mailprogramm automatisch erzeugt. Unsinnigerweise wird diese Adresse
in der Literatur "from-address" genannt, obwohl sie mit dem
"From:"-Header nichts zu tun hat. Sie wird folgendermaßen festgelegt:
-
Ist beim Mailprogramm eine from-addresse vorhanden, so wird diese
Adresse verwendet;
-
ist keine from-addresse aber ein "Return-Path"-Header vorhanden, so
wird dies verwendet;
-
ist gar kein return-path vorhanden, fügt der SMTP-Server der
Uni die Mailbox des Unix-Benutzers ein, was in diesem Fall nicht
funktioniert, da der "Benutzer" für PHP-Skripten auf dem CGI-Server
nur auf diesem Rechner existiert;
-
kann keine from-addresse gefunden werden, so wird die Meldung an
root@rss1.rz.uni-regensburg.de geschickt, der sieht, dass sie von
rss7 kommt und schickt sie weiter an mich (Webmaster)
Das Mailprogramm auf dem CGI-Server heißt sendmail und kann
auch durch Parameter konfiguriert werden.
-
Es gibt einen Parameter sendmail_from, der nur unter Windows
funktioniert.
-
Unter Unix benutzt man einen Parameter zu Sendmail, der für bestimmten
Verzeichnisse in der PHP-Konfigurationsdatei angegeben werden kann.
-
Unter Unix und PHP, der nicht in safe mode läuft, ist ein 5.
Parameter zu mail() erlaubt. Dieser Parameter wird aber auf dem
CGI-Server durch safe mode verboten.
Folgende Notizen sind aus einigen Testsversuchen entstanden. Sie formulieren
die obigen Ergebisse etwas anders:
-
ini_set('sendmail_from', ..) tut nichts. Es steht im Manual: diese
Variable wird nur unter Windows berücksichtigt.
-
Der 5. Parameter in mail() ist nicht in safe mode erlaubt.
-
Wenn eine eMail nicht zustellbar ist, geht die Nachricht an
"return-path:". Wenn "-ffrom-addresse" im
sendmail_path (Konfiguration oder 5. Mail-Parameter) steht, wird
dies als return-path: verwendet, egal, ob ein solcher Header in
der eMail vorhanden ist oder nicht.
-
Ist bei sendmail kein "-f"-Parameter vorhanden, so wird ein evtl.
vorhandener "return-path:"-Header verwendet.
-
Nur nebenbei bemerkt: web.de zeigt einen "return-path:"-Header als
"Sender:" an. Ein solcher Header in der eMail wird aber ignoriert.
Empfehlungen
-
Wenn Sie eMails mit einem Skript auf dem CGI-Server wegschicken wollen,
informieren
Sie vorher den Webmaster. Er braucht folgende Informationen: welches
Verzeichnis auf dem CGI-Server, an welche eMail_Adresse sollen nicht zustellbare
eMails zurückkommen?
-
Bringen Sie alle sinnvollen Headers in Ihre email ein.
Im Text benutzt man das sog "quoted-printable". In Headers muss der entsprechende
Code verwendet werden.
Beispielskript
Weiteres kommt erst
Attachments
kommt erst
Stand 02.12.02. © Universität Regensburg,
Mike
Middleton.