2012-11-06 39 views
15

Tôi sử dụng SwiftMailer để gửi email từ quy trình công nhân bộ phận. Tôi đang sử dụng lớp Swift_SmtpTransport để gửi email.Cách đóng kết nối Smtp trong SwiftMailer

Vấn đề là nếu quy trình công nhân này vẫn không hoạt động trong một thời gian, kết nối smtp SwiftMailer sẽ hết thời gian chờ. Bây giờ khi công việc tiếp theo đến, SwiftMailer không gửi được email vì kết nối đã hết thời gian chờ.

Lý tưởng nhất, tôi muốn đóng kết nối smtp sau mỗi công việc. Tôi không thể xác định vị trí api trong lớp mà thực hiện điều này một cách cụ thể. Các đối tượng unset() không hoạt động vì đây là một lớp tĩnh.

+2

có lẽ: $ transport-> stop(), $ transport-> start() –

+0

@Dragon Omg ty rất nhiều! Tôi có một nhân viên nền trong một vòng lặp vô hạn và điều này giải quyết nó cho tôi. –

Trả lời

0

Tôi đang chạy một công nhân trong một vòng lặp vô hạn sử dụng Swiftmailer và AWS SES tôi đã nhận được báo lỗi:

Expected response code 250 but got code "421", with message "421 Timeout waiting for data from client. 

Giải pháp cho kịch bản của tôi:

$love = true; 
while($love) { 
    $message = Message::to($record->to) 
     ->from(array('[email protected]' => $user->name())) 
     ->reply(array($user->email => $user->name())) 
     ->subject($record->subject) 
     ->body($body->value) 
     ->html(true) 
     ->send(); 

    if (! $message->was_sent()) 
     throw new Swift_TransportException($errstr . ': ' . $errno); 
} 
+2

Câu trả lời này có thể sử dụng một giải thích. Bạn có nghĩa là lỗi như vậy đã không ném 'Swift_TransportException', nhưng làm nó sửa chữa một cách rõ ràng vấn đề? –

+3

Đây có phải là câu trả lời hoặc câu hỏi không? – caponica

10

Có một tùy chọn thô lỗ: dừng vận chuyển một cách rõ ràng. Trong các cuộc gọi tiếp theo của phương thức sendMail, SwiftMailer sẽ kiểm tra xem vận tải có đang hoạt động không (không phải bây giờ) và khởi động lại nó. IMNSHO, SwiftMailer nên chặn thời gian chờ SMTP và kết nối lại automatically.But, cho bây giờ, đây là cách giải quyết:

function sendMail($your_args) { 
    try{ 
     $mailer = Swift_Mailer::newInstance($transport); 
     $message = Swift_Message::newInstance('Wonderful Subject') 
     ->setFrom(array('[email protected]' => 'John Doe')) 
     ->setTo(array('[email protected]', '[email protected]' => '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 
    } 

} 
6

tôi gửi mail trong một vòng lặp và tôi đã bắt Swift_TransportException và tạo ra một thể hiện mới của Swift_Mailer nhưng đó không phải là bản sửa lỗi phù hợp: sự cố là vận chuyển , không phải là bưu phẩm gửi. Giải pháp là đưa ra một cuộc gọi rõ ràng để 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 ;-) 
    } 
} 

Bằng cách này, Swift phát hiện bưu phẩm được dừng lại và bắt đầu nó tự động, vì vậy nó phục hồi một cách chính xác từ lỗi giao tiếp.

+1

Nhưng bạn không nên thử gửi lại? – tishma

+0

@tishma Câu hỏi đặt câu hỏi về cách đặt lại đúng thư và đó là những gì tôi cố gắng trả lời. –

+0

Khi đường ống bị hỏng '$ mailer-> getTransport() -> stop()' sẽ thất bại – Jekis

1

Khi đường ống bị hỏng $ mailer-> getTransport() -> stop() cũng sẽ thất bại. Và do lỗi vận chuyển này không thể dừng lại được. Giải pháp thay thế là

// 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); 
     } 
    } 
} 
Các vấn đề liên quan