web-dev-qa-db-fra.com

Swift Statut de livraison de l'expéditeur

Est-ce que quelqu'un sait si la fonction d'envoi de SwiftMailer renvoie le statut de livraison? Je voudrais pouvoir savoir que l'e-mail a été livré ou non, est-ce possible?

Merci

29
DavidW

SwiftMailer prend en charge au moins trois couches de contrôles qui signalent plusieurs types d'échecs de livraison.

1) Vérifiez toujours le code retour des commandes send () ou batchSend () de SwiftMailer pour un résultat différent de zéro. De la 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) Utilisez la fonction échecs par référence pour savoir si des adresses spécifiques ont été rejetées ou n'ont pas pu être terminées:

//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) Dans certaines situations, vous souhaiterez peut-être également activer les accusés de réception , ce qui confirme qu'un lecteur de messagerie a affiché le message. Ils sont souvent désactivés ou ignorés par les utilisateurs ou leurs applications de messagerie, mais si vous obtenez un reçu, il est hautement confirmatif. Notez également que cela peut se produire plusieurs jours après l'envoi, ce n'est donc pas un test synchrone en temps réel comme les deux ci-dessus.

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

Cependant, étant donné que de nombreuses variables et couches de systèmes sont impliquées dans la remise SMTP, il n'est généralement pas possible d'être absolument sûr que les messages ont été remis. Le mieux que vous puissiez faire est de vous assurer que vous utilisez les deux premières vérifications ci-dessus. Si vous utilisez VOTRE propre serveur pour le service SMTP, vous devez ÉGALEMENT surveiller vos journaux et vos files d'attente, comme Marc B l'a mentionné.

Un autre exemple qui souligne la nécessité de se familiariser avec le système de messagerie sous-jacent que vous utilisez. Je viens de commencer à utiliser Swift_AWSTransport par John Hobbs pour Amazon Web Services SES. SES a la possibilité de renvoyer une réponse XML avec des informations de diagnostic pour chaque message envoyé par son intermédiaire. Bien que SwiftMailer ne comprenne pas intrinsèquement comment utiliser cette réponse XML, je l'ai trouvée inestimable pour le dépannage de la livraison. Je le mentionne parce que j'ai trouvé que dans certains cas, les vérifications # 1 et # 2 ci-dessus apparaîtront avec succès à SwiftMailer, mais SES n'a pas aimé quelque chose au sujet de la mise en forme de mon message. Je cherche donc à analyser ce XML comme une vérification supplémentaire.

38
ybull

Plutôt ancien, mais à partir de Swiftmailer 4+ et à part obtenir le statut result à partir de l'appel de méthode send. Si vous souhaitez déboguer votre logiciel de messagerie et voir ce qui se passe pendant le transport, vous pouvez utiliser les plugins Logger, ou même créer votre propre plugin. 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

Qui affichera le message de transport pour chaque appel send, qui ressemble à

++ 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 n'a rien à voir avec la livraison effective du courrier. Il remet simplement les choses à n'importe quel serveur SMTP que vous avez spécifié, et c'est ce serveur qui s'occupe de la livraison. Vous devez vérifier les journaux du serveur SMTP pour voir ce qui est arrivé au courrier. Il peut rester bloqué dans la file d'attente sortante car le serveur est submergé. Il peut rester bloqué dans une file d'attente parce que l'extrémité de réception est inaccessible ou utilise une liste grise, etc.

6
Marc B