очистить последнюю ошибку исключения из PHPMailer для следующего цикла

#php #exception #error-handling #phpmailer

#php #исключение #обработка ошибок #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
  

итак, мой вопрос в том, как мне очистить ошибку после ее обработки, чтобы я мог начать все заново?

Ответ №1:

Из-за исключения по второму адресу строка with $mail->clearAddresses() никогда не достигается.

Таким образом, ваше третье письмо будет отправлено обоим some2@email и some3@email.com снова вызовет исключение.

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

Вы можете вызвать $mail->clearAddresses() вне try, catch инструкции.

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

Вы также можете вызвать $mail->clearAddresses() перед вызовом $mail->addAddress($email) . Таким образом, вы всегда будете уверены, что адреса очищены перед добавлением.

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