我用SwiftMailer从Gearman的工作进程发送电子邮件。 我使用Swift_SmtpTransport
类来发送电子邮件。
问题是,如果这个工作进程保持闲置了一段时间,在SwiftMailer SMTP连接超时。 现在,下一个作业到达时,SwiftMailer无法发送电子邮件的连接已超时。
理想情况下,我会想关闭每次作业后的SMTP连接。 我无法在做到这一点特别是类定位的API。 也不对unset()
对象的工作,因为这是一个静态类。
我用SwiftMailer从Gearman的工作进程发送电子邮件。 我使用Swift_SmtpTransport
类来发送电子邮件。
问题是,如果这个工作进程保持闲置了一段时间,在SwiftMailer SMTP连接超时。 现在,下一个作业到达时,SwiftMailer无法发送电子邮件的连接已超时。
理想情况下,我会想关闭每次作业后的SMTP连接。 我无法在做到这一点特别是类定位的API。 也不对unset()
对象的工作,因为这是一个静态类。
有一个粗鲁的选项:明确停止运输。 在方法的Sendmail的后续调用,SwiftMailer将检查运输是否已启动(它不是,现在),并再次启动它。 IMNSHO,SwiftMailer应该拦截SMTP超时和重新连接automatically.But,就目前而言,这是解决方法:
function sendMail($your_args) {
try{
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance('Wonderful Subject')
->setFrom(array('john@doe.com' => 'John Doe'))
->setTo(array('receiver@domain.org', 'other@domain.org' => 'A name'))
->setBody('Here is the message itself');
$result = $mailer->send($message);
$mailer->getTransport()->stop();
} catch (Swift_TransportException $e) {
//this should be caught to understand if the issue is on transport
} catch (Exception $e) {
//something else happened
}
}
我在一个循环中发送邮件,我被抓了Swift_TransportException
并创建一个新的实例Swift_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 ;-)
}
}
这样一来,斯威夫特检测邮包停止并自动启动它,所以它从通信错误恢复正常。
同时发送大量使用SwiftMailer和AWS SES电子邮件我得到的Symfony2命令行相同的异常。
我可以开始每次停止传输层解决我的问题。 请看我的博客文章了解详情: http://www.prowebdev.us/2013/06/swiftmailersymfony2-expected-response.html
当管道被打破$ mailer-> getTransport() - >停止()也将失败。 而由于这个错误运输不能停止。 解决方法是
// Let's try to send an email.
$tries = 3;
while ($tries--) {
try {
$sent = $this->mailer->send($message);
break;
} catch (\Exception $e) {
// Connection problems
// @see https://github.com/swiftmailer/swiftmailer/issues/490
try {
// Try to stop
$this->mailer->getTransport()->stop();
} catch (\Exception $e) {
// Got Exception while stopping transport.
// We have to set _started to 'false' manually, because due to an exception it is 'true' now.
$t = $this->mailer->getTransport();
$reflection = new \ReflectionClass($t);
$prop = $reflection->getProperty('_started');
$prop->setAccessible(true);
$prop->setValue($t, false);
$prop->setAccessible(false);
}
}
}
我正在使用Swiftmailer和AWS SES我得到了错误的无限循环工人:
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);
}