How to close Smtp connection in SwiftMailer How to close Smtp connection in SwiftMailer php php

How to close Smtp connection in SwiftMailer


I send mails in a loop and I was catching the Swift_TransportException and creating a new instance of Swift_Mailer but it wasn't the right fix: the problem is the transport, not the mailer. The solution is to issue an explicit call to 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 ;-)    }}

This way, Swift detects the mailer is stopped and starts it automatically, so it recovers correctly from communication errors.


There is a rude option: stop the transport explicitly. On subsequent calls of the method sendMail, SwiftMailer will check whether the transport is up (it is not, now) and start it again.IMNSHO, SwiftMailer should intercept the SMTP timeout and reconnect automatically.But, for now, this is the workaround:

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      }}


When pipe is broken $mailer->getTransport()->stop() will fail as well. And due to this error transport cannot be stopped. The workaround is

// 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);        }    }}