PHPMailer случайным образом прекращает отправку почты примерно после 175 отправленных писем

Я использую PHPMailer для отправки информационного бюллетеня из списка электронных писем в базе данных. Скрипт запрашивает базу данных, помещает данные в массив с помощью цикла while, а в цикле while создает и отправляет электронное письмо.

Он работает нормально до тех пор, пока не будет отправлено 150 или около того писем, а затем случайным образом останавливается. Например, массовая рассылка электронной почты № 1 завершилась неудачей после отправки 161 электронного письма, массовая рассылка электронной почты № 2 завершилась неудачно после отправки 165 электронных писем, а массовая рассылка электронной почты № 3 завершилась неудачно после отправки 182 электронных писем.

Я исследовал и исследовал и не могу найти причину этого. Прямо сейчас я отправляю каждое электронное письмо в сообщении «Кому:» и не отправляю их с использованием маршрута BCC:. Может это настройки на моем сервере? Если да, то что я должен искать?

У меня также есть небольшая встроенная отладка. SQL-скрипт в конце добавляет электронное письмо в базу данных вместе с конкретным временем его отправки, так что я могу точно сказать, сколько отправлено, какое электронное письмо останавливает процесс, и сколько времени это занимает.

Электронные письма, на которых он останавливается, не имеют шаблона (это означает, что это разные поставщики электронной почты), и для отправки такого количества требуется всего около 10–12 минут. Тайм-аут моего сценария на сервере намного выше, так что это не причина.

Мой код выглядит следующим образом:

$mail = new PHPMailer();
$mail->IsSMTP();                                      // set mailer to use SMTP
$mail->Host = "*server ip here*";  // specify main and backup server
$mail->SMTPKeepAlive = true;                  // SMTP connection will not close after each email sent
$mail->SMTPAuth = false;     // turn on SMTP authentication
$mail->Username = "*user*";  // SMTP username
$mail->Password = "*pass*"; // SMTP password

while($select2 = sqlsrv_fetch_array($select)) {
$email = $select2['email'];
$unid    = $select2['id'];
$unemail = $select2['email'];
$to = $email;
$from = "[email protected]";
$new_date = date("n/j/y - g:i:s a");
$headers = "From: $from\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$message2 = "<html><body>";
$message2 .= $message;
$message2 .= "</body></html>";

$mail->From = "[email protected]";
$mail->FromName = "Newsletter";
$mail->AddAddress($to);
$mail->AddReplyTo("[email protected]", "Website.com");

$mail->IsHTML(true);                                  // set email format to HTML

$mail->Subject = $subject;
$mail->Body    = $message2;

if(!$mail->Send()) {
    die("mail() Failed to send email to $to.");
    echo "<br><br>Mailer Error: " . $mail->ErrorInfo;
    exit;
} else {
    $make_sent_query = "INSERT INTO emailssent (email_signup_id, email, datesent) VALUES (?, ?, ?)";
    $params_sent = array($unid, $to, $new_date);
    $add_to_sent = sqlsrv_query($conn, $make_sent_query, $params_sent);
    if($add_to_sent) {
        echo "Message sent for email $to<br>";
    } else {
        die("Mail sent, but failed to insert into Sent Emails database.");
    }
}

$mail->ClearAddresses();  //clear addresses for next loop
}

person Max Moskol    schedule 04.05.2012    source источник
comment
Вы нажимаете тайм-аут PHP или веб-сервера?   -  person Nate    schedule 05.05.2012
comment
Насколько я знаю, ни то, ни другое. Он просто случайно останавливается. Я установил время выполнения скрипта примерно на час, и оно останавливается через 15 ~ минут.   -  person Max Moskol    schedule 05.05.2012
comment
Отражает ли он какое-либо из ваших сообщений в цикле?   -  person Nate    schedule 07.05.2012
comment
Он повторяется при отправке сообщения и наличии ошибок. Однако никакая конкретная ошибка не приводит к полной остановке его работы. Я собираюсь попробовать сегодня с командой sleep() и посмотреть, что произойдет.   -  person Max Moskol    schedule 07.05.2012


Ответы (3)


Может ли это быть вызвано вашим локальным почтовым сервером? Если вы отправляете 150 писем за короткий промежуток времени, это может быть расценено как спам, и вы остановитесь, как только вы достигнете определенного количества.

Вы могли бы попробовать замедлить его с помощью sleep() после отправки каждого письма? Достаточно секунды или двух, если причина в этом....

Есть ли причина, по которой вы хотите избежать использования BCC? Вы можете отправлять электронную почту нескольким получателям и сократить количество отправляемых электронных писем до доли того, что вы отправляете сейчас, хотя это происходит за счет невозможности индивидуализировать каждое электронное письмо.

person andrewsi    schedule 04.05.2012
comment
У меня нет проблем с тем, чтобы попробовать BCC, просто мне кажется, что это будет выглядеть более спамно. Я знаю, что добавление записей SPF поможет в этом, хотя я все еще немного сомневаюсь в том, чтобы попробовать это. Я также не пробовал команду сна. Я думаю, что сделаю это и посмотрю, как это работает. - person Max Moskol; 05.05.2012

Я думаю, что это проблема тайм-аута. А crontab может решить вашу проблему http://en.wikipedia.org/wiki/Cron . Вы можете написать скрипт для отправки электронных писем и настроить свой crontab для запуска этого скрипта каждую минуту. Тогда у вас никогда не было тайм-аута.

person Mateusz Rogulski    schedule 04.05.2012

Одной из возможных причин может быть тайминг PHP для скрипта. Каждый скрипт запускается в течение ограниченного периода времени. Если ваш скрипт занимает больше времени, чем это, PHP просто убьет скрипт. Обычно это должно вызывать сообщение об ошибке в журналах ошибок. Проверьте сообщения журнала ошибок Apache — они могут содержать подсказку.

person Vaibhav Kaushal    schedule 27.02.2013