Question php mail () ralentit péniblement sur la machine de développement local


Arrière-plan: Si vous avez configuré un serveur Apache local à des fins de développement, vous avez peut-être rencontré un problème selon lequel sendmail prend beaucoup de temps (au moins une minute) pour envoyer des courriels. Cela est extrêmement frustrant si vous essayez de résoudre un problème avec un courrier électronique que vous avez généré.

Plusieurs messages de forum sur Internet traitent de ce problème. Cependant, aucun thème n'a décrit ce qu'il faut faire avec suffisamment de détails pour que mes connaissances soient limitées. Voici les étapes qui ont fonctionné pour moi:

1) trouvez votre nom d’hôte (au cas où vous l’auriez oublié) en utilisant cette commande:

:~$ cat /hosts/hostname

myhostname

2) éditer le fichier /etc/hosts et assurez-vous que la première ligne est la suivante:

127.0.0.1 localhost.localdomain localhost myhostname

3) éditez le fichier de configuration de sendmail ( /etc/mail/sendmail.cf dans Ubuntu) et Ne commentez pas la ligne #O HostsFile=/etc/hosts

4) Redémarrez l'ordinateur. L'ordinateur devrait démarrer beaucoup plus rapidement maintenant et la fonction mail () devrait revenir presque immédiatement. CEPENDANT, les courriels ne seront réellement envoyés que si vous suivez l’étape 5.

5) Vous devez à nouveau utiliser l'option '-f' de sendmail chaque fois que vous utilisez la fonction mail. Par exemple:

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

Ma question pour mes collègues serveurs est la suivante:

Quelles autres modifications peuvent être apportées pour que je n'ai pas à utiliser l'option sendmail -f? Bien qu'il ne soit pas très difficile d'ajouter l'option -f, cela pose un problème lorsque votre CMS (tel que Drupal) n'utilise pas l'option -f lors de l'envoi de courrier. Vous devrez pirater un module de base pour ajouter cette option.


20
2017-08-24 03:15


origine


sur mon système Ubuntu, la commande est cat /etc/hostname - zkent


Réponses:


Eh bien, je sais que ce n’est pas ce que vous demandez, mais pourquoi ne pas essayer Postfix ou Exim? Ils sont tous deux disponibles pour Ubuntu (Postfix est même le mta par défaut sur les systèmes Ubuntu) et ils fournissent tous les deux une commande "sendmail" compatible qui fonctionne très bien. IMHO sendmail est un peu daté et vous obtiendrez de meilleures chances d'assistance avec un MTA plus moderne.


6
2017-08-24 04:12



Même s'il existe de meilleurs systèmes de messagerie que sendmail, le problème est de conserver un serveur de développement qui reflète le serveur de production. sendmail est l'agent de messagerie par défaut pour php. - Michael B
Vous voulez dire le logiciel sendmail ou le binaire sendmail? Parce que Exim et Postfix ont également le sendmail binaire qui accepte les mêmes options que le sendmail d’origine, pour des raisons de compatibilité. - coredump
Je ne suis pas très fan d’Exim, mais j’ai essayé de résoudre les problèmes que nous rencontrions avec Sendmail immédiatement! - quickshiftin


Cela a fonctionné pour moi:

  • Installer postfix

Voir les instructions ici pour savoir comment procéder: https://help.ubuntu.com/community/Postfix (Il est peut-être déjà installé et le binaire 'sendmail' peut en fait être un alias pour postfix)

  • Suivez les instructions ici:

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

mkfifo /var/spool/postfix/public/pickup

Trouvez le sendmail processus

ps aux | grep mail

Tue le

kill <thepid>

Redémarrer postfix

/etc/init.d/postfix restart

Je pense que vous pouvez simplement définir le paramètre "myorigin" sur n'importe quel nom de domaine actif tel qu'un nom de domaine que vous possédez.


1
2018-01-13 05:04



Parfait! Est-ce que cela après m'a tourmenté pendant deux heures. =) - Heanz


En observant le trafic sur le réseau (pensez tcpdump) ou en exécutant un strace sur vos processus sendmail ou apache, vous devriez pouvoir vous faire une idée de Pourquoi ce délai est là pour que vous puissiez résoudre le problème racine.

Les retards dans cette plage sont généralement dus à l'échec des recherches DNS, mais vous ne le saurez pas avant d'avoir consulté. Si vous ne résolvez pas le problème sous-jacent, il s'agira probablement d'un problème, peu importe la façon dont vous essayez de le contourner.


0
2017-08-24 04:27



Le retard était dû au fait que le nom d'hôte était un mot unique plutôt qu'un nom de domaine complet (nom de domaine pleinement qualifié). En pointant sendmail vers / etc / hosts et en ayant localhost.domain comme premier nom de domaine (qui est un nom de domaine complet), il n’ya aucun retard. Cela a été corrigé aux étapes 1 à 4. Le problème restant consiste à utiliser «-f», ce qui constitue une amélioration majeure, car il faut attendre 2 minutes pour envoyer un courrier. - Michael B


Je n'ai jamais rencontré de problème d'utilisation de mail () en PHP qui ne soit pas le résultat d'un problème sur le MTA.

Dans votre fichier php.ini, il montrera quelle commande il lance pour envoyer un email (par défaut: "sendmail -t -i"). Essayez d'envoyer un email à partir de la ligne de commande en utilisant ceci - je parie que c'est lent.

Les choses habituelles à vérifier sont si un serveur DNS est configuré correctement sur la machine (et peut résoudre toutes les adresses configurées dans le MTA) et que si un relais intelligent est configuré, le nom peut être résolu en une adresse à laquelle le système peut se connecter.


0
2017-08-24 12:12





Cela peut ou peut ne pas être une solution pour vous: ajoutez mail.force_extra_parameters = "-fsender@somewhere.com" à ton php.ini fichier. Cela ajoute PHP automatiquement -fsender@somewhere.com comme cinquième paramètre de la fonction mail () de PHP.

C'est une valeur codée en dur et applicable uniquement dans php.ini, elle ne sera donc pas très flexible, mais fonctionnera peut-être dans votre cas de développement?


0
2017-08-24 12:20