Symfony1 Symfony mailer:消息发送之间的Swift\u传输异常

Symfony1 Symfony mailer:消息发送之间的Swift\u传输异常,symfony1,swiftmailer,Symfony1,Swiftmailer,在我目前正在工作的一个项目中,我有一个symfony任务,它运行一些海量数据插入到数据库,并运行至少半个小时。 当任务启动时,如果邮件通知发送正确,问题是在任务执行结束时,我们无法发送另一封邮件来通知处理结束 mailer工厂当前配置了假脱机传递策略,但是在这种特定情况下,我们希望使用sendNextImmediately()方法立即发出通知 我得到了一个例外: [Swift_TransportException] 预期响应代码为250,但得到代码“451”,消息为“451 4.4.2超时-关闭

在我目前正在工作的一个项目中,我有一个symfony任务,它运行一些海量数据插入到数据库,并运行至少半个小时。 当任务启动时,如果邮件通知发送正确,问题是在任务执行结束时,我们无法发送另一封邮件来通知处理结束

mailer工厂当前配置了假脱机传递策略,但是在这种特定情况下,我们希望使用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 mailer以建立新连接?

适用于Symfony1用户 我的猜测是连接被保持的时间太长(根本没有活动),导致ssl连接超时

目前,可以通过停止
Swift_Transport
实例并在发送第二条消息之前再次显式启动它来解决问题

代码如下:

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

在做一个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;
    }

我遇到了完全相同的问题,上述解决方案非常有用,但有一件事我必须做得不同:顺序

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

如果我在发送消息之前试图停止传输,这对我来说不起作用(连接超时已经挂起)。另外,您不需要运行getRealtimeTransport()->start()-它将自动启动。

能否显示正在使用的代码并发送第二条消息。您正在创建一个新的swiftmailer实例,对吗?@Tom每条消息的代码都非常相似:$message=$this->getMailer()->compose()$message->setFrom(sfConfig::get('app\u notifications\u from\u address')、sfConfig::get('app\u notifications\u from\u address\u name')$message->setTo(sfConfig::get('app\u notifications\u to\u error\u support\u address')$message->setBody($html,'text/html')$这->getMailer()->sendNextImmediately()->send($message);我遗漏了什么吗?好的,看起来你解决了。这或多或少就是我想要的。。。停止/启动或创建一个新实例。非常棒的回复@stoefln。但是,这对性能有重大影响。如果保持连接,我可以发送
1封电子邮件/2.4s
,而如果每次使用您的脚本关闭连接,我可以发送
1封电子邮件/5.1s
。也许一个好主意是设置一个计时器。你知道一个连接需要多长时间才能超时吗,比如gmail?@Patt你是对的。不幸的是,我不知道如何设置计时器:/我们切换到打开连接发送一堆电子邮件,然后关闭。这是一个好主意@stoefln。如果我们知道连接断开需要多长时间,那么定时器的想法是可行的,但这似乎取决于提供者。如果我觉得有什么好的,我会写一个要点(你的回答为我节省了一些时间,非常感谢):)