如何关闭SwiftMailer SMTP连接(How to close Smtp connectio

2019-07-03 14:42发布

我用SwiftMailer从Gearman的工作进程发送电子邮件。 我使用Swift_SmtpTransport类来发送电子邮件。

问题是,如果这个工作进程保持闲置了一段时间,在SwiftMailer SMTP连接超时。 现在,下一个作业到达时,SwiftMailer无法发送电子邮件的连接已超时。

理想情况下,我会想关闭每次作业后的SMTP连接。 我无法在做到这一点特别是类定位的API。 也不对unset()对象的工作,因为这是一个静态类。

Answer 1:

有一个粗鲁的选项:明确停止运输。 在方法的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  
    }

}


Answer 2:

我在一个循环中发送邮件,我被抓了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 ;-)
    }
}

这样一来,斯威夫特检测邮包停止并自动启动它,所以它从通信错误恢复正常。



Answer 3:

同时发送大量使用SwiftMailer和AWS SES电子邮件我得到的Symfony2命令行相同的异常。

我可以开始每次停止传输层解决我的问题。 请看我的博客文章了解详情: http://www.prowebdev.us/2013/06/swiftmailersymfony2-expected-response.html



Answer 4:

当管道被打破$ 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);
        }
    }
}


Answer 5:

我正在使用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);
}


文章来源: How to close Smtp connection in SwiftMailer