2011-04-24 34 views
22

Có ai biết liệu chức năng gửi SwiftMailer có trả về trạng thái gửi thư không? Tôi muốn có thể biết rằng email đã được gửi hoặc không được phân phối. Điều này có thể xảy ra không?Trạng thái gửi thư nhanh Swift

Cảm ơn

+0

http: // swiftmailer.org/docs/failures by byference – anon

+0

Liên kết ở trên không hoạt động nữa, Vì vậy, đây là liên kết được cập nhật mới: http://swiftmailer.org/docs/sending.html#getting-failures-by-reference –

Trả lời

33

Có ít nhất ba lớp kiểm tra mà SwiftMailer hỗ trợ, sẽ báo cáo một số loại lỗi gửi.

1) Luôn kiểm tra mã trả về từ lệnh gửi() hoặc batchSend() của SwiftMailer cho kết quả khác 0. Từ the documentation:

//Send the message 
$numSent = $mailer->send($message); 

printf("Sent %d messages\n", $numSent); 

/* Note that often that only the boolean equivalent of the 
    return value is of concern (zero indicates FALSE) 

if ($mailer->send($message)) 
{ 
    echo "Sent\n"; 
} 
else 
{ 
    echo "Failed\n"; 
} 

2) Sử dụng các failures-by-reference feature biết nếu địa chỉ cụ thể (es) bị từ chối hoặc không thể hoàn thành:

//Pass a variable name to the send() method 
if (!$mailer->send($message, $failures)) 
{ 
    echo "Failures:"; 
    print_r($failures); 
} 

/* 
Failures: 
Array (
    0 => [email protected], 
    1 => [email protected] 
) 
*/ 

3) Trong một vài tình huống bạn có thể muốn enable return receipts như tốt, xác nhận rằng một trình đọc email hiển thị thông báo. Chúng thường bị người dùng hoặc ứng dụng email của họ vô hiệu hóa hoặc bỏ qua, nhưng nếu bạn nhận được biên lai, nó sẽ được xác nhận rất cao. Cũng lưu ý rằng điều này có thể xảy ra nhiều ngày sau khi gửi vì vậy nó không phải là một thử nghiệm đồng bộ thời gian thực như hai ở trên.

$message->setReadReceiptTo('[email protected]'); 

Tuy nhiên, vì có rất nhiều biến và lớp hệ thống liên quan đến phân phối SMTP, thông thường, không thể gửi thư hoàn toàn chắc chắn. Điều tốt nhất bạn có thể làm là đảm bảo bạn đang sử dụng hai lần kiểm tra đầu tiên ở trên. Nếu bạn đang sử dụng máy chủ riêng của mình cho dịch vụ SMTP, thì bạn C ALNG cần phải xem nhật ký và hàng đợi của bạn như Marc B đã đề cập.

Một ví dụ khác nhấn mạnh sự cần thiết phải làm quen với bất kỳ hệ thống email cơ bản nào bạn đang sử dụng. Tôi vừa mới bắt đầu sử dụng Swift_AWSTransport bởi John Hobbs cho Amazon Web Services SES. SES có khả năng trả về một phản hồi XML với thông tin chẩn đoán cho mỗi tin nhắn được gửi qua nó. Mặc dù SwiftMailer vốn không hiểu cách sử dụng phản hồi XML đó, nhưng tôi thấy nó vô giá để xử lý sự cố. Tôi đề cập đến nó vì tôi thấy rằng trong một số trường hợp, kiểm tra # 1 và # 2 ở trên sẽ xuất hiện thành công với SwiftMailer, nhưng SES không thích điều gì đó về định dạng thư của tôi. Do đó, tôi đang xem xét phân tích cú pháp rằng XML là một kiểm tra bổ sung.

+0

Liên kết bị hỏng trong tài liệu, bạn có thể cập nhật nó không? – shakaran

+1

@shakaran, tôi đã cập nhật các liên kết. – ybull

+0

cảm ơn rất nhiều vì đã cập nhật! – shakaran

4

Swiftmailer không liên quan gì đến việc gửi thư thực tế. Nó chỉ bàn giao mọi thứ cho bất kỳ máy chủ SMTP nào mà bạn đã chỉ định, và đó là máy chủ sẽ xử lý việc phân phối. Bạn cần kiểm tra nhật ký của máy chủ SMTP để xem điều gì đã xảy ra với thư. Nó có thể gặp khó khăn trong hàng đợi gửi đi vì máy chủ bị đầm lầy. Nó có thể bị kẹt trong hàng đợi vì kết thúc nhận không thể truy cập được hoặc đang sử dụng danh sách xám, v.v ... công việc của Swiftmailer kết thúc khi nó nhận được sự thừa nhận từ máy chủ SMTP mà thư được xếp hàng đợi.

+1

Swiftmailer sẽ thông báo cho tôi nếu tin nhắn tôi gửi không được xếp hàng? hoặc máy chủ smtp không thể truy cập được? Nó sẽ trả về chuỗi lỗi? – DavidW

+0

Có, http://swiftmailer.org/docs/failures-byreference. Đó là tất cả trong tài liệu. –

+2

Nó vẫn không nói tại sao nó không thành công. Nó có thể không đến được máy chủ không? auth bị từ chối? SSL/TLS có bắt buộc nhưng không được sử dụng không? Vv ... –

3

Bài đăng cũ hơn, nhưng như của Swiftmailer 4+ và ngoài việc nhận trạng thái result từ cuộc gọi phương thức send. Nếu bạn muốn gỡ lỗi cho bưu phẩm của mình và xem điều gì đang xảy ra trong quá trình vận chuyển, bạn có thể sử dụng Trình cắm thêm Logger hoặc thậm chí tạo Plugin của riêng bạn. http://swiftmailer.org/docs/plugins.html#logger-plugin

$mailer = \Swift_Mailer::newInstance(
    \Swift_SmtpTransport::newInstance('tls://smtp.gmail.com', 465) 
); 
$logger = new \Swift_Plugins_Loggers_ArrayLogger; 
//$logger = new \Swift_Plugins_Loggers_EchoLogger; //echo messages in real-time 
$mailer->registerPlugin(new \Swift_Plugins_LoggerPlugin($logger)); 

for ($lotsOfRecipients as $recipient) { 
    //... 

    $mailer->send(/*...*/); 
} 

echo $logger->dump(); //not needed if using EchoLogger plugin 

nào sẽ ra thông điệp vận chuyển cho mỗi send cuộc gọi, trông giống như

++ Starting Swift_SmtpTransport 
<< 220 smtp.gmail.com ESMTP x12sm4143221vkc.19 - gsmtp 
>> EHLO server.example.com 
<< 250-smtp.gmail.com at your service, [192.168.1.1] 250-SIZE 35882577 250-8BITMIME 250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-CHUNKING 250 SMTPUTF8 
>> AUTH LOGIN 
<< 334 AbcDefGhIjKlMnop 
>> AbcDefGhIjKlMnop== 
<< 334 AbcDefGhIjKlMnop 
>> AbcDefGhIjKlMnop== 
<< 235 2.7.0 Accepted 
++ Swift_SmtpTransport started 
>> MAIL FROM: 
<< 250 2.1.0 OK x12sm4143221vkc.19 - gsmtp 
>> RCPT TO:<[email protected]> 
<< 250 2.1.5 OK x12sm4143221vkc.19 - gsmtp 
>> DATA 
<< 354 Go ahead x12sm4143221vkc.19 - gsmtp 
>> . 
<< 250 2.0.0 OK 1468948643 x12sm4143221vkc.19 - gsmtp