Für alle, die dies zukünftig finden, würde ich mail
nicht empfehlen. Es gibt einige Antworten, die darauf eingehen, aber nicht das Warum davon.
Die mail
-Funktion von PHP ist nicht nur undurchsichtig, sie verlässt sich vollständig auf den von Ihnen verwendeten MTA (z.B. Sendmail), um die Arbeit zu erledigen. mail
wird Ihnen nur mitteilen, wenn der MTA es abgelehnt hat (z.B. Sendmail war aus, als Sie versucht haben zu senden). Es kann Ihnen nicht mitteilen, ob die Mail erfolgreich war, weil es diese übergeben hat. Daher (wie John Conde's Antwort zeigt), müssen Sie nun mit den Protokollen des MTA herumexperimentieren und hoffen, dass es Ihnen genug über das Versagen erzählt, um es zu beheben. Wenn Sie auf einem Shared Host sind oder keinen Zugriff auf die MTA-Protokolle haben, haben Sie Pech. Leider ist das Standardverhalten für die meisten Vanilla-Installationen von Linux auf diese Weise.
Ein Mail-Bibliothek (PHPMailer, Zend Framework 2+, usw.) macht etwas ganz anderes als mail
. Sie öffnen eine Verbindung direkt zum empfangenden Mail-Server und senden dann die SMTP-Mail-Befehle direkt über diese Verbindung. Mit anderen Worten, die Klasse fungiert als ihr eigener MTA (beachten Sie, dass Sie den Bibliotheken sagen können, mail
für das letztendliche Senden der Mail zu verwenden, aber ich würde Ihnen dringend davon abraten).
Dies bedeutet, dass Sie die Antworten des empfangenden Servers direkt sehen können (in PHPMailer können Sie beispielsweise Debugging-Ausgabe aktivieren). Kein Rätselraten mehr, ob eine E-Mail nicht gesendet wurde oder warum.
Wenn Sie SMTP nutzen (d.h. Sie rufen isSMTP()
auf), können Sie eine detaillierte Mitschrift des SMTP-Gesprächs mit der SMTPDebug
-Eigenschaft erhalten.
Aktivieren Sie diese Option, indem Sie eine Zeile wie diese in Ihr Skript einfügen:
$mail->SMTPDebug = 2;
Sie erhalten auch den Vorteil einer besseren Benutzeroberfläche. Bei mail
müssen Sie alle Ihre Header, Anhänge usw. einrichten. Mit einer Bibliothek haben Sie eine dedizierte Funktion, um das zu erledigen. Das bedeutet auch, dass die Funktion alle kniffligen Teile erledigt (wie Header).