2011-04-24 4 views
22

SwiftMailer 보내기 기능이 배달 상태를 반환하는지 아는 사람 있습니까? 전자 메일이 배달되었는지 배달되지 않았는지 알 수 있기를 원합니다. 가능한가요?스위프트 메일러 배달 상태

감사합니다.

+0

HTTP처럼 보이는 각 send 호출 전송 메시지 : // swiftmailer.org/docs/failure-byreference – anon

+0

위의 링크가 더 이상 작동하지 않으므로 다음 링크가 업데이트되었습니다. http://swiftmailer.org/docs/sending.html#getting-failures-by-reference –

답변

33

SwiftMailer가 지원하는 검사의 세 가지 계층이 있으며 여러 가지 유형의 배달 실패를보고합니다.

1) SwiftMailer의 send() 또는 batchSend() 명령의 리턴 코드가 항상 0이 아닌 값인지 확인하십시오. 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) 특정 주소 (들)이 거부 된 경우 알 수 있도록 failures-by-reference feature를 사용하거나 완료 할 수 없습니다 :

//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) 몇 가지 상황에서 당신은 enable return receipts을 할 수 있습니다 잘, 전자 메일 독자가 메시지를 표시했는지 확인합니다. 그들은 종종 사용자 또는 이메일 응용 프로그램에 의해 사용 중지되거나 무시되지만, 영수증을 받으면 매우 확신합니다. 전송 후 며칠이 걸릴 수도 있으므로 위의 두 가지와 같은 실시간 동기 테스트가 아니어야합니다.

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

그러나, 많은 변수와 SMTP 전달에 관여하는 시스템의 층이 있기 때문에, 절대적으로 확인 메시지가 전달 된 것으로 일반적으로 가능하지 않다. 당신이 할 수있는 최선책은 위의 처음 두 가지 체크를 사용하고 있는지 확인하는 것입니다. SMTP 서비스에 자신의 서버를 사용하고 있다면 Marc B가 언급 한대로 로그와 대기열을 감시해야합니다.

사용중인 기본 이메일 시스템에 익숙해지기위한 필요성을 강조하는 한 가지 다른 예입니다. 저는 Amazon Web Services SES의 John Hobbs가 Swift_AWSTransport를 사용하기 시작했습니다. SES는이를 통해 전송 된 각 메시지에 대한 진단 정보가 포함 된 XML 응답을 반환 할 수 있습니다. SwiftMailer는 본질적으로 해당 XML 응답을 사용하는 방법을 이해하지 못하지만 배달 문제 해결에 매우 중요합니다. 위에서 언급 한 수표 # 1과 # 2가 SwiftMailer에게 성공한 것처럼 보이지만 SES가 내 메시지 서식 지정에 대해 좋아하지 않는 경우가 있기 때문에 언급합니다. 따라서 XML을 추가 검사로 파싱 할 것입니다.

+0

문서의 깨진 링크를 업데이트 할 수 있습니까? – shakaran

+1

@shakaran, 링크를 업데이트했습니다. – ybull

+0

감사합니다. – shakaran

4

Swiftmailer는 실제 메일 전달과 관련이 없습니다. 그것은 당신이 지정한 SMTP 서버에 일을 넘겨 주며 배달을 담당하는 서버입니다. 메일에 어떤 일이 발생했는지 보려면 SMTP 서버의 로그를 확인해야합니다. 서버가 침범하여 나가는 대기열에 갇힐 수 있습니다. 받는쪽에 도달 할 수 없거나 회색 목록 등을 사용하기 때문에 대기열에 걸릴 수 있습니다. 메일이 대기 중이라는 SMTP 서버의 확인을 받으면 Swiftmailer의 작업이 끝납니다.

+1

swiftmailer가 나를 알립니다. 내가 보낸 메시지가 대기열에 없다면? 또는 smtp 서버에 연결할 수 없습니다? 오류 문자열을 반환합니까? – DavidW

+0

예, http://swiftmailer.org/docs/failures-byreference. 그것은 문서에 모두 있습니다. –

+2

여전히 실패한 이유는 아직 밝혀지지 않았습니다. 서버에 연결할 수 없습니까? 승인이 거부 되었습니까? SSL/TLS가 필요 하나 사용하지 않았습니까? 기타 ... –

3

오히려 이전 게시물이지만 Swiftmailer 4+ 및 send 메서드 호출에서 result 상태를 제외하고. 메일러를 디버그하고 전송 중에 무슨 일이 일어나고 있는지 보려면 Logger 플러그인을 사용하거나 자신 만의 플러그인을 만들 수도 있습니다. 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 

어떤 출력합니다

++ 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