为下一个循环清除PHPMailer中的最后一个异常错误



假设我有这个:

$emails = array('some1@email.com', 'some2@email', 'some3@email.com', 'some4@email.com');
foreach ($emails as $email) {
try {
$mail->addAddress($email);
$mail->send();
$mail->clearAddresses();
}
catch (Exception $e) {
if (strpos($e->errorMessage(), $email) > 0) {
// so here i can see if i have error like: SMTP Error: The following recipients failed: some2@email
echo $e->errorMessage();
echo "<br>";
echo $email;
}
else {
// so i would see if there is another error, like smtp login failed etc
// here unfortunately on third loop it gives me error from second loop that some2@email is nto valid even when i sent some3@email.com
die($e->errorMessage());
}
}
}

因此下一个循环中的异常被记住并显示,上面的输出是:

SMTP Error: The following recipients failed: some2@email: L6gvk4HSs0vIlL6gvkzbQ0 invalid destination domain <some2@email>
some3@email.com

所以我的问题是,我如何在处理错误后清除它,以便重新开始?

由于第二个地址出现异常,因此永远无法到达具有$mail->clearAddresses()的行。

因此,您的第三封邮件将同时发送到some2@emailsome3@email.com,再次引发异常。

try {
$mail->addAddress($email);
$mail->send(); // try block stops here on exception
$mail->clearAddresses(); // addresses are not cleared
} catch (Exception $e) {
// ...
}

您可以在try, catch语句之外调用$mail->clearAddresses()

try {
$mail->addAddress($email);
$mail->send();
} catch (Exception $e) {
// ...
}
$mail->clearAddresses();

您也可以在呼叫$mail->addAddress($email)之前先呼叫$mail->clearAddresses()。这样,在添加地址之前,您将始终确保地址已清除。

try {
$mail->clearAddresses();
$mail->addAddress($email);
$mail->send();
} catch (Exception $e) {
// ...
}

相关内容

最新更新