Sendmail Exception atteinte lorsque des milliers d'emails ont été envoyés dans un script de messagerie en bloc. L'envoi de mailmail a-t-il une limite envoyée par courrier électronique pour un process donné?

Je suis un peu désespéré d'avoir un problème dans notre server Web. Notre site Web est une communauté avec beaucoup d'users et d'activités. Nous envoyons aux users des mails personnalisés de l'activité de leur intérêt. Nous avons un problème dans le script qui gère ces envois.

Notre script de messagerie Bulk échoue quand il y a des milliers d'emails à envoyer . Il fonctionne généralement bien, mais quand il doit envoyer des courriels plus que les courriers habituels (environ 25 000 emails), il lance une exception à plusieurs resockets:

Unable to send mail. mail(): Could not execute mail delivery program '/usr/sbin/sendmail -t -i ' 

Il est étrange que sendmail fonctionne correctement dans d'autres process tels que le server Web, et sendmail est appelé de la même manière en PHP (Zend). Sendmail échoue uniquement dans le script de messagerie en vrac PHP quand beaucoup d'emails ont déjà été envoyés sans erreurs. Lorsque la première exception est lancée, les prochains appels à sendmail échouent également . Il semble que certaines limites de queue aient été atteintes, mais seulement pour ce process!


Code de script PHP

La boucle principale scipt de messagerie en vrac PHP est exécutée plusieurs fois. Dans chaque passe passe les appels sendMail avec un $email différent et $user :

 // Sometimes, hundred thousands iterations foreach($notifications as $j => $notification){ ... $mail->setNotification($notification); $this->sendMail($mail, $user); ... } 

$this->sendmail($mail, $user) appelle la méthode interne de Zend pour l'envoi de courrier. Il appelle le courrier de méthode native PHP.

 /** * Send mail using PHP native mail() * * @access public * @return void * @throws Zend_Mail_Transport_Exception if parameters is set * but not a ssortingng * @throws Zend_Mail_Transport_Exception on mail() failure */ public function _sendMail() { ... set_error_handler(array($this, '_handleMailErrors')); // CALL TO MAIL PHP NATIVE METHOD $result = mail( $this->recipients, $this->_mail->getSubject(), $this->body, $this->header, $this->parameters); restore_error_handler(); } if ($this->_errstr !== null || !$result) { /** * @see Zend_Mail_Transport_Exception */ require_once 'Zend/Mail/Transport/Exception.php'; // HERE THE EXCEPTION IS THROWN throw new Zend_Mail_Transport_Exception('Unable to send mail. ' . $this->_errstr); } } 

Procices sendmail cours d'exécution

Voir les ps -aux | grep sendmail ps -aux | grep sendmail output lorsque la scipt en vrac fonctionne bien

 $ ps -aux | grep sendmail root 6756 0.0 0.0 62240 2468 ? Ss 18:19 0:08 sendmail: MTA: accepting connections root 25766 0.0 0.0 62668 3536 ? Ss 22:43 0:00 sendmail: MTA: ./r17Lh1fX025764 eml4.in.gr.: client DATA status root 30978 0.0 0.0 62460 2876 ? Ss 22:46 0:00 sendmail: MTA: ./r17Lk8li030976 s1.m1r3.onet.pl.: user open root 31462 0.0 0.0 62672 3536 ? Ss 22:46 0:00 sendmail: MTA: ./r17LkSIg031460 mx2.hotmail.com.: client DATA status root 31474 0.0 0.0 62672 3540 ? Ss 22:46 0:00 sendmail: MTA: ./r17LkT54031472 mx2.hotmail.com.: client DATA status root 31494 0.0 0.0 62668 4404 ? Ss 22:46 0:00 sendmail: MTA: ./r17LkUXC031492 gmail-smtp-in.l.google.com.: client RCPT root 31498 0.0 0.0 62668 3536 ? Ss 22:46 0:00 sendmail: MTA: ./r17LkUn1031496 mx4.hotmail.com.: client DATA status root 31502 0.0 0.0 62672 3536 ? Ss 22:46 0:00 sendmail: MTA: ./r17LkUti031500 mx3.hotmail.com.: client DATA status root 31506 0.0 0.0 62672 3500 ? Ss 22:46 0:00 sendmail: MTA: ./r17LkUHw031504 mx4.hotmail.com.: client RCPT root 31510 0.0 0.0 62672 3496 ? Ss 22:46 0:00 sendmail: MTA: ./r17LkUth031508 mx3.hotmail.com.: client MAIL root 31514 0.0 0.0 62668 4436 ? Ss 22:46 0:00 sendmail: MTA: ./r17LkVPb031512 gmail-smtp-in.l.google.com.: client DATA status root 31518 0.0 0.0 62460 2888 ? Ss 22:46 0:00 sendmail: MTA: ./r17LkV9o031516 mx1.hotmail.com.: client EHLO root 31522 0.0 0.0 62668 4404 ? Ss 22:46 0:00 sendmail: MTA: ./r17LkVD4031520 gmail-smtp-in.l.google.com.: client RCPT root 31526 0.0 0.0 62460 2852 ? Ss 22:46 0:00 sendmail: MTA: ./r17LkVcF031524 mx3.hotmail.com.: user open 

Lorsque le script commence à lancer des exceptions, ps -aux | grep sendmail ps -aux | grep sendmail produit presque vide, comme prévu

 $ ps -aux | grep sendmail root 6756 0.0 0.0 62240 2468 ? Ss Feb07 0:49 sendmail: MTA: accepting connections 

Quelques questions

Je suis assez novateur avec sendmail, donc j'apprécie tout type d'aide. Si vous avez besoin de plus d'informations, dites-moi.

  • En bref, comment sendmail fonctionne-t-il pour l'envoi de courrier?
  • Does sendmail a-t-il une limite de courrier à envoyer (notre server est dédié et n'a pas de ressortingctions spécifiques définies par le fournisseur d'hébergement)?
  • Does sendmail a-t-il une queue pour un process qui limite le nombre de mails pouvant être envoyés par un process donné?
  • Question de million de dollars: pourquoi l'exception est-elle lancée et comment la résoudre? 🙂

Merci d'avance pour votre aide!

3 Solutions collect form web for “Sendmail Exception atteinte lorsque des milliers d'emails ont été envoyés dans un script de messagerie en bloc. L'envoi de mailmail a-t-il une limite envoyée par courrier électronique pour un process donné?”

Lorsque vous appelez mail() en PHP sur un système basé sur Unix, il renvoie la command sendmail et transmet chaque destinataire comme argument sur la command line. Cependant, il existe une limite à la longueur des arguments que vous pouvez effectivement transmettre sur la command line ! C'est une très grande limite, 128KiB par défaut sur les systèmes Linux, mais 25 000 adresses email l'étendent largement.

Pour contourner ce problème, envoyez votre courrier dans des lots plus petits, par exemple 1 000 destinataires à la fois. Vous devriez find sortingvial de split votre gamme de destinataires en groupes de 1000 et les faire passer, mais sinon, visitez notre site de la sœur Stack Overflow pour l'aide à la programmation.

Toutefois, votre message d'erreur semble indiquer que vous n'avez pas transmis de destinataires au message. Donc, vous devriez peut-être searchr une erreur de programmation dans laquelle vous avez appelé mail() sans recipients ou avec des recipients non valides.

Lorsque vous exécutez ce script, utilisez-vous un user différent de celui que les scripts de diffusion du server Web sont exécutés? Il pourrait être quelque chose d'aussi simple que ulimit pour l'user qui exécute le script.

Tout système de messagerie est débordé de mes nombreux messages dans une courte succession. Peut-être que vous devriez vous arrêter un peu après avoir envoyé un lot de messages (disons environ 100).

Dans tous les cas, vous devriez vérifier ce que vous faites ici attentivement. Je doute beaucoup que vous ayez des milliers de messages importants pour le recyclage à envoyer en même time. Un tel comportement ne vous amènera que dans les recoins les plus profonds de toutes les lists noires de courrier électronique connues de l'humanité.

  • sendmail ne peut pas être livré au gmail - les directives d'envoi IPv6 concernant les loggings PTR ne sont pas respectées
  • erreur sendmail "Relaying refuser. Une authentification appropriée est requirejse. (état 14). "
  • Deux sendmails configurés de manière identique, l'un d'entre eux n'envoie pas de courrier
  • Postfix, basé sur le filtrage basé indépendamment pour chaque user
  • Apache, hôtes virtuels et expéditeur par défaut pour sendmail
  • Pourquoi sendmail appelle dns_getcanonname pour les domaines de non-destinataires dans l'en-tête To:?
  • Postfix arrête de ramasser les mails la nuit
  • Rediriger tous les mails vers le count local pendant le développement
  • SendMail ne fonctionne pas dans CentOs 6.4
  • Quelle est la meilleure façon de durcir un client postfix null sur un server Web php exploité?
  • La command m4 sendmail.mc échoue sans erreur
  • Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de réseau.