Отправка электронной почты в цикле while

Когда я пытаюсь отправить электронное письмо из цикла while с помощью PHPMailer, он иногда отправляет 2, иногда 3 копии одного и того же электронного письма (это похоже на случайное) каждому получателю.

Вот мой код. Как вы думаете, у него проблемы?

 $list = $_POST['list'];
    $items = rtrim($_POST['items'],",");
    $query = "SELECT * FROM `mail` WHERE `ID` IN ($items)";
    $result = mysql_query($query);
    $from = "[email protected]";
    $fromname = "mysite";

    $mail = new PHPMailer(true); 

    $mail->IsSendmail(); 

    $mail->From       = $from;
    $mail->FromName   = $fromname;

    $mail->Subject  = "Your subscription was confirmed";

while ($row = mysql_fetch_array ($result))
{
    // HTML body
    $body .= "<p>Hi ". $row['name'] ." <br /><br />";
    $body .= "Your subscription request to " . $l_name ."'s list was confirmed.<br /><br />";
    $body .= "Thank You !<br /><br />";

    // Plain text body (for mail clients that cannot read HTML)
    $text_body  = "To view the message, please use an HTML compatible email viewer!";

    $mail->Body    = $body;
    $mail->AltBody = $text_body;
    $mail->AddAddress($row['email']);


    $mail->Send();
    $mail->ClearAddresses();

}

Как вы думаете, следует ли мне вывести этот mail->send(); из цикла while и получить все электронные письма из массива?

Или вы думаете, что проблема в MySQL-запросе?

Изменить: я проверил базу данных, нет проблем с базой данных, но я понял, что (допустим, в массиве 2 почты) он обычно отправляет первое электронное письмо, но второе идет с дублированной переменной $ body, я имею в виду, что он отправляет дублированную переменную $ body.

ИСПРАВЛЕНИЕ: я сделал, я только что добавил $body = "";, и теперь он отлично работает!


person Utku Dalmaz    schedule 12.11.2009    source источник
comment
Я думаю, что у вас в базе скорее есть дубликаты.   -  person David    schedule 12.11.2009
comment
Я согласен с Дэвидом. Проверьте свою базу данных.   -  person mauris    schedule 12.11.2009
comment
Да, я иду с Дэвидом. Проверьте свою базу данных   -  person sathish    schedule 12.11.2009
comment
спасибо, я снова собираюсь проверить базу данных ..   -  person Utku Dalmaz    schedule 12.11.2009
comment
Поскольку об этом не упоминалось, я бы посоветовал проверить базу данных.   -  person Mike B    schedule 12.11.2009
comment
Не уверен, но возникнет ли проблема с дублированием почты, если вы создадите новый объект PHPMailer на каждом шаге цикла?   -  person Marco    schedule 12.11.2009


Ответы (3)


Думаю, более чем вероятно дублирование данных в базе.

Также меня беспокоит отсутствие проверки (или ее отсутствие) в массиве POST.

Возможно, вам стоит взглянуть на это:

очистка переменных $ _POST

Обновление: хотя вы можете просто использовать DISTINCT в запросе, я бы спросил, как дубликаты попали туда в первую очередь, и посмотрю на это как на отдельную проблему.

person Andrew    schedule 12.11.2009

Просто поставьте "SELECT DISTINCT" в свой запрос, и вы больше не увидите проблем с вашей базой данных.

person lsouza    schedule 12.11.2009
comment
спасибо, но я проверил, речь идет не о дублировании базы данных, а о цикле, мне нужно сбросить переменную $ body, я думаю - person Utku Dalmaz; 12.11.2009

Вы упомянули об исправлении в конце своего вопроса, но вот почему это имеет значение:

Оператор .= добавляет к существующему значению, тогда как = перезаписывает его. В конце первой итерации и начале второй $body содержит тело письма, во время второй итерации вы затем добавляете к существующему значению. Каждый раз, когда цикл выполняется, вы добавляете еще одну копию в конец электронного письма. Как вы сказали, установка $body = "" исправляет это, потому что оно очищает тело письма.

Другой способ исправить это - сделать первое присвоение = вместо .=:

while ($row = mysql_fetch_array ($result))
{
  // HTML body
  $body = "<p>Hi ". $row['name'] ." <br /><br />"; // This line only has '='
  $body .= "Your subscription request to " . $l_name ."'s list was confirmed.<br /><br />";
  $body .= "Thank You !<br /><br />";

  // etc...
}
person 3ocene    schedule 23.12.2015