Изпратете само първите 150 имейла и ще получите вътрешна грешка на сървъра, когато се опитате да изпратите повече от 200 имейла с phpmailer

Моят код получава имейли от базата данни и му изпраща имейл с помощта на цикъл. Ако изпратя имейлите в групи от 25, това работи правилно, но когато таблицата надвиши 200 или 300 имейла, получавам тази грешка на екрана и изпращам само първите 150 имейла:

"Вътрешна грешка на сървъра

Сървърът се натъкна на вътрешна грешка или неправилна конфигурация и не успя да изпълни вашата заявка.

Моля, свържете се с администратора на сървъра, [email protected] и ги информирайте за часа на възникване на грешката и всичко, което може да сте направили, което може да е причинило грешката.

Повече информация за тази грешка може да има в регистъра на грешките на сървъра.

Освен това беше открита грешка 404 Not Found при опит за използване на ErrorDocument за обработка на заявката."

Проверявам регистъра на грешките на сървъра и е празен и мисля, че не е проблем с ограничението на smtp хостинг.

Има ли нещо, което правя грешно?

Редактиране: Грешката се появява 30 секунди след зареждане на мрежата.

Сървърът е в безопасен режим = изключен

Използвам:

ini_set('max_execution_time', 300);

Също така добавям в рамките на цикъла:

set_time_limit(3);

Но грешката все още е на 30 секунди.

Код:

require '../phpmailer/PHPMailerAutoload.php';
@MYSQL_CONNECT("xxx","xxx","xxx");
@mysql_select_db("xxx");
$query  = "SELECT * FROM users";
$result = @MYSQL_QUERY($query);
while ($row = mysql_fetch_array ($result)) {
    $mail = new PHPMailer();
    $mail->isSMTP();
    $mail->Host = 'smtp.xxx.com';
    $mail->SMTPAuth = true;
    $mail->SMTPKeepAlive = true;
    $mail->SMTPSecure = 'tls';
    $mail->Port = 587;
    $mail->Username = '[email protected]';
    $mail->Password = 'xxx';
    $mail->From = '[email protected]';
    $mail->FromName = '[email protected]';
    $mail->AddAddress($row["mail"]);
    $mail->Subject = 'xxx';
    $mail->Body = 'Hello World';
    $mail->IsHTML(true);
    $mail->CharSet = 'UTF-8';
    if (!$mail->send()) {
        echo "Mailer Error: " . $mail->ErrorInfo;
    } else {
        echo "Message sent to ".$row["mail"];
    }
}

Много благодаря.


person JoanR    schedule 24.02.2015    source източник
comment
Строго ли е 150? или около 150? Ако първото, това е някакъв вид връзка или SMTP ограничение в една връзка. Ако е второто, подозирам, че е някакъв проблем с уеб сървъра или phpmailer.   -  person mark.sagikazar    schedule 24.02.2015
comment
Понякога изпращайте първо 142, 131, 135...   -  person JoanR    schedule 25.02.2015


Отговори (2)


Изхвърляте много производителност в този код и в резултат на това използвате прекомерни връзки. Опитайте да започнете с примерния код на пощенския списък, предоставен с PHPMailer. Вашият PHPMailer вероятно също се нуждае от актуализиране.

Използвате остарелите mysql_* функции - вместо това използвайте mysqli или PDO.

Грешката може да е просто ограничение във времето или паметта - проверете вашите max_execution_time и memory_limit настройки в php.ini - но наистина трябва да погледнете в регистрационните файлове на вашия сървър, за да откриете причината. Ако не успеете, можете временно да активирате изхода за грешка.

person Synchro    schedule 24.02.2015
comment
+1 за това, особено без използване на mysql_query и т.н. Всички тези функции са отхвърлени и НЕ ТРЯБВА да се използват. - person James Spence; 24.02.2015
comment
Благодаря Synchro! Актуализирах кода си с примера, предоставен с PHPMailer, но все още имам същия проблем. Моето max_execution_time е 30sec Опитвам се да променя, но ini_set('max_execution_time', 300); или set_time_limit(3); нямаше ефект. Безопасният режим на сървъра е изключен. И нямам достъп до php.ini или .htacces. - person JoanR; 25.02.2015
comment
Имате ли локален пощенски сървър? постфикс или нещо подобно? Ако е така, можете да превключите към isMail() (или SMTP към localhost), което би било много по-бързо. Просто звучи така, сякаш скриптът ви отнема повече време, отколкото позволява сървърът ви. Алтернативата е да го стартирате от cron задание, тъй като това няма да има нисък таймаут и избягва необходимостта да имате включен браузър и уеб сървър. - person Synchro; 25.02.2015

Заспивайте между изпращането на партиди имейли (може да достигате ограничение за максимално изпращане на секунда). Също така поставете try catch около всеки опит за изпращане и регистрирайте изключението. Може би попадате на лош имейл адрес.

Също така конструкторът $mail вероятно трябва да е извън цикъла, с разрешени изключения. Просто създайте един обект и го използвайте повторно.

person Kevin Seifert    schedule 24.02.2015
comment
Ако не разрешите изключения в конструктора, няма да има изключения за улавяне. - person Synchro; 24.02.2015