2016-10-25 20 views
0

Я разрабатываю веб-приложение на основе структуры silex с приличной функциональностью Mail. Отправка почты отлично работает с базовой конфигурацией и установленным соединением с почтовым сервером. В случае ошибок, например. из-за потери соединения, я хочу регистрировать причины и препятствовать их отправке клиенту. Но я не могу уловить ошибки почтовой программы, особенно исключение Swift_TransportException. Я инкапсулировал вызов функции «отправить», а также добавил обработчик ошибок, оба без успеха. Это ошибка, или я что-то пропустил?Silex Swiftmailer Swift_TransportException unatchable

Обработчик:

$app->error(function (\Swift_TransportException $e, Request $request, $code) { 
     //TODO log 
    }); 

Использование функции отправки:

 try{ 
      $message = \Swift_Message::newInstance() 
       ->setSubject($mail->getSubject()) 
       ->setFrom($mail->getFrom()) 
       ->setTo($mail->getTo()) 
       ->setBody($mail->getBody()); 

      $app['mailer']->send($message); 
     } 
     catch(\Swift_TransportException $exception) 
     { 
      //TODO log 
     } 

ответ

1

Я нашел решение моей проблемы в этом посте:

silex-swiftmailer-not-making-smtp-connection-upon-execution

Для подведите итог, проблема была вызвана поведением поведенческого поведения swiftmaile r в силексе. По умолчанию письма не отправляются непосредственно во время выполнения кода, а буферизируются и отправляются после того, как результат запроса возвращается клиенту. Поэтому ошибки не попадают в блок try. Чтобы изменить это поведение, я добавил слегка измененный код из указанной ссылки в мою регистрацию.

$app->register(new Silex\Provider\SwiftmailerServiceProvider()); 
$app['mailer'] = new \Swift_Mailer($app['swiftmailer.transport']); 

спасибо igor за хорошее объяснение.