Frage php mail () funktioniert schmerzhaft langsam auf der lokalen Entwicklungsmaschine


Hintergrund: Wenn Sie einen lokalen Apache-Server für Entwicklungszwecke eingerichtet haben, ist möglicherweise das Problem aufgetreten, dass sendmail lange braucht (mindestens eine Minute), um E-Mails zu senden. Dies ist äußerst frustrierend, wenn Sie versuchen, ein Problem mit einer von Ihnen generierten E-Mail zu beheben.

Es gibt mehrere Forenbeiträge im Internet, die dieses Problem diskutieren. Allerdings hat keines der Themen beschrieben, was zu tun ist, um mein begrenztes Wissen zu vertiefen. Hier sind die Schritte, die für mich funktionierten:

1) finde deinen Hostnamen (falls du es vergessen hast) mit diesem Befehl:

:~$ cat /hosts/hostname

myhostname

2) Bearbeiten Sie die Datei /etc/hosts und stelle sicher, dass die erste Zeile folgende ist:

127.0.0.1 localhost.localdomain localhost myhostname

3) Bearbeiten Sie die sendmail-Konfigurationsdatei ( /etc/mail/sendmail.cf in Ubuntu) und Kommentar abmelden #O HostsFile=/etc/hosts

4) Starten Sie den Computer neu. Der Computer sollte jetzt viel schneller hochfahren und die Funktion mail () sollte fast sofort zurückkehren. JEDOCH werden die E-Mails nicht gesendet, außer Sie folgen Schritt 5.

5) Sie müssen die Option sendmail '-f' verwenden, wenn Sie die Mail-Funktion verwenden. Zum Beispiel:

mail('recipient@somewhere.com', 'the subject', 'the message', null, '-fsender@somewhere.com');

Meine Frage für meine Kollegen Serverfaulter ist:

Welche weiteren Änderungen können vorgenommen werden, damit ich die Option sendmail -f nicht verwenden muss? Obwohl es nicht sehr schwer ist, die Option -f hinzuzufügen, ist es ein Problem, wenn Ihr CMS (z. B. Drupal) beim Senden von E-Mails nicht die Option -f verwendet. Sie müssten ein Kernmodul hacken, um diese Option hinzuzufügen.


20
2017-08-24 03:15


Ursprung


auf meinem Ubuntu-System ist der Befehl cat /etc/hostname - zkent


Antworten:


Nun, ich weiß, dass Sie das nicht fragen, aber warum Sie nicht Postfix oder Exim ausprobieren? Sie sind beide für Ubuntu verfügbar (Postfix ist sogar die Standard-Mta auf Ubuntu-Systemen) und beide bieten einen kompatiblen "Sendmail" -Befehl, der sehr gut funktioniert. IMHO sendmail ist irgendwie veraltet und Sie werden bessere Chancen auf Unterstützung mit moderner MTA bekommen.


6
2017-08-24 04:12



Selbst wenn es bessere Mail-Systeme als sendmail gibt, besteht das Problem darin, einen Entwicklungsserver zu betreiben, der den Produktionsserver spiegelt. sendmail ist der Standard-Mail-Agent für PHP. - Michael B
Sie meinen, sendmail die Software oder sendmail die Binärdatei? Weil Exim und Postfix auch die sendmail binary, das aus Kompatibilitätsgründen die gleichen Optionen wie das ursprüngliche sendmail akzeptiert. - coredump
Ich bin kein großer Fan von Exim aus vergangenen Erfahrungen, habe Postfix aber einen Versuch gegeben und die Probleme, die wir mit Sendmail haben, sofort gelöst! - quickshiftin


Das hat für mich funktioniert:

  • Installieren Sie Postfix

Sehen Sie die Anweisungen hier, um dies hier zu tun: https://help.ubuntu.com/community/Postfix (Es kann bereits installiert sein, und die 'sendmail' binary kann tatsächlich ein Alias ​​für Postfix sein)

  • Folgen Sie den Anweisungen hier:

http://lenss.nl/2009/01/making-php-mail-work-on-ubuntu-thrun-postfix/

mkfifo /var/spool/postfix/public/pickup

Finde das sendmail verarbeiten

ps aux | grep mail

Töte es

kill <thepid>

Neustart postfix

/etc/init.d/postfix restart

Ich denke, Sie können den Parameter 'myorigin' nur auf einen beliebigen aktiven Domainnamen setzen, beispielsweise auf einen Domainnamen, den Sie besitzen.


1
2018-01-13 05:04



Perfekt! Hat mich nach zwei Stunden geplagt. =) - Heanz


Indem ich den Netzwerkverkehr beobachte (denke tcpdump) oder durch Ausführen eines strace Auf Ihren Sendmail- oder Apache-Prozessen sollten Sie sich ein Bild davon machen können Warum Diese Verzögerung ist da, damit Sie das Grundproblem beheben können.

Normalerweise sind Verzögerungen in diesem Bereich auf fehlgeschlagene DNS-Lookups zurückzuführen, aber Sie werden es nicht wissen, bis Sie es sehen. Wenn Sie das zugrunde liegende Problem nicht beheben, wird es wahrscheinlich ein Problem sein, egal wie Sie versuchen, es zu umgehen.


0
2017-08-24 04:27



Die Verzögerung wurde dadurch verursacht, dass der Hostname ein einzelnes Wort und kein vollqualifizierter Domänenname (FQDN) war. Wenn Sie sendmail auf / etc / hosts verweisen und localhost.domain als ersten Domänennamen haben (was ein FQDN ist), gibt es keine Verzögerung. Dies wurde in den Schritten 1-4 behoben. Das verbleibende Problem ist die Verwendung von '-f' - immer noch eine große Verbesserung, wenn man 2 Minuten warten muss, um eine Mail zu senden. - Michael B


Ich bin nie auf ein Problem mit mail () in PHP gestoßen, das nicht das Ergebnis eines Problems auf dem MTA war.

In Ihrer php.ini-Datei wird angezeigt, welcher Befehl zum Senden einer E-Mail ausgeführt wird (Standard: "sendmail -t -i"). Versuchen Sie, eine E-Mail von der Befehlszeile mit diesem zu senden - ich wette, es ist langsam.

Zu prüfen ist, ob ein DNS-Server auf dem Computer korrekt konfiguriert ist (und alle im MTA konfigurierten Adressen auflösen kann). Wenn ein Smart-Relay konfiguriert ist, kann der Name auf eine Adresse aufgelöst werden, mit der das System eine Verbindung herstellen kann.


0
2017-08-24 12:12





Dies kann oder kann nicht eine Lösung für Sie sein: hinzufügen mail.force_extra_parameters = "-fsender@somewhere.com" zu deinem php.ini Datei. Es macht PHP automatisch anhängen -fsender@irgendwo.com als fünfter Parameter der PHP-Funktion mail ().

Das ist ein hartcodierter Wert und nur in php.ini anwendbar, also wird es nicht sehr flexibel sein, aber vielleicht funktioniert es für Sie in Ihrem Entwicklungsfall?


0
2017-08-24 12:20