2013-08-13 24 views
8

Tôi đang phát triển một ứng dụng gửi thư đơn giản với tài khoản Gmail làm host.It hoạt động như một sự quyến rũ nhưng vấn đề tăng lên khi chức năng send() ném một ngoại lệ. Tôi thấy rằng try catch statement không thể xử lý ngoại lệ. Nó không hoạt động ngay cả khi tôi sử dụng lớp ngoại lệ toàn cầu. câu hỏi này cũng được thảo luận ở đâu đó.Ngoại lệ Swiftmailer không bắt được trong bộ điều khiển Symfony2

ví dụ:

Catch swiftmailer exception in Symfony2 dev env controller

hoặc

https://groups.google.com/forum/#!topic/symfony2/SlEzg_PKwJw

nhưng họ đã không đạt được một câu trả lời làm việc.

My mã chức năng điều khiển là:

public function ajaxRegisterPublisherAction() 
    { 

//some irrelevant logic 

    $returns= json_encode(array("username"=>$username,"responseCode"=>$responseCode)); 


    try{ 
      $message = \Swift_Message::newInstance() 
     ->setSubject('hello world') 
     ->setFrom('[email protected]') 
     ->setTo('[email protected]') 
     ->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')); 


    } 

Câu trả lời đó được gửi từ trên mã mà tôi nhận được trong bảng điều khiển firebug là:

{"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> 

và tôi bắt sợi lông của tôi, vì tôi không biết tại sao hạt nhân xử lý ngoại lệ trong tiếp tục đối tượng json của tôi?

khi tôi nhận xét dòng này:.

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

ngoại trừ không xảy ra và tôi có một json hợp lệ trong phía khách hàng (có nghĩa là quá trình quan trọng-of- mặc dù) tôi đã thay đổi Exception-\Exception hoặc \Swift_TransportException hoặc thậm chí Swift_TransportException! nhưng không có kết quả tốt.

+0

Bạn đã thử 'Swift_SwiftException' chưa? Trong tập tin nó nói "Base Exception class". – ferdynator

+0

i có nghĩa là 'Ngoại lệ' bởi "Lớp cơ sở ngoại lệ" – CoderInNetwork

+0

Tôi đã thử nghiệm với "Swift_SwiftException" và "\ Swift_SwiftException" bây giờ. Nó không hoạt động – CoderInNetwork

Trả lời

1

bạn cần phải đánh bại dispatcher sự kiện trước khi nó gửi lại một ngoại lệ, vì vậy nghe các loại sự kiện và im lặng cho họ, mặc dù tôi nghĩ rằng đây là một cách BAD để đối phó với nó

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

bên trong bộ điều khiển

$mailer = $this->get('mailer'); 

$mailer->registerPlugin(new SuchABadRequest()); 
3

Khi bạn làm $this->container->get("mailer")->send($message); thư email sẽ không được gửi vào thời điểm đó nếu bạn đã bật tính năng đệm. Xem http://symfony.com/doc/current/cookbook/email/spool.html

Nếu bạn có cài đặt mặc định là spool: { type: memory }, \Swift_TransportException sẽ được ném trong giai đoạn kết thúc hạt nhân, sau khi bộ điều khiển của bạn đã thoát. Một cách xung quanh việc này là tắt chức năng đệm (nhưng sau đó người dùng của bạn có thể phải đợi trong khi email được gửi) hoặc bạn có thể làm cho trình xử lý sự kiện của riêng mình xử lý ngoại lệ. http://symfony.com/doc/current/cookbook/service_container/event_listener.html

+0

vấn đề này thuộc về rất nhiều lần trước đây.at cuối cùng chúng tôi đã không thể giải quyết vấn đề và do đó được sử dụng thư viện gửi thư khác.tiếc là tôi không biết liệu giải pháp của bạn có hoạt động hay không – CoderInNetwork

Các vấn đề liên quan