Symfony1 Symfony mailer:消息发送之间的Swift\u传输异常
在我目前正在工作的一个项目中,我有一个symfony任务,它运行一些海量数据插入到数据库,并运行至少半个小时。 当任务启动时,如果邮件通知发送正确,问题是在任务执行结束时,我们无法发送另一封邮件来通知处理结束 mailer工厂当前配置了假脱机传递策略,但是在这种特定情况下,我们希望使用sendNextImmediately()方法立即发出通知 我得到了一个例外: [Swift_TransportException]Symfony1 Symfony mailer:消息发送之间的Swift\u传输异常,symfony1,swiftmailer,Symfony1,Swiftmailer,在我目前正在工作的一个项目中,我有一个symfony任务,它运行一些海量数据插入到数据库,并运行至少半个小时。 当任务启动时,如果邮件通知发送正确,问题是在任务执行结束时,我们无法发送另一封邮件来通知处理结束 mailer工厂当前配置了假脱机传递策略,但是在这种特定情况下,我们希望使用sendNextImmediately()方法立即发出通知 我得到了一个例外: [Swift_TransportException] 预期响应代码为250,但得到代码“451”,消息为“451 4.4.2超时-关闭
预期响应代码为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。如果我们知道连接断开需要多长时间,那么定时器的想法是可行的,但这似乎取决于提供者。如果我觉得有什么好的,我会写一个要点(你的回答为我节省了一些时间,非常感谢):)