6 Stimmen

PHP-Mail funktioniert nicht mehr

Vor einigen Tagen, als ich mail() Ich hatte es geschafft.

Aber jetzt funktioniert es nicht mehr. Und ich weiß nicht, was das Problem ist.

$to      = 'testmail@gmail.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: sender@gmail.com' . "\r\n" .
    'Reply-To: sender@gmail.com' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

$mail_sent = @mail( $to, $subject, $message, $headers ); 
echo $mail_sent ? "Mail sent" : "Mail failed";

Es wird "Mail gesendet" angezeigt.

Ich habe weder am Apache noch an diesem Code etwas geändert. Ich habe den Code in einer leeren PHP-Datei mit demselben Ergebnis getestet. Wie kann ich dieses Problem beheben?

11voto

VolkerK Punkte 93746

Wenn Sie eine E-Mail mit mail() versenden, übergibt php die Daten an die Anwendung, die Sie in sendmail_pfad , d.h. es wird ein neuer Prozess für <sendmail_path> erzeugt und einige Parameter und die E-Mail-Daten übergeben. Diese Anwendung soll die E-Mail in die Warteschlange eines Mail Transfer Agent (MTA) einspeisen.
Der Rückgabewert von php's mail() Funktion gibt "nur" an, ob php in der Lage war, diesen Prozess zu starten, die Daten an ihn zu streamen und der Prozess ohne einen Fehlercode beendet wurde. D.h. mail()==true sagt Ihnen nur, dass die E-Mail (angeblich) in die Warteschlange des ersten MTA auf der Route eingefügt wurde.

Die MTA entscheidet dann, was mit der E-Mail geschehen soll. Sie arbeiten wahrscheinlich nicht für Google und Ihr eigener MTA befindet sich nicht "innerhalb" von gmail.com. Also muss Ihr MTA die E-Mail senden zur nächsten MTA auf dem Pfad zu gmail.com (forward-path). Das kann funktionieren oder auch nicht, aber mail()===true sagt Ihnen nichts darüber.
Die Weiterleitung der Post von MTA zu MTA kann bei jedem der Schritte fehlschlagen. Und wenn die E-Mail schließlich "bei" gmail.com ankommt, kann der letzte MTA oder der Mail Delivery Agent (MDA) sie aus verschiedenen Gründen ablehnen.

Wenn ein Fehler auftritt, kann (eigentlich muss, aber das setzt voraus, dass alles richtig konfiguriert ist ;-)) der "aktuelle" MTA einen Fehlerbericht zurückschicken. Diese Fehlermeldung folgt dem Vorwärtspfad, aber in umgekehrter Reihenfolge (Rückwärtspfad), und schließlich (oder "hoffentlich") erhält der Absender eine "unzustellbare E-Mail".

(und das ist die Kurzversion. Sie ist wahrscheinlich ungenau und ich bin weder ein Admin noch ein E-Mail-/Smtp-Experte ;-))

Was können Sie also tun?

  1. Erzählen Sie uns mehr über Ihren Server. Ist es Ihr eigener (Heim-/Test-)Server? Welches Betriebssystem. Wissen Sie, welches "Mailing-System" installiert wurde (sendmail, qmail, ...)? Wer hat es konfiguriert?

  2. Fragen Sie nach Server-Fehler wie Sie das Mailing-System Ihres Servers einrichten, wie es Ihnen mitteilen könnte, wenn etwas schief gelaufen ist, und wie Sie Google davon überzeugen, Ihre E-Mails zu akzeptieren.

  3. Eliminieren Sie den ersten MTA oder lassen Sie das PHP-Skript selbst zum ersten MTA werden. Sie können dies tun, indem Sie z.B. Swiftmailer (unter Verwendung des smtp-Transportmoduls) anstelle von mail(). Auf diese Weise muss das lokale Mailsystem Ihres Servers nicht richtig funktionieren. Das Skript kontaktiert "direkt" den SMTP-Server von Google, authentifiziert "Sie" und stellt die E-Mail an Google zu. Das ist zwar immer noch keine Garantie dafür, dass die Mail zugestellt wird, aber es ist viel wahrscheinlicher, dass ein Fehler sofort an Ihr Skript gemeldet wird, d.h. wenn swiftmailer "Ok" meldet, ist es viel wahrscheinlicher, dass es wirklich ok ist, als dass mail() "true" zurückgibt.

11voto

Pekka Punkte 429407

Könnte es sein, dass E-Mails zwar gut verschickt werden, aber von einem Spam-Filter abgefangen werden? Wenn dies der Fall sein könnte, erlauben Sie mir Cross-Posting selbst :


Einige Aufzählungspunkte (unter der Annahme, dass mail() true zurückgibt und keine Fehler im Fehlerprotokoll stehen) :

  • Gehört die Absenderadresse ("From") zu einer Domäne auf Ihrem Server? Wenn nicht, machen Sie es so.
  • Steht Ihr Server auf einer schwarzen Liste (z. B. IP auf spamhaus.org überprüfen)? Bei gemeinsam genutztem Hosting ist dies nur bedingt möglich.
  • Werden Mails von einem Spam-Filter gefiltert? Eröffnen Sie ein Konto bei einem Freemailer, der einen Spam-Ordner hat, und finden Sie es heraus. Versuchen Sie auch, eine E-Mail an eine Adresse ohne Spam-Filter zu senden.
  • Benötigen Sie möglicherweise den fünften Parameter "-f" von mail(), um eine Absenderadresse hinzuzufügen? (Siehe mail()-Befehl im PHP-Handbuch)
  • Wenn Sie Zugang zu Protokolldateien haben, überprüfen Sie diese natürlich, wie oben vorgeschlagen.
  • Überprüfen Sie die "from:"-Adresse auf mögliche Bounce-Mails ("Returned to sender")? Sie können auch eine separate "Fehler-an"-Adresse einrichten.

Für Deutschsprachige habe ich vor einiger Zeit ein recht ausführliches "what to do" zu diesem Thema geschrieben. Siehe aquí .

1voto

Michael Mao Punkte 9418

Nun, ich wette, Sie verwenden einen kostenlosen/kommerziellen Server, der von jemand anderem verwaltet wird. Leider ist manchmal die Servereinstellung nicht korrekt, so dass Sie die E-Mail nicht erhalten können, obwohl Sie die korrekte php-Syntax befolgt haben. Versuchen Sie, den Kundendienst zu kontaktieren und lassen Sie ihn die Diagnose für Sie durchführen.

Dies ist bei meinem Server einmal passiert (justhost ist schuld!), also könnte dies für Sie hilfreich sein.

Überprüfen Sie diese Attribute in Ihrem phpinfo(); (wenn es Ihnen erlaubt, das zu sehen)

sendmail_from   no value    no value
sendmail_path   /usr/sbin/sendmail -t -i    /usr/sbin/sendmail -t -i

Die Wahrscheinlichkeit ist groß, dass diese Attribute nicht gut konfiguriert sind.

Ich sehe nichts Falsches an Ihrer php-Anweisung:)

editiert: Sie können auch ein Mail-Skript hochladen, das in einer anderen Sprache geschrieben wurde (Perl ist am besten geeignet, da die meisten Linux-Server es standardmäßig installiert haben). Schauen Sie, ob Sie von dort aus E-Mails versenden können. Wenn ja, dann nehme ich an, dass es sich um einen Fehler in der Serverkonfiguration handelt (php.ini-Problem?), nicht um Ihren. Wenn auch das Perl-Skript keine E-Mails senden kann, dann... lassen Sie es die Jungs im Kundendienstzentrum wissen und schauen Sie, ob Sie Ihr Geld zurückbekommen:)

1voto

Matt Stephenson Punkte 8162

Der SMTP-Server, der Ihre E-Mail bearbeitet, lehnt die Nachricht möglicherweise ab, weil sie vorgibt, von gmail.com zu stammen.

Versuchen Sie, das Feld 'Von' in $headers an eine Adresse aus Ihrer Domäne.

1voto

symcbean Punkte 46489

Wenn Sie Recht haben und ein Code, der früher funktionierte, nicht mehr funktioniert, muss sich etwas außerhalb Ihres Codes geändert haben. Es gibt mindestens 2 MTAs (einen lokalen und einen entfernten), die Ihre E-Mail stören könnten. Wenn Sie den lokalen MTA kontrollieren, dann überprüfen Sie die Warteschlange und die Protokolle, um zu sehen, ob die E-Mail weitergeleitet wird.

Aufgrund des Umfangs und der Art von Spam erfinden leider viele Leute nicht standardisierte Methoden, um damit umzugehen - RBLs, RMX, Domain Keys, Absenderkennung, bayesianische Filter..... An sich ist an diesen Ansätzen nichts auszusetzen, aber sie werden einseitig von den Dienstanbietern angewandt, oft ohne das Wissen, geschweige denn die Zustimmung der Dienstnutzer. Und die Anbieter sind in der Regel sehr verschwiegen, was die von ihnen getroffenen Vorkehrungen angeht. Aber wenn Sie an Google Mail senden, dann werden wahrscheinlich bayesähnliche Filtersysteme verwendet - HABEN SIE DEN SPAM-OFFNER GEPRÜFT?

Es ist also sehr wahrscheinlich, dass, selbst wenn die Änderung irgendwo außerhalb Ihres Einflussbereichs vorgenommen wurde, es sich nicht um eine absolute Blockade handelt, aber die Weiterleitung Ihrer Post über den Mailserver kann durchaus eine Menge Experimente erfordern.

C.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X