web-dev-qa-db-ja.com

Swiftメーラーの配信ステータス

SwiftMailerの送信関数が配信ステータスを返すかどうかは誰か知っていますか?メールが配信されたかどうかを知りたいのですが、可能ですか?

ありがとう

29
DavidW

SwiftMailerがサポートする少なくとも3つのチェック層があり、いくつかのタイプの配信エラーを報告します。

1)SwiftMailerのsend()またはbatchSend()コマンドからの戻りコードを調べて、結果がゼロでないことを確認してください。 ドキュメント から:

//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機能 を使用して、特定のアドレスが拒否されたか、完了できなかったかを確認します。

//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)いくつかの状況では、 戻り確認を有効にする も必要になる場合があります。これにより、電子メールリーダーがメッセージを表示したことが確認されます。多くの場合、ユーザーまたはユーザーのメールアプリによって無効にされたり無視されたりしますが、領収書を受け取った場合、それは非常に確認的です。これは送信後何日もかかる可能性があるため、上記の2つのようなリアルタイム同期テストではないことにも注意してください。

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

ただし、SMTP配信には多くの変数とシステムのレイヤーが含まれているため、メッセージが確実に配信されたことを確認することは一般的に不可能です。最善の方法は、上記の最初の2つのチェックを使用していることを確認することです。 SMTPサービスに独自のサーバーを使用している場合は、Marc Bが述べたようにログとキューも監視する必要があります。

使用している基本的な電子メールシステムに慣れる必要性を強調するもう1つの例。 Amazon Web Services SESでJohn HobbsによるSwift_AWSTransportを使い始めました。 SESには、送信された各メッセージの診断情報を含むXML応答を返す機能があります。 SwiftMailerは本質的にそのXML応答の使用方法を理解していませんが、配信のトラブルシューティングに非常に役立つことがわかりました。場合によっては、上記のチェック1と2がSwiftMailerで正常に表示されることがわかったので、SESがメッセージのフォーマットについて気に入らなかったので、それについて言及します。そのため、追加のチェックとしてそのXMLの解析を検討しています。

38
ybull

かなり古い投稿ですが、Swiftmailer 4以降では、resultメソッド呼び出しからsendステータスを取得することは別として。メーラーをデバッグして、転送中に何が起こっているのかを確認したい場合は、ロガープラグインを使用するか、独自のプラグインを作成することもできます。 https://swiftmailer.symfony.com/docs/plugins.html

$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));

foreach ($recipients as $recipient) {
    //...

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

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

これは、send呼び出しごとにトランスポートメッセージを出力します。

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

Swiftmailerは、メールの実際の配信とは何の関係もありません。指定したSMTPサーバーに処理を引き渡すだけで、配信を処理するのはそのサーバーです。 SMTPサーバーのログをチェックして、メールに何が起こったかを確認する必要があります。サーバーがいっぱいになっているため、送信キューでスタックする可能性があります。 SMTPサーバーからメールがキューに入れられたことの確認を受け取ると、Swiftmailerのジョブは終了します。

6
Marc B