php mail () fonctionne douloureusement lentement sur une machine de développement locale

21

Contexte: Si vous avez configuré un serveur Apache local à des fins de développement, vous pouvez avoir rencontré le problème où sendmail prend beaucoup de temps (au moins une minute) pour envoyer des e-mails. Cela est extrêmement frustrant si vous essayez de déboguer un problème avec un e-mail que vous avez généré.

Il existe plusieurs messages de forum sur Internet qui traitent de ce problème. Cependant, aucun thème n'a décrit quoi faire avec suffisamment de détails pour ma connaissance limitée. 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) éditez le fichier /etc/hostset 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.cfdans Ubuntu) et décommentez 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 e-mails ne seront réellement envoyés que si vous suivez l'étape 5.

5) Vous devez à nouveau utiliser l'option «-f» de sendmail lorsque vous utilisez la fonction de messagerie. Par exemple:

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

Ma question pour mes confrères serveurs est:

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

Michael B
la source
1
sur mon système Ubuntu, la commande estcat /etc/hostname
zkent

Réponses:

6

Eh bien, je sais que ce n'est pas ce que vous demandez, mais pourquoi vous n'essayez pas 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 deux une commande «sendmail» compatible qui fonctionne très bien. IMHO sendmail est un peu daté et vous obtiendrez de meilleures chances de support avec un MTA plus moderne.

coredump
la source
Même s'il existe de meilleurs systèmes de messagerie que sendmail, le problème est de maintenir 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
1
Vous voulez dire sendmail le logiciel ou sendmail le binaire? Parce qu'Exim et Postfix ont également le sendmailbinaire qui accepte les mêmes options que le sendmail d'origine, pour des questions de compatibilité.
coredump
Je ne suis pas un grand fan d'Exim par le passé, mais j'ai essayé Postfix et résolu les problèmes w / e que nous rencontrions avec Sendmail immédiatement!
quickshiftin
2

Cela a fonctionné pour moi:

  • Installer le suffixe

Voir les instructions ici sur la façon de le faire ici: https://help.ubuntu.com/community/Postfix (Il peut déjà être 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 sendmailprocessus

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.

Michael B
la source
Parfait! Est-ce que cela APRÈS me tourmenter pendant deux heures. =)
Hannes Schneidermayer
1

Cela peut ou non être une solution pour vous: ajoutez mail.force_extra_parameters = "[email protected]"à votre fichier php.ini . Cela fait que PHP ajoute automatiquement [email protected] comme cinquième paramètre à la fonction mail () de PHP.

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

Janne Pikkarainen
la source
0

En observant le trafic réseau (pensez tcpdump) ou en exécutant un stracesur vos processus sendmail ou apache, vous devriez pouvoir avoir une idée de la raison de ce retard afin de pouvoir résoudre le problème racine.

Habituellement, les retards dans cette plage sont dus à l'échec des recherches DNS, mais vous ne le saurez pas avant de regarder. À moins que vous ne résolviez le problème sous-jacent, il finira probablement par être un problème, peu importe la façon dont vous essayez de le contourner.

tylerl
la source
1
Le retard était dû au fait que le nom d'hôte était un mot unique plutôt qu'un FQDN (nom de domaine complet). 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'y a pas de retard. Ce problème a été résolu dans les étapes 1 à 4. Le problème restant est d'utiliser «-f» - encore une amélioration majeure par rapport à l'attente de 2 minutes pour envoyer du courrier.
Michael B
0

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

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

Les éléments habituels à vérifier sont de savoir si un serveur DNS est correctement configuré 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.

symcbean
la source