私たちの Web サーバーに問題があり、少し困っています。私たちのウェブは、多くのユーザーと活動を持つコミュニティです。当社は、ユーザーの関心のある活動に関するパーソナライズされたメールをユーザーに送信します。これらのメールを処理するスクリプトに問題があります。
送信するメールが数千件ある場合、一括メール スクリプトは失敗します。通常は正常に動作しますが、通常よりも多くのメール (約 25.000 通のメール) を送信する必要がある場合、繰り返し例外をスローします。
Unable to send mail. mail():
Could not execute mail delivery program '/usr/sbin/sendmail -t -i '
奇妙なことに、 sendmail は Web サーバーなどの他のプロセスでは正常に動作し、PHP (Zend) でも同じように sendmail が呼び出されます。Sendmail は、大量の電子メールがエラーなしで既に送信されている場合にのみ、PHP バルク メール スクリプトで失敗します。最初の例外がスローされると、sendmail への次の呼び出しも失敗します。キューの制限に達したように見えますが、これはこのプロセスのみです!
PHPスクリプトのコード
PHP バルク メール スクリプトのメイン ループは、何千回も実行されます。$email
各ループ パスでは、異なるandを使用して sendMail を呼び出します$user
。
// Sometimes, hundred thousands iterations
foreach($notifications as $j => $notification){
...
$mail->setNotification($notification);
$this->sendMail($mail, $user);
...
}
$this->sendmail($mail, $user)
メールを送信するための Zend 内部メソッドを呼び出します。PHP ネイティブ メソッドmailを呼び出します。
/**
* Send mail using PHP native mail()
*
* @access public
* @return void
* @throws Zend_Mail_Transport_Exception if parameters is set
* but not a string
* @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);
}
}
sendmail
実行中のプロセス
ps -aux | grep sendmail
バルク メール スクリプトが正常に動作している場合の出力を確認します。
$ 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
スクリプトが例外のスローを開始するps -aux | grep sendmail
と、予想どおり、出力はほとんど空になります
$ ps -aux | grep sendmail
root 6756 0.0 0.0 62240 2468 ? Ss Feb07 0:49 sendmail: MTA: accepting connections
いくつかの質問
私はsendmailの初心者なので、どんな種類の助けにも感謝します. さらに情報が必要な場合は、教えてください。
- 簡単に言うと、sendmail はどのようにメールを送信するのでしょうか?
- sendmail には送信するメールの制限がありますか (私たちのサーバーは専用であり、ホスティングプロバイダーによって設定された特定の制限はありません)?
- sendmail には、特定のプロセスで送信できるメールの数を制限するプロセスのキューがありますか?
- 百万ドルの質問: 例外がスローされる理由とその解決方法は? :-)
よろしくお願いします。