21 votes

Fonction php mail() douloureusement lente sur la machine de développement local

Le contexte : Si vous avez mis en place un serveur apache local à des fins de développement, vous avez peut-être rencontré le problème suivant : sendmail prend beaucoup de temps (au moins une minute) pour envoyer des e-mails. Ceci est extrêmement frustrant si vous essayez de déboguer un problème avec un email que vous avez généré.

Il existe plusieurs messages de forum sur Internet qui traitent de ce problème. Cependant, aucun thème ne décrit ce qu'il faut faire de manière suffisamment détaillée pour mes connaissances 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) modifier le fichier /etc/hosts et assurez-vous que la première ligne est la suivante :

127.0.0.1 localhost.localdomain localhost myhostname

3) modifier le fichier de configuration de sendmail ( /etc/mail/sendmail.cf dans 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 courriels ne seront pas réellement envoyés si vous ne suivez pas l'étape 5.

5) Vous devez utiliser l'option '-f' de sendmail lorsque vous utilisez la fonction de courrier. Par exemple :

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

La question que je pose à mes collègues par défaut de serveur est la suivante :

Quelles autres modifications peuvent être apportées pour que je n'aie 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 devrez modifier un module de base pour ajouter cette option.

6voto

coredump Points 12455

Je sais que ce n'est pas ce que vous demandez, mais pourquoi n'essayez-vous 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. A mon avis, sendmail est un peu dépassé et vous aurez de meilleures chances d'obtenir du support avec des MTA plus modernes.

2voto

Michael B Points 341

Cela a marché pour moi :

  • Installer postfix

Voir les instructions pour ce faire ici : https://help.ubuntu.com/community/Postfix (Il se peut qu'il soit déjà installé, et que le binaire 'sendmail' soit en fait 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

Tuez-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, par exemple un nom de domaine qui vous appartient.

1voto

Janne Pikkarainen Points 31244

Ceci peut ou non être une solution pour vous : ajoutez mail.force_extra_parameters = "-fsender@somewhere.com" à votre php.ini fichier. Il fait en sorte que PHP ajoute automatiquement -fsender@somewhere.com comme cinquième paramètre de la fonction mail() de PHP.

Cette valeur est codée en dur et n'est applicable que dans le php.ini. Elle n'est donc pas très flexible, mais elle peut peut-être vous convenir dans votre cas de développement.

0voto

tylerl Points 14785

En observant le trafic 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égler le problème à la racine.

En général, les retards dans cette fourchette sont dus à l'échec des recherches DNS, mais vous ne le saurez qu'en cherchant. Si vous ne résolvez pas le problème sous-jacent, il finira probablement par être un problème, quelle que soit la façon dont vous essayez de le contourner.

0voto

MagicAndi Points 10128

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

Dans votre fichier php.ini, vous trouverez la commande à exécuter pour envoyer un courriel (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.

Il faut généralement vérifier qu'un serveur DNS est correctement configuré sur la machine (et qu'il 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 à une adresse à laquelle le système peut se connecter.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X