我正在使用Gmail帐户作为主机开发一个简单的邮件应用程序。它就像一个魅力,但当send()函数抛出异常时问题就出现了。 我看到try catch语句无法处理异常。 即使我使用Global异常类,它也不起作用。 这个问题也在某个地方讨论过。
例如:
Catch swiftmailer exception in Symfony2 dev env controller
或
https://groups.google.com/forum/#!topic/symfony2/SlEzg_PKwJw
但他们没有得到正确的答案。
我的控制器功能代码是:
public function ajaxRegisterPublisherAction()
{
//some irrelevant logic
$returns= json_encode(array("username"=>$username,"responseCode"=>$responseCode));
try{
$message = \Swift_Message::newInstance()
->setSubject('hello world')
->setFrom('jafarzadeh91@gmail.com')
->setTo('jafarzadeh991@yahoo.com')
->setBody(
$this->renderView('AcmeSinamelkBundle:Default:email.txt.twig',array('name'=>$username,"password"=>$password))
);
$this->container->get("mailer")->send($message);
}
catch (Exception $e)
{
}
return new \Symfony\Component\HttpFoundation\Response($returns,200,array('Content-Type'=>'application/json'));
}
我在firebug控制台中收到的上述代码发送的响应是:
{"username":"xzdvxvvcvxcv","responseCode":200}<!DOCTYPE html>
<html>
.
.
Swift_TransportException: Connection could not be established with host smtp.gmail.com [Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP?]
.
.
</html>
我抓住了我的头发,因为我不知道为什么内核在继续我的json对象时处理异常?
当我评论这一行时:
$this->container->get("mailer")->send($message);
异常没有发生,我在客户端有一个有效的json。(这当然是重要的)
我将Exception
更改为\Exception
或\Swift_TransportException
甚至Swift_TransportException
!但没有好结果。
答案 0 :(得分:3)
执行$this->container->get("mailer")->send($message);
时,如果您已打开假脱机,则此时不会发送电子邮件。见http://symfony.com/doc/current/cookbook/email/spool.html
如果您的默认设置为spool: { type: memory }
,则在您的控制器退出后,在内核终止阶段将抛出\Swift_TransportException
。
解决此问题的一种方法是关闭假脱机(但是您的用户可能必须在发送电子邮件时等待),或者您可以创建自己的事件监视器来处理异常。 http://symfony.com/doc/current/cookbook/service_container/event_listener.html
答案 1 :(得分:1)
你需要在发回异常之前击败事件调度员,所以听听这些事件并让他们保持沉默,不过我认为这是一个很糟糕的处理方式
class SuchABadRequest implements \Swift_Events_TransportExceptionListener{
/**
* Invoked as a TransportException is thrown in the Transport system.
*
* @param \Swift_Events_TransportExceptionEvent $evt
*/
public function exceptionThrown(\Swift_Events_TransportExceptionEvent $evt)
{
$evt->cancelBubble();
try{
throw $evt->getException();
}catch(\Swift_TransportException $e){
print_r($e->getMessage());
}
}
}
控制器内的
$mailer = $this->get('mailer');
$mailer->registerPlugin(new SuchABadRequest());