Estado de Entrega de Swift Mailer


¿Alguien sabe si la función SwiftMailer send devuelve el estado de entrega? Me gustaría ser capaz de saber que el correo electrónico fue entregado o no delivered.Is ¿esto es posible?

Gracias

Author: DavidW, 2011-04-24

3 answers

Hay al menos tres capas de comprobaciones que SwiftMailer admite, que reportarán varios tipos de errores de entrega.

1) Compruebe siempre el código devuelto de los comandos send() o batchSend() de SwiftMailer para obtener un resultado distinto de cero. De la documentación :

//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) Use la característica fallas por referencia para saber si las direcciones específicas fueron rechazadas o no pudieron completarse:

//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) En algunas situaciones es posible que desee habilitar retorno recibos también, que confirman que un lector de correo electrónico muestra el mensaje. A menudo son deshabilitados o ignorados por los usuarios o sus aplicaciones de correo electrónico, pero si recibe un recibo, es altamente confirmatorio. Tenga en cuenta también que esto puede ocurrir muchos días después del envío, por lo que no es una prueba síncrona en tiempo real como las dos anteriores.

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

Sin embargo, dado que hay tantas variables y capas de sistemas involucrados en la entrega SMTP, generalmente no es posible estar absolutamente seguro de que los mensajes fueron entregar. Lo mejor que puede hacer es asegurarse de que está utilizando las dos primeras comprobaciones anteriores. Si está utilizando SU propio servidor para el servicio SMTP, entonces también necesita estar observando sus registros y colas como mencionó Marc B.

Otro ejemplo que enfatiza la necesidad de familiarizarse con cualquier sistema de correo electrónico subyacente que esté utilizando. Acabo de empezar a usar Swift_AWSTransport de John Hobbs para Amazon Web Services SES. SES tiene la capacidad de devolver una respuesta XML con diagnóstico información para cada mensaje enviado a través de él. Aunque SwiftMailer no entiende inherentemente cómo usar esa respuesta XML, me ha parecido invaluable para la solución de problemas de entrega. Lo menciono porque encontré que en algunos casos, las comprobaciones #1 y #2 anteriores parecerán exitosas para SwiftMailer, pero a SES no le gustó algo sobre el formato de mi mensaje. Por lo tanto, estoy buscando en el análisis de ese XML como una comprobación adicional.

 36
Author: ybull,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-18 19:29:28

Post bastante antiguo, pero a partir de Swiftmailer 4+ y aparte de obtener el estado result de la llamada al método send. Si desea depurar su correo y ver lo que está sucediendo durante el transporte, puede usar los complementos del Registrador, o incluso crear su propio Complemento. 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));

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

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

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

Que emitirá el mensaje de transporte para cada llamada send, que se parece a

++ 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
 5
Author: fyrye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-16 20:58:48

Swiftmailer no tiene nada que ver con la entrega real del correo. Simplemente entrega las cosas a cualquier servidor SMTP que haya especificado, y es ese servidor el que se encarga de la entrega. Es necesario comprobar los registros del servidor SMTP para ver qué pasó con el correo. Puede quedar atascado en la cola de salida porque el servidor está inundado. Puede quedar atascado en una cola porque el extremo receptor es inalcanzable o está usando listas grises, etc... El trabajo de Swiftmailer termina una vez que recibe el reconocimiento de el servidor SMTP que el correo ha sido puesto en cola.

 4
Author: Marc B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-24 03:11:20