30

SwiftMailer send 関数が配信ステータスを返すかどうかは誰にもわかりませんか? メールが届いたか届いていないか知りたいのですが可能ですか?

ありがとう

4

3 に答える 3

40

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

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

/*
Failures:
Array (
  0 => receiver@bad-domain.org,
  1 => other-receiver@bad-domain.org
)
*/

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

$message->setReadReceiptTo('your@address.tld');

ただし、SMTP 配信には非常に多くの変数とシステム層が関係しているため、通常、メッセージが確実に配信されたことを確認することはできません。できる最善のことは、上記の最初の 2 つのチェックを使用していることを確認することです。SMTP サービスに独自のサーバーを使用している場合は、Marc B が述べたように、ログとキューも監視する必要があります。

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

于 2011-04-28T14:21:07.217 に答える
8

かなり古い投稿ですが、Swiftmailer 4 以降の時点で、メソッド呼び出しresultからステータスを取得することは別として。sendメーラーをデバッグして、転送中に何が起こっているかを確認したい場合は、Logger プラグインを使用するか、独自のプラグインを作成することもできます。 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:<recipient@example.com> 
<< 250 2.1.5 OK x12sm4143221vkc.19 - gsmtp 
>> DATA 
<< 354 Go ahead x12sm4143221vkc.19 - gsmtp 
>> . 
<< 250 2.0.0 OK 1468948643 x12sm4143221vkc.19 - gsmtp
于 2016-07-19T18:10:25.660 に答える
6

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

于 2011-04-24T03:11:20.963 に答える