Проблема дублирования электронной почты PHPmailer – условная заявка с помощью $ mail-> Отправить ()

Я столкнулся с странной проблемой с PHPmailer (версия 5.1), с которой я пытаюсь работать. Я видел здесь немало хороших отзывов, поэтому я решил попробовать. Я обнаружил, что при попытке создать настраиваемое подтверждающее сообщение с условным выражением, основанным на $mail->send() , я получаю дубликаты писем. Я могу дублировать его с помощью общего сценария testemail.php, который поставляется с загрузкой phpmailer. Вот код:

require '../class.phpmailer.php';
try {
$mail = new PHPMailer(true); //New instance, with exceptions enabled
$mail->SMTPDebug = 1;
$mail->IsSMTP(); // tell the class to use SMTP
$mail->SMTPAuth = true; // enable SMTP authentication
$mail->Port = 25; // set the SMTP server port
$mail->Host = "mail.domain.com"; // SMTP server
$mail->Username = "username"; // SMTP server username
$mail->Password = "password"; // SMTP server password

 $mail->IsSendmail(); $mail->From = "example_from@domain.com"; $mail->FromName = "First Last"; $to = "example@domain.com"; $mail->AddAddress($to); $mail->Subject = "PHP Mailer test"; $message = "This is a test. \n"; $mail->Body = $message; $mail->Send(); if ($mail->Send()) { echo 'Message has been sent.'; } else { echo "Mailer Error: " . $mail->ErrorInfo; } 

} catch (phpmailerException $ e) {
echo $ e-> errorMessage ();
}

Вышеприведенный код повторяет подтверждение «Сообщение отправлено», но затем отправляет два письма. Если я прокомментирую строку $mail->send() , я все равно получаю подтверждение «сообщение отправлено» и получаю только одно сообщение. Если я удалю условный оператор и оставьте строку $mail->send() закомментированной, письмо не будет отправлено.

Почему добавление условного оператора приводит к отправке сообщения электронной почты без вызова метода $mail->send() ? Каков правильный способ добавления настраиваемого подтверждения?

Когда вы помещаете $mail->Send() в свой условный код, вы на самом деле вызываете его снова, отправляете другое сообщение и проверяете, было ли отправлено это второе сообщение.

Если вы просто держите

 if ($mail->Send()) { echo 'Message has been sent.'; } else { echo "Mailer Error: " . $mail->ErrorInfo; } 

и избавиться от первоначального безусловного вызова «Отправить», все должно быть в порядке.

В качестве альтернативы, если это более понятно для вас или вам нужно выполнить какую-либо обработку в другом месте, которая зависит от того, было ли сообщение успешно отправлено, вы могли бы сделать по существу эквивалент:

 $status = $mail->Send(); if ($status) { echo 'Message has been sent.'; } else { echo "Mailer Error: " . $mail->ErrorInfo; }