4

私が現在取り組んでいる現在のプロジェクトでは、データベースへの大量のデータ挿入を実行し、少なくとも30分実行するsymfonyタスクがあります。タスクが開始されると、メール通知が正しく送信されますが、問題は、タスクの実行時に、処理の終了を通知する別のメールを送信できないことです。

メーラー ファクトリは現在、スプール配信戦略で構成されていますが、この特定の状況では、sendNextImmediately() メソッドを使用して、すぐに通知を開始したいと考えています。

私は例外を取得しています:

[Swift_TransportException]
応答コード 250 を予期していましたが、コード「451」を取得しました。メッセージは「451 4.4.2 タイムアウト - 接続を閉じています。74sm1186065wem.17」です。

およびphpログファイルに流れるエラー:

警告: fwrite(): SSL: 209 行目の /var/www/project/lib/vendor/symfony/lib/vendor/swiftmailer/classes/Swift/Transport/StreamBuffer.php の壊れたパイプ

誰でも助けてもらえますか?おそらくsymfonyメーラーを更新して新しい接続を確立する方法はありますか?

4

3 に答える 3

5

Symfony2 プロジェクトを行っているときに、私もこの失敗に遭遇しました。恒久的に実行されている php スクリプトを使用していたため、エラーが発生しました。

次のコードが機能することがわかりました。

private function sendEmailMessage($renderedTemplate, $subject, $toEmail)
    {
        $mailer = $this->getContainer()->get('mailer');
        /* @var $mailer \Swift_Mailer */
        if(!$mailer->getTransport()->isStarted()){
            $mailer->getTransport()->start();
        }
        $sendException = null;
        /* @var $message \Swift_Message */
        $message = \Swift_Message::newInstance()
            ->setSubject($subject)
            ->setFrom($this->getContainer()->getParameter('email_from'))
            ->setTo($toEmail)
            ->setBody($renderedTemplate);


        $mailer->send($message);
        $mailer->getTransport()->stop();
        //throw $sendException;
    }
于 2011-11-07T09:45:17.513 に答える
1

Symfony1 ユーザー向け

私の推測では、接続が長時間保持されていたため (アクティビティがまったくない状態で)、ssl 接続のタイムアウトが発生していました。

Swift_Transport今のところ、2 番目のメッセージを送信する直前に、インスタンスを停止して明示的に再起動することで問題を解決できます。

コードは次のとおりです。

$this->getMailer()->getRealtimeTransport()->stop();
$this->getMailer()->getRealtimeTransport()->start();
$this->getMailer()->sendNextImmediately()->send($message);
于 2011-07-04T11:16:43.347 に答える
0

私はまったく同じ問題を抱えており、上記の解決策は非常に役に立ちましたが、別の方法で実行しなければならなかったことが1つあります。

$this->getMailer()->sendNextImmediately()->send($message);
$this->getMailer()->getRealtimeTransport()->stop();

メッセージを送信する前にトランスポートを停止しようとしてもうまくいきませんでした (接続タイムアウトは既にハングしていました)。また、getRealtimeTransport()->start() を実行する必要はありません。自動的に開始されます。

于 2012-08-24T11:49:47.313 に答える