php mail () funktioniert auf der lokalen Entwicklungsmaschine nur langsam

21

Hintergrund: Wenn Sie einen lokalen Apache-Server für Entwicklungszwecke eingerichtet haben, tritt möglicherweise ein Problem auf, bei dem das Senden von E-Mails durch sendmail viel Zeit in Anspruch nimmt (mindestens eine Minute). 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 behandeln. In keinem der Themen wurde jedoch detailliert genug beschrieben, was ich tun sollte, um nur begrenzte Kenntnisse zu haben. Hier sind die Schritte, die für mich gearbeitet haben:

1) Finden Sie Ihren Hostnamen (falls Sie ihn vergessen haben) mit diesem Befehl:

:~$ cat /hosts/hostname

myhostname

2) Bearbeiten Sie die Datei /etc/hostsund stellen Sie sicher, dass die erste Zeile die folgende ist:

127.0.0.1 localhost.localdomain localhost myhostname

3) Bearbeiten Sie die sendmail-Konfigurationsdatei ( /etc/mail/sendmail.cfin Ubuntu) und kommentieren Sie die Zeile aus#O HostsFile=/etc/hosts

4) Starten Sie den Computer neu. Der Computer sollte jetzt viel schneller starten und die mail () - Funktion sollte fast sofort wieder verfügbar sein. Die E-Mails werden jedoch erst gesendet, wenn Sie Schritt 5 befolgen.

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

mail('[email protected]', 'the subject', 'the message', null, '[email protected]');

Meine Frage an meine Serverfehlerkollegen lautet:

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

Michael B
quelle
1
Auf meinem Ubuntu-System lautet der Befehlcat /etc/hostname
zkent

Antworten:

6

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

Core-Dump
quelle
Auch wenn es bessere Mailsysteme als sendmail gibt, besteht das Problem darin, einen Entwicklungsserver zu warten, der den Produktionsserver widerspiegelt. sendmail ist der Standard-Mail-Agent für PHP.
Michael B
1
Du meinst sendmail die Software oder sendmail die Binärdatei? Weil Exim und Postfix sendmailaus Kompatibilitätsgründen auch Binärdateien haben, die dieselben Optionen wie das ursprüngliche sendmail akzeptieren.
Coredump
Ich bin kein großer Fan von Exim aus früheren Erfahrungen, aber habe Postfix ausprobiert und die Probleme, die mit Sendmail auftreten, sofort gelöst!
Quickshiftin
2

Das hat bei mir funktioniert:

  • Postfix installieren

Eine Anleitung dazu finden Sie hier: https://help.ubuntu.com/community/Postfix (Möglicherweise ist es bereits installiert, und die 'sendmail'-Binärdatei ist möglicherweise ein Alias ​​für Postfix.)

  • Befolgen Sie die Anweisungen hier:

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

mkfifo /var/spool/postfix/public/pickup

Finden Sie den sendmailProzess

ps aux | grep mail

Töte es

kill <thepid>

Neustart postfix

/etc/init.d/postfix restart

Ich denke, Sie können den Parameter "myorigin" einfach auf einen beliebigen aktiven Domainnamen setzen, z. B. auf einen Domainnamen, den Sie besitzen.

Michael B
quelle
Perfekt! Hat mich das NACH zwei Stunden geplagt? =)
Hannes Schneidermayer
1

Dies kann eine Lösung für Sie sein oder auch nicht: Fügen Sie mail.force_extra_parameters = "[email protected]"sie Ihrer php.ini- Datei hinzu. PHP hängt automatisch [email protected] als fünften Parameter an die mail () - Funktion von PHP an.

Das ist ein fest codierter Wert, der nur in der php.ini verfügbar ist, also nicht sehr flexibel ist, aber vielleicht für Sie in Ihrem Entwicklungsfall funktioniert?

Janne Pikkarainen
quelle
0

Indem Sie den Netzwerkverkehr beobachten (think tcpdump) oder einen straceIhrer sendmail- oder apache-Prozesse ausführen, sollten Sie in der Lage sein, eine Vorstellung davon zu bekommen, warum diese Verzögerung vorliegt, damit Sie das Root-Problem beheben können.

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

tylerl
quelle
1
Die Verzögerung wurde dadurch verursacht, dass der Hostname ein einzelnes Wort und kein vollqualifizierter Domänenname war. Wenn Sie sendmail auf / etc / hosts verweisen und localhost.domain als ersten Domainnamen verwenden (dies ist ein vollqualifizierter Domänenname), tritt keine Verzögerung auf. Dies wurde in den Schritten 1-4 behoben. Das verbleibende Problem ist die Verwendung von '-f' - eine wesentliche Verbesserung, da Sie 2 Minuten warten müssen, um E-Mails zu senden.
Michael B
0

Ich bin noch nie auf ein Problem mit mail () in PHP gestoßen, das nicht auf ein Problem im MTA zurückzuführen 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 über die Befehlszeile zu senden - ich wette, es ist langsam.

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

symcbean
quelle