Отправка электронной почты во время цикла - PullRequest
0 голосов
/ 12 ноября 2009

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

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

 $list = $_POST['list'];
    $items = rtrim($_POST['items'],",");
    $query = "SELECT * FROM `mail` WHERE `ID` IN ($items)";
    $result = mysql_query($query);
    $from = "donotreply@mysite.net";
    $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 Переменная dublicated.

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

Ответы [ 3 ]

1 голос
/ 12 ноября 2009

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

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

Может быть стоит посмотреть на это:

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

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

1 голос
/ 12 ноября 2009

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

0 голосов
/ 23 декабря 2015

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

Оператор .= добавляет существующее значение, тогда как = перезаписывает его. В конце первой итерации и начале второй, $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...
}
...