使用 swiftmailer 发送多封电子邮件时如何绕过失败的电子邮件?
How do I bypass a failing email when sending multiple emails with swiftmailer?
我在 MySQL 数据库中有一个电子邮件队列,通过 cron 我每分钟处理 X 封未发送的电子邮件。我遇到的问题是,如果任何特定电子邮件失败,它将停止执行其余电子邮件。在一种情况下,这是因为 SMTP 身份验证失败,并且电子邮件处理基本上停止了,因为发送失败电子邮件的尝试不断发生。还有其他我应该知道的 swiftmailer 失败方式吗?
我想知道我可以在这里做些什么来使这个循环无懈可击?如果任何一封电子邮件失败,我想用错误代码(我的或 swiftmailers)标记数据库中的记录。
Swiftmailer 不是我们发送电子邮件的唯一方式,以下方法是驱动程序的一部分。有哪些解决方案?
public function process_queue()
{
$result = [... a few mail queue records ...];
foreach( $result as $params )
{
if( ! class_exists( 'Swift', FALSE ) )
{
require '/libraries/Mail/swiftmailer/lib/swift_required.php';
}
// Prepare transport for sending mail through SMTP
if( $params['protocol'] == 'smtp' )
{
$transport = Swift_SmtpTransport::newInstance( $params['smtp_host'], $params['smtp_port'] )
->setUsername( $params['smtp_user'] )
->setPassword( $params['smtp_pass'] );
}
// Prepare transport for simple mail sending
else
{
$transport = Swift_MailTransport::newInstance();
}
// Prepare swiftmailer mailer object
$mailer = Swift_Mailer::newInstance( $transport );
// Get a new message instance, and apply its attributes
$message = Swift_Message::newInstance()
->setSubject( $params['subject'] )
->setFrom( [ $params['from_email'] => $params['from_name'] ] )
->setTo( $params['to'] )
->setBody( $params['body'], $params['mailtype'] );
$mailer->send( $message );
}
}
您可以将发送放在 try-catch
块中,并在循环完成后处理任何异常。
try {
$mailer->send($message);
} catch(Exception $exception) {
// do something with $exception that contains the error message
}
或者您可以将第二个参数添加到 send
并利用失败。
// Pass a variable name to the send() method
if (!$mailer->send($message, $failures))
{
// do something with $failures that contains the error message
}
此外,如果 setTo
由于无效的电子邮件地址而失败,Swift 将 return 出错,因此您可以单独执行每个方法,而不是链接以构建消息,并且 catch/handle 任何错误。
try {
$message->setTo($params['to']);
} catch(Swift_RfcComplianceException $e) {
echo "The email ".$params['to']." seems invalid";
}
我在 MySQL 数据库中有一个电子邮件队列,通过 cron 我每分钟处理 X 封未发送的电子邮件。我遇到的问题是,如果任何特定电子邮件失败,它将停止执行其余电子邮件。在一种情况下,这是因为 SMTP 身份验证失败,并且电子邮件处理基本上停止了,因为发送失败电子邮件的尝试不断发生。还有其他我应该知道的 swiftmailer 失败方式吗?
我想知道我可以在这里做些什么来使这个循环无懈可击?如果任何一封电子邮件失败,我想用错误代码(我的或 swiftmailers)标记数据库中的记录。
Swiftmailer 不是我们发送电子邮件的唯一方式,以下方法是驱动程序的一部分。有哪些解决方案?
public function process_queue()
{
$result = [... a few mail queue records ...];
foreach( $result as $params )
{
if( ! class_exists( 'Swift', FALSE ) )
{
require '/libraries/Mail/swiftmailer/lib/swift_required.php';
}
// Prepare transport for sending mail through SMTP
if( $params['protocol'] == 'smtp' )
{
$transport = Swift_SmtpTransport::newInstance( $params['smtp_host'], $params['smtp_port'] )
->setUsername( $params['smtp_user'] )
->setPassword( $params['smtp_pass'] );
}
// Prepare transport for simple mail sending
else
{
$transport = Swift_MailTransport::newInstance();
}
// Prepare swiftmailer mailer object
$mailer = Swift_Mailer::newInstance( $transport );
// Get a new message instance, and apply its attributes
$message = Swift_Message::newInstance()
->setSubject( $params['subject'] )
->setFrom( [ $params['from_email'] => $params['from_name'] ] )
->setTo( $params['to'] )
->setBody( $params['body'], $params['mailtype'] );
$mailer->send( $message );
}
}
您可以将发送放在 try-catch
块中,并在循环完成后处理任何异常。
try {
$mailer->send($message);
} catch(Exception $exception) {
// do something with $exception that contains the error message
}
或者您可以将第二个参数添加到 send
并利用失败。
// Pass a variable name to the send() method
if (!$mailer->send($message, $failures))
{
// do something with $failures that contains the error message
}
此外,如果 setTo
由于无效的电子邮件地址而失败,Swift 将 return 出错,因此您可以单独执行每个方法,而不是链接以构建消息,并且 catch/handle 任何错误。
try {
$message->setTo($params['to']);
} catch(Swift_RfcComplianceException $e) {
echo "The email ".$params['to']." seems invalid";
}