Проблема с дубликатом электронной почты в PHPmailer - условный оператор с $ mail-> Send () - PullRequest
3 голосов
/ 03 апреля 2011

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

require '../class.phpmailer.php';<br> try {<br> $mail = new PHPMailer(true); //New instance, with exceptions enabled<br> $mail->SMTPDebug = 1;<br> $mail->IsSMTP(); // tell the class to use SMTP<br> $mail->SMTPAuth = true; // enable SMTP authentication<br> $mail->Port = 25; // set the SMTP server port<br> $mail->Host = "mail.domain.com"; // SMTP server<br> $mail->Username = "username"; // SMTP server username<br> $mail->Password = "password"; // SMTP server password </p> <pre><code>$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()? Как правильно добавить настраиваемое подтверждающее сообщение?

1 Ответ

12 голосов
/ 03 апреля 2011

Когда вы вводите $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;   
}
...