2009-09-14 11 views
3

J'utilise la fonction PHP mail() pour envoyer des emails à partir d'un serveur Linux, mais en utilisant Exchange comme MTA principal. Pour ce faire, sendmail a été configuré pour tout relayer au serveur Exchange local, qui envoie ensuite les emails.Délai d'utilisation de la fonction PHP mail() pour envoyer des emails via Exchange (en utilisant sendmail comme relais)

Cela fonctionne correctement, mais le script PHP semble attendre jusqu'à la limite de délai avant de terminer. Je pensais peut-être qu'il attend une réponse de sendmail, ce qui ne vient pas, c'est juste un relais? J'ai spécifié l'option de ligne de commande php.ini pour "sendmail_path" -odb, qui devrait lancer sendmail avec le mode de livraison "background", c'est-à-dire déclencher un envoi de courriels dans un processus séparé, puis revenir immédiatement. Mais il faut encore 30 secondes pour que le script PHP se termine.

Vous avez des idées? Je suis un peu perplexe. Merci.

+1

essayez de demander sur serverfault.com // ce n'est pas strictement lié à la programmation, je ne pense pas que ce soit quelque chose de votre programmation qui échoue. –

+1

il devrait être programmé contrôlé parce que le manuscrit ne reconnaît pas le sendmail est complet et expire. peut-être avec un code contextuel/exemple de code que nous pourrions aider plus loin. –

Répondre

-1

Si c'est une aide mon sendmail_path ressemble à ceci:

sendmail_path = /usr/sbin/sendmail -t -i 
1

Une solution indirecte. Ce que nous faisons est d'utiliser le système de php() pour envoyer des emails en arrière-plan afin que l'utilisateur n'ait pas à attendre que l'email soit envoyé.

quelque chose comme ça ...

<?php //sendEmail.php 
mail($argv[1], $argv[2], $argv[3]); 
?> 

votre script:

<?php 
... 
system("php sendEmail.php [email protected] 'subject' 'message' 1>/dev/null 2>&1 &"); 
... 
?> 
0

Une autre solution pourrait être d'utiliser Mail de PEAR. Je l'ai utilisé pour envoyer des emails à qmail et aux serveurs SMTP Exchange. Je ne peux pas en dire beaucoup sans regarder les journaux de php/courrier.

1

Mais pourquoi n'envoyez-vous pas PHP directement à votre MTA de votre choix? il suffit d'utiliser une bibliothèque comme PHPMailer et l'authentification sera facile. Vous pouvez aussi installer postfix (sous linux avec un gestionnaire de paquets prend 3 secondes) et le configurer comme relais, les journaux Postfix sont assez étendus en mode verbeux et vous pourriez découvrir si sendmail était votre goulot d'étranglement.

0

-odb a été déprécié (sendmail version 8.7 et suivantes). 1
Pensez à utiliser -ODeliveryMode=b (pour la ligne de commande sendmail ou le réglage sendmail_path)
Ou ajouter O DeliveryMode=b dans les paramètres supplémentaires de la fonction PHP mail. 2

0

J'avais un similar question. Dans mon cas, l'équipe d'infrastructure avait ajouté un retard artificiel de 30 secondes. Je pense que c'est en fait plus comme un paramètre d'attendre la confirmation que l'email a été envoyé qui par défaut attend 30 secondes que quelqu'un fixant arbitrairement un délai de 30 secondes arbitrairement. Peu importe, on dirait que vous êtes dans le même bateau. Vérifiez auprès de la personne qui gère le serveur Exchange, dites-leur ce qui se passe et voyez s'ils peuvent repérer le paramètre. Dans mon cas, j'ai dû enregistrer ce qui se passait avec Wireshark avant de convaincre l'équipe qu'il y avait un problème avec Exchange et pas avec mon application.