| | Inhalt:
1.Die Funktion mail()
2.sendmail
3.SMTP? Nie gehört
4.Newsletter
5.Dateien verschicken
Ein Zweck, dem PHP oft nachkommt, ist das versenden von Mail. Sei es ein Feedback-Formular für die eigene Seite, eine Bestätigung für einen Eintrag in ein Forum oder was auch immer. Die Möglichkeiten sind vielfältig und lassen der Fantasie keine Grenzen ;).
1. Die Funktion mail()
Die praktische Umsetzung ist genauso vielfältig. Die einfachste Möglichkeit dafür wird von PHP geboten. Die Funktion mail() bietet für den Einstieg ausreichend Funktionalität. Sie erwartet als Argumente erstens die eMail-Adresse des Empfaengers, dann das Subject der Mail und schliesslich den Message-Body. Die grundsätzlichste Variante wäre also folgende:
mail("empfaenger@deremail.de", "Mailen mit PHP", "Hallo Empfaenger,\nwusstest du, dass man mit PHP ganz einfach Mails verschicken kann?");
Diese Funktionalität ist allerdings nicht für jedermann ausreichend. So erhält man beim verschicken einer Mail auf o.g. Weise einen eigenartigen Absender, der meistens dem Namen des Users entspricht, der als Standard-Absender in der php.ini angegeben ist. Um dem entgegenzuwirken, bietet PHP noch einen optionalen Parameter an, mit dem zusätzliche Header-Informationen für die Mail angegeben werden können. Dies kann zum Beispiel ein ordentlicher Absender oder eine alternative Antwort-Adresse sein. Das Ergebnis könnte dann wie folgt aussehen:
mail("empfaenger@deremail.de", "Mailen mit PHP", "Hallo Empfaenger, wusstest du, dass man mit PHP ganz einfach Mails verschicken kann?", "From: pom@dynamic-webpages.de\nReply-To: pom@beatsteaks.de\nX-Mailer: Poms Mail Tutorial");
Vorraussetzung für die Funktionalität ist allerdings, dass die php.ini ordentlich editiert ist. Unter UNIX/Linux muss hierfür der Pfad zu sendmail und der Standard-Absender angegeben werden. Unter Windows läuft das etwas anders, da hier SMTP für das Verschicken von Mail mit der mail()-Funktion implementiert wurde. Unter Windows muss dafür in der php.ini ein SMTP-Server für ausgehende Mail angegeben werden anstatt des Pfades von sendmail.
2. sendmail
Dies waren aber noch nicht die einzigen Möglichkeiten, um Mail zu verschicken. Es ist auch möglich, entweder mit sendmail direkt zu arbeiten oder sich über SMTP mit Mail-Servern zu unterhalten. Die erste Möglichkeit ist mein persönlicher Favorit und funktioniert über Prozesszeiger. Hierfür wird die Funktion popen() benutzt, welche als Argumente den Pfad zum auszuführenden Prozess und den Mode erhält. Ersteres Argument ist meistens /usr/lib/sendmail und für letzteres ist der Mode w für Schreiben zu wählen. Der vollständige Aufruf von sendmail wäre also:
$fp = popen("/usr/lib/sendmail -t", "w");
popen() liefert einen Zeiger auf den Prozess, mit dem man dann die Ausgabe vom Prozess bekommen und Eingabe an den Prozess weitergeben kann. Dies lässt sich mit Hilfe der Funktionen fgets() und fputs() umsetzen. Erstere ist aber für uns nicht wichtig, da sendmail nur Eingaben erwartet und nur im Fehlerfall Ausgaben macht. Da ich aber hier die Implementierung sauber vorführe und sendmail im Fall eines Fehlers einfach keine Mail verschickt, sollte dies auch fehl am Platze sein. fputs() ist also die Funktion der Wahl für meinen Zweck. Sie erwartet als ersten Parameter einen Pointer auf eine Datei oder in unserem Falle einen Pointer auf den Prozess. Da beide vom Prinzip her identisch sind, ist dies hier nicht von Bedeutung. Der zweite Parameter von fgets() ist der zu schreibende String. Um also an den von mir weiter oben geöffneten Prozess einen String weiterzugeben, würde der Funktionsaufruf wie folgt lauten:
fputs($fp, "To: empfaenger@deremail.de\n");
Hierbei muss darauf geachtet werden, dass nach dem weitergegebenen String immer mit \n eine neue Zeile eingeleitet wird. Die komplette Implementierung folgt auf den Fuss:
$fp = popen("/usr/lib/sendmail -t ","w");
fputs($fp, "To: empfaenger@deremail.de\n");
fputs($fp, "From: Mathias Meyer \n");
fputs($fp, "Subject: Mailen mit PHP\n\n");
fputs($fp, "Hallo, Empfaenger,\n");
fputs($fp, "wusstest du, dass man mit PHP ganz einfach Mails verschicken kann?");
pclose($fp);
Als erstes wird eine schreibende Verbindung zu sendmail geöffnet. Danach werden die Daten übermittelt. Wichtig hierbei ist das doppelte \n nach dem Subject oder im Anwendungsfall immer nach der letzten angegebenen Header-Zeile. Um das Ganze dann abzuschliessen, muss der Prozess mit pclose() ordentlich geschlossen werden, damit die Mail auch korrekt abgeschickt wird.
Hin wieder kommt die Frage, warum beim Senden von Mail mit sendmail oftmals ein Absender namens nobody@deremail.de oder ähnliches als Absender im Mail-Header steht. Die Antwort ist denkbar einfach. Der häufig verwendete Apache läuft oftmals unter diesem Nutzernamen. Wenn nun vom PHP-Modul aus ein Prozesszeiger auf sendmail geöffnet wird, so geschieht dies logischerweise unter der Nutzer-ID des Apache. Dies kann mehr oder minder grosse Probleme nach sich ziehen. Erstens mal gelangen so eventuelle Fehlermeldungen an die falsche Adresse und zweitens mal siehts einfach besser aus. Um dies nun zu verhindern hängt man an den Aufruf von sendmail, der weiter oben schon durchexerziert wurde, einfach noch den Parameter -f gefolgt von der gewünschten eMail-Adresse an. Somit wird der sogenannte envelope-sender gesetzt. An selbigen gehen nun etwaige Fehlermeldungen, etwa wenn der Empfänger inexistent ist. Ist in solch einem Fall der envelope-sender nicht richtig gesetzt, wird die Fehlermail an eine Adresse gesendet, die zwar existent sein mag, deren Mail aber niemand liest. Bei einem ordentlich gesetzten Alias in der /etc/aliases geht die Fehlermeldung zwar an den SuperUser, aber wer möchte schon den Systemgott mit irgendwelchen Fehlermeldungen belästigen. Ausserdem kann man so eine ganz bestimmte eMail-Adresse setzen, an die beispielsweise beim Versenden von Newslettern die Fehlermeldungen bei nicht existierenden oder falschen Empfängeradressen gesendet werden.
|