3

私たちの 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 には、特定のプロセスで送信できるメールの数を制限するプロセスのキューがありますか?
  • 百万ドルの質問: 例外がスローされる理由とその解決方法は? :-)

よろしくお願いします。

4

2 に答える 2

1

sendmail はメールを送信するためにどのように機能しますか?

短編小説ではありません。とにかく、sendmail プロセスの数を減らすために、smtp プロトコル経由で 127.0.0.1 (ループバック インターフェイス) のポート 25 に送信するように php を設定できます。「root が所有する」sendmail プロセスのみが作成されます。

また、confDELAY_LA、confQUEUE_LA (遅延

confDELAY_LA は、システム負荷の平均が設定された制限よりも高い場合に、新しいメールを受け入れる速度を遅くします。スクリプトの実行時間が長くなる場合があります。

confQUEUE_LA は「一度に」配信の試行をスキップします。おそらく、キュー ランナー プロセスの数を増やす必要があります。

つまり、sendmail サーバーを制限を超えてプッシュすると、標準の単純な構成で簡単に処理できると想定されます。

于 2013-03-06T12:56:03.370 に答える
1

送信される 1 つの電子メールごとに 1 つの sendmail プロセスを作成します。25_000 通の電子メールによって、コンピュータが処理するには多すぎるプロセスが作成される可能性があります。

追伸: news:comp.mail.sendmail で質問してみてください。「スパマーが困っている」質問ではないことを示す何かを追加してください。

于 2013-03-06T08:17:37.577 に答える