8

我正在开发一个使用 Gmail 帐户作为主机的简单邮件应用程序。它的工作原理很吸引人,但是当 send() 函数抛出异常时问题就出现了。我看到 try catch 语句无法处理异常。即使我使用全局异常类,它也不起作用。这个问题也在某处讨论过。

例如 :

在 Symfony2 开发环境控制器中捕获 swiftmailer 异常

或者

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 对象的 continue 中处理异常?

当我评论这一行时:

 $this->container->get("mailer")->send($message);

没有发生异常,我在客户端有一个有效的 json。(这是理所当然的)我Exception改为\Exceptionor\Swift_TransportException甚至Swift_TransportException!但没有好的结果。

4

2 回答 2

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

于 2014-10-11T21:55:46.477 回答
2

您需要在事件调度程序发回异常之前击败它,因此请收听此类事件并将它们静音,尽管我认为这是一种不好的处理方式

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());
于 2013-10-08T15:00:37.047 回答