16

SwiftMailer を使用して、ギアマン ワーカー プロセスからメールを送信します。クラスを使用してSwift_SmtpTransportメールを送信しています。

問題は、このワーカー プロセスがアイドル状態のままであると、SwiftMailer smtp 接続がタイムアウトすることです。次のジョブが到着すると、接続がタイムアウトしたため、SwiftMailer はメールの送信に失敗します。

理想的には、すべてのジョブの後に smtp 接続を閉じたいと思います。これを具体的に行うクラス内のAPIを見つけることができません。unset()これは静的クラスであるため、オブジェクトも機能しません。

4

4 に答える 4

11

ループでメールを送信し、 をキャッチしSwift_TransportExceptionて新しいインスタンスを作成してSwift_Mailerいましたが、正しい修正ではありませんでした。問題はtransportであり、mailerではありません。解決策は、への明示的な呼び出しを発行することSwift_SmtpTransport::stop()です。

foreach($recipients as $to => $body){
    try{
        $message->setTo($to);
        $message->setBody(body);
        $mailer->send($message);
    }catch(Swift_TransportException $e){
        $mailer->getTransport()->stop();
        sleep(10); // Just in case ;-)
    }
}

このように、Swift はメーラーが停止していることを検出して自動的に開始するため、通信エラーから正しく回復します。

于 2014-03-25T08:40:57.680 に答える
0

SwiftmailerとAWSSESを使用して無限ループでワーカーを実行しています。エラーが発生していました。

Expected response code 250 but got code "421", with message "421 Timeout waiting for data from client.

私のスクリプトの解決策:

$love = true;
while($love) {
    $message = Message::to($record->to)
        ->from(array('no-reply@clouddueling.com' => $user->name()))
        ->reply(array($user->email => $user->name()))
        ->subject($record->subject)
        ->body($body->value)
        ->html(true)
        ->send();

    if (! $message->was_sent())
        throw new Swift_TransportException($errstr . ': ' . $errno);
}
于 2013-02-04T17:45:37.870 に答える