Obwohl es Teile dieser Antwort gibt, die nur für die Verwendung dermail()
Funktion selbst gelten, können viele dieser Schritte zur Fehlerbehebung auf jedes PHP-Mailing-System angewendet werden.
Es gibt verschiedene Gründe, warum Ihr Skript anscheinend keine E-Mails sendet. Es ist schwierig, diese Dinge zu diagnostizieren, es sei denn, es liegt ein offensichtlicher Syntaxfehler vor. Ohne eine müssen Sie die unten stehende Checkliste durchgehen, um mögliche Fallstricke zu finden, auf die Sie möglicherweise stoßen.
Stellen Sie sicher, dass die Fehlerberichterstattung aktiviert ist und alle Fehler gemeldet werden
Die Fehlerberichterstattung ist wichtig, um Fehler in Ihrem Code und allgemeine Fehler, auf die PHP stößt, auszurotten. Die Fehlerberichterstattung muss aktiviert sein, um diese Fehler zu erhalten. Wenn Sie den folgenden Code oben in Ihre PHP-Dateien (oder in eine Master-Konfigurationsdatei) einfügen, wird die Fehlerberichterstattung aktiviert.
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
Siehe Wie kann ich nützliche Fehlermeldungen in PHP erhalten? - diese Antwort für weitere Details dazu.
Stellen Sie sicher, dass die mail()
Funktion aufgerufen wird
Es mag albern erscheinen, aber ein häufiger Fehler besteht darin, zu vergessen, die mail()
Funktion tatsächlich in Ihren Code einzufügen. Stellen Sie sicher, dass es vorhanden und nicht auskommentiert ist.
Stellen Sie sicher, dass die mail()
Funktion korrekt aufgerufen wird
Bool Mail (Zeichenfolge $ bis, Zeichenfolge $ Betreff, Zeichenfolge $ Nachricht [, Zeichenfolge $ zusätzliche_Köpfe [, Zeichenfolge $ zusätzliche_Parameter]])
Die Mail-Funktion verwendet drei erforderliche Parameter und optional einen vierten und einen fünften. Wenn Ihr Aufruf von mail()
nicht mindestens drei Parameter enthält , schlägt dies fehl.
Wenn Ihr Aufruf von mail()
nicht die richtigen Parameter in der richtigen Reihenfolge enthält , schlägt dies ebenfalls fehl.
Überprüfen Sie die E-Mail-Protokolle des Servers
Ihr Webserver sollte alle Versuche protokollieren, E-Mails über ihn zu senden. Der Speicherort dieser Protokolle ist unterschiedlich (möglicherweise müssen Sie Ihren Serveradministrator fragen, wo sie sich befinden). Sie befinden sich jedoch normalerweise im Stammverzeichnis eines Benutzers unter logs
. Darin befinden sich Fehlermeldungen, die der Server im Zusammenhang mit Ihren Versuchen, E-Mails zu senden, gemeldet hat.
Überprüfen Sie, ob die Portverbindung fehlgeschlagen ist
Portblock ist ein sehr häufiges Problem, mit dem die meisten Entwickler bei der Integration ihres Codes zur Zustellung von E-Mails über SMTP konfrontiert sind. Dies kann leicht in den Server-Maillogs nachverfolgt werden (der Speicherort des Servers des E-Mail-Protokolls kann von Server zu Server variieren, wie oben erläutert). Wenn Sie sich auf einem gemeinsam genutzten Hosting-Server befinden, bleiben die Ports 25 und 587 standardmäßig blockiert. Dieser Block wurde absichtlich von Ihrem Hosting-Anbieter durchgeführt. Dies gilt auch für einige der dedizierten Server. Wenn diese Ports blockiert sind, versuchen Sie, eine Verbindung über Port 2525 herzustellen. Wenn Sie feststellen, dass dieser Port ebenfalls blockiert ist, wenden Sie sich an Ihren Hosting-Anbieter, um die Blockierung dieser Ports aufzuheben.
Die meisten Hosting-Anbieter blockieren diese E-Mail-Ports, um ihr Netzwerk vor dem Versenden von Spam-E-Mails zu schützen.
Verwenden Sie die Ports 25 oder 587 für Plain / TLS-Verbindungen und Port 465 für SSL-Verbindungen. Für die meisten Benutzer wird empfohlen, Port 587 zu verwenden, um von einigen Hosting-Anbietern festgelegte Ratenbeschränkungen zu vermeiden.
Verwenden Sie nicht den Operator zur Fehlerunterdrückung
Wenn der Fehlerunterdrückung Operator @
auf einen Ausdruck in PHP vorangestellt wird, werden alle Fehlermeldungen , die von diesem Ausdruck erzeugt werden könnten , werden ignoriert. Unter bestimmten Umständen ist die Verwendung dieses Operators erforderlich, das Senden von E-Mails gehört jedoch nicht dazu.
Wenn Ihr Code enthält @mail(...)
, verbergen Sie möglicherweise wichtige Fehlermeldungen, die Ihnen beim Debuggen helfen. Entfernen Sie das @
und prüfen Sie, ob Fehler gemeldet werden.
Es ist nur dann sinnvoll , wenn Sie mit überprüfenerror_get_last()
direkt danach für konkrete Ausfälle.
Überprüfen Sie den mail()
Rückgabewert
Die mail()
Funktion:
Gibt zurück, TRUE
wenn die Mail FALSE
andernfalls erfolgreich zur Zustellung angenommen wurde . Es ist wichtig zu beachten, dass nur weil die Post zur Zustellung angenommen wurde, dies NICHT bedeutet, dass die Post tatsächlich das beabsichtigte Ziel erreicht.
Dies ist wichtig zu beachten, weil:
- Wenn Sie einen
FALSE
Rückgabewert erhalten, wissen Sie, dass der Fehler darin liegt, dass Ihr Server Ihre E-Mails akzeptiert. Dies ist wahrscheinlich kein Codierungsproblem, sondern ein Serverkonfigurationsproblem. Sie müssen mit Ihrem Systemadministrator sprechen, um herauszufinden, warum dies geschieht.
- Wenn Sie einen
TRUE
Rückgabewert erhalten, bedeutet dies nicht, dass Ihre E-Mail definitiv gesendet wird. Dies bedeutet lediglich, dass die E-Mail von PHP erfolgreich an den jeweiligen Handler auf dem Server gesendet wurde. Es gibt noch weitere Fehlerquellen außerhalb der Kontrolle von PHP, die dazu führen können, dass die E-Mail nicht gesendet wird.
Dies FALSE
hilft Ihnen dabei, die richtige Richtung einzuschlagen, was TRUE
jedoch nicht unbedingt bedeutet, dass Ihre E-Mail erfolgreich gesendet wurde. Dies ist wichtig zu beachten!
Stellen Sie sicher, dass Ihr Hosting-Anbieter das Senden von E-Mails zulässt und das Senden von E-Mails nicht einschränkt
Viele gemeinsam genutzte Webhosts, insbesondere kostenlose Webhosting-Anbieter, erlauben entweder nicht, dass E-Mails von ihren Servern gesendet werden, oder begrenzen die Menge, die während eines bestimmten Zeitraums gesendet werden kann. Dies ist auf ihre Bemühungen zurückzuführen, Spammer daran zu hindern, ihre billigeren Dienste in Anspruch zu nehmen.
Wenn Sie der Meinung sind, dass Ihr Host E-Mail-Beschränkungen hat oder das Senden von E-Mails blockiert, überprüfen Sie die häufig gestellten Fragen (FAQs), um festzustellen, ob solche Einschränkungen aufgeführt sind. Andernfalls müssen Sie sich möglicherweise an den Support wenden, um zu überprüfen, ob beim Versenden von E-Mails Einschränkungen bestehen.
Überprüfen Sie die Spam-Ordner. Verhindern Sie, dass E-Mails als Spam gekennzeichnet werden
Aus verschiedenen Gründen landen E-Mails, die über PHP (und andere serverseitige Programmiersprachen) gesendet werden, häufig im Spam-Ordner eines Empfängers. Überprüfen Sie dort immer, bevor Sie Fehler in Ihrem Code beheben.
Um zu vermeiden, dass über PHP gesendete E-Mails an den Spam-Ordner eines Empfängers gesendet werden, können Sie sowohl in Ihrem PHP-Code als auch auf andere Weise verschiedene Maßnahmen ergreifen, um die Wahrscheinlichkeit zu minimieren, dass Ihre E-Mails als Spam markiert werden. Gute Tipps von Michiel de Mare sind:
- Verwenden Sie E-Mail-Authentifizierungsmethoden wie SPF und DKIM, um zu beweisen, dass Ihre E-Mails und Ihr Domain-Name zusammengehören, und um das Spoofing Ihres Domain-Namens zu verhindern. Die SPF-Website enthält einen Assistenten zum Generieren der DNS-Informationen für Ihre Site.
- Überprüfen Sie Ihr Reverse-DNS , um sicherzustellen, dass die IP-Adresse Ihres Mailservers auf den Domainnamen verweist, den Sie zum Senden von E-Mails verwenden.
- Stellen Sie sicher, dass die von Ihnen verwendete IP-Adresse nicht auf einer schwarzen Liste steht
- Stellen Sie sicher, dass die Antwortadresse eine gültige, vorhandene Adresse ist.
- Verwenden Sie im Feld An den vollständigen, echten Namen des Empfängers, nicht nur die E-Mail-Adresse (z
"John Smith" <john@blacksmiths-international.com>
. B. ).
- Überwachen Sie Ihre Missbrauchskonten, z. B.missbrauch@IhreDomain.com und Postmaster@IhreDomain.com. Das heißt - stellen Sie sicher, dass diese Konten vorhanden sind, lesen Sie, was an sie gesendet wurde, und reagieren Sie auf Beschwerden.
- Schließlich machen Sie es wirklich einfach, sich abzumelden. Andernfalls werden sich Ihre Benutzer durch Drücken der Spam- Taste abmelden. Dies wirkt sich auf Ihren Ruf aus.
Siehe Wie stellen Sie sicher, dass E-Mails, die Sie programmgesteuert senden, nicht automatisch als Spam markiert werden? Weitere Informationen zu diesem Thema.
Stellen Sie sicher, dass alle Mail-Header angegeben sind
Einige Spam-Programme lehnen E-Mails ab, wenn allgemeine Header wie "Von" und "Antwort an" fehlen:
$headers = array("From: from@example.com",
"Reply-To: replyto@example.com",
"X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);
Stellen Sie sicher, dass Mail-Header keine Syntaxfehler aufweisen
Ungültige Header sind genauso schlecht wie keine Header. Ein falsches Zeichen könnte alles sein, was Sie brauchen, um Ihre E-Mail zu entgleisen. Double-Check , um sicherzustellen , Ihre Syntax korrekt ist als PHP wird nicht diese Fehler für Sie fangen.
$headers = array("From from@example.com", // missing colon
"Reply To: replyto@example.com", // missing hyphen
"X-Mailer: "PHP"/" . PHP_VERSION // bad quotes
);
Verwenden Sie keinen falschen From:
Absender
Während die Mail einen Absender von: haben muss, dürfen Sie nicht einfach irgendeinen Wert verwenden. Insbesondere vom Benutzer verwendete Absenderadressen sind ein todsicherer Weg, um Mails zu blockieren:
$headers = array("From: $_POST[contactform_sender_email]"); // No!
Grund: Ihr Web- oder Sende-Mail-Server ist nicht SPF / DKIM-Whitelist, um vorzutäuschen, für @ hotmail- oder @ gmail-Adressen verantwortlich zu sein. Es kann sogar stillschweigend E-Mails mit From:
Absenderdomänen löschen, für die es nicht konfiguriert ist.
Stellen Sie sicher, dass der Empfängerwert korrekt ist
Manchmal ist das Problem so einfach wie ein falscher Wert für den Empfänger der E-Mail. Dies kann auf die Verwendung einer falschen Variablen zurückzuführen sein.
$to = 'user@example.com';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to
Eine andere Möglichkeit, dies zu testen, besteht darin, den Empfängerwert fest in den mail()
Funktionsaufruf zu codieren :
mail('user@example.com', $subject, $message, $headers);
Dies kann für alle mail()
Parameter gelten.
An mehrere Konten senden
Senden Sie Ihre E-Mail an mehrere E-Mail-Konten bei verschiedenen E-Mail-Anbietern , um Probleme mit E-Mail-Konten auszuschließen . Wenn Ihre E-Mails nicht im Google Mail-Konto eines Benutzers ankommen, senden Sie dieselben E-Mails an ein Yahoo-Konto, ein Hotmail-Konto und ein reguläres POP3-Konto (wie Ihr vom ISP bereitgestelltes E-Mail-Konto).
Wenn die E-Mails bei allen oder einigen anderen E-Mail-Konten ankommen, wissen Sie, dass Ihr Code E-Mails sendet, aber es ist wahrscheinlich, dass der E-Mail-Kontoanbieter sie aus irgendeinem Grund blockiert. Wenn die E-Mail bei keinem E-Mail-Konto ankommt, hängt das Problem eher mit Ihrem Code zusammen.
Stellen Sie sicher, dass der Code mit der Formularmethode übereinstimmt
Wenn Sie Ihre Formularmethode auf festgelegt haben POST
, stellen Sie sicher, dass Sie $_POST
nach Ihren Formularwerten suchen. Wenn Sie es eingestellt haben GET
oder gar nicht eingestellt haben, stellen Sie sicher, dass Sie $_GET
nach Ihren Formularwerten suchen.
action
Stellen Sie sicher, dass Ihr Formularwert auf die richtige Position zeigt
action
Stellen Sie sicher, dass Ihr Formularattribut einen Wert enthält, der auf Ihren PHP-Mailingcode verweist.
<form action="send_email.php" method="POST">
Stellen Sie sicher, dass der Webhost das Senden von E-Mails unterstützt
Einige Webhosting-Anbieter erlauben oder aktivieren das Senden von E-Mails über ihre Server nicht. Die Gründe hierfür können variieren. Wenn sie jedoch das Senden von E-Mails deaktiviert haben, müssen Sie eine alternative Methode verwenden, bei der diese E-Mails von einem Dritten für Sie gesendet werden.
Eine E-Mail an den technischen Support (nach einem Besuch des Online-Supports oder häufig gestellte Fragen) sollte klarstellen, ob auf Ihrem Server E-Mail-Funktionen verfügbar sind.
Stellen Sie sicher, dass der localhost
Mailserver konfiguriert ist
Wenn Sie auf Ihrer lokalen Workstation mit WAMP, MAMP oder XAMPP entwickeln, ist wahrscheinlich kein E-Mail-Server auf Ihrer Workstation installiert. Ohne eine kann PHP standardmäßig keine E-Mails senden.
Sie können dies überwinden, indem Sie einen einfachen Mailserver installieren. Für Windows können Sie die kostenlose Mercury Mail verwenden .
Sie können auch SMTP verwenden, um Ihre E-Mails zu senden. Sehen Sie sich diese großartige Antwort von Vikas Dwivedi an, um zu erfahren, wie das geht.
Aktivieren Sie die benutzerdefinierte PHP mail.log
Zusätzlich zur Protokolldatei Ihres MTA und PHP können Sie die Protokollierung für die mail()
Funktion speziell aktivieren . Es wird nicht die gesamte SMTP-Interaktion aufgezeichnet, sondern zumindest Funktionsaufrufparameter und Aufrufskript.
ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);
Weitere Informationen finden Sie unter http://php.net/manual/en/mail.configuration.php . (Am besten aktivieren Sie diese Optionen im php.ini
oder .user.ini
oder .htaccess
vielleicht.)
Wenden Sie sich an einen Mail-Testdienst
Es gibt verschiedene Zustellungs- und Spam-Überprüfungsdienste, mit denen Sie Ihr MTA / Webserver-Setup testen können. In der Regel senden Sie eine Mail-Sonde an: ihre Adresse, erhalten dann später einen Zustellungsbericht und konkretere Fehler oder Analysen:
Verwenden Sie einen anderen Mailer
Die eingebaute mail()
Funktion von PHP ist praktisch und erledigt oft die Arbeit, hat aber auch Mängel . Glücklicherweise gibt es Alternativen, die mehr Leistung und Flexibilität bieten, einschließlich der Behandlung vieler der oben beschriebenen Probleme:
All dies kann mit einem professionellen SMTP-Server / Dienstanbieter kombiniert werden. (Weil typische gemeinsam genutzte Webhosting-Pläne für 08/15 in Bezug auf die Einrichtung / Konfigurierbarkeit von E-Mails ein Erfolg oder Misserfolg sind.)