PHPmailer не работает в цикле

O6
На сайте с 27.07.2013
Offline
0
1948

Буду очень-очень благодарна, если поможете разобраться с PHPmailer

На данный момент обработчик формы с сайта записывает все сообщения в очередь в базу данных, а потом кроном запускается PHP скрипт который отправляет очередь в цикле по 10 писем в минуту.

На деле скрипт отправляет одно письмо, а потом 9 раз вылетает с ошибой Invalid Address: (тут пустая строка в качестве адреса). При следующем запуске отправляет еще одно письмо и 8 раз вылетает с той же ошибкой.

Скрипт правильно отправляет все 10 писем, если писать так:


send($to, $subject, $content);

function send($to, $subject, $content){
for($i=0; $i<10; $i++){
/* Код отправки */
}
}

Скрипт отправляет только одно письмо из 10 и 9 раз вылетает с ошибкой, если писать вот так:


for($i=0; $i<10; $i++){
send($to, $subject, $content);
}

function send($to, $subject, $content){
/* Код отправки */
}

Под словами "Код отправки" я подразумеваю:


require_once('sql/smtp_login.php');
require_once('../php/class_mail/class.phpmailer.php');
$mail = new PHPMailer(true);
try {
$mail->IsSMTP();
$mail->CharSet = 'UTF-8';
$mail->Host = $__smtp['host'];
$mail->SMTPDebug = $__smtp['debug'];
$mail->SMTPAuth = $__smtp['auth'];
$mail->Port = $__smtp['port'];
$mail->Username = $__smtp['username'];
$mail->Password = $__smtp['password'];
$mail->AddReplyTo($__smtp['username']);
$mail->AddAddress($to);
$mail->SetFrom($__smtp['username']);
$mail->Subject = $subject;
$mail->MsgHTML($content);
$res = $mail->Send();
$mail->SmtpClose();
$mail->ClearReplyTos();
$mail->ClearAddresses();
return $res;
} catch (phpmailerException $e) {
echo $e->getMessage()."<br>";
echo $e->getFile()."<br>";
echo $e->getLine()."<br>";
var_dump($e->getTrace());
return false;
}

Совершенно не могу понять, в чем проблема(( Помогите, пожалуйста.

Мне необходима функция отправки писем в цикле.

dlyanachalas
На сайте с 15.09.2006
Offline
693
#1

Вероятно, у сервера ограничение на отправку писем в минуту.

IL
На сайте с 20.04.2007
Offline
435
#2
dlyanachalas:
Вероятно, у сервера ограничение на отправку писем в минуту.

там вроде написано, что отправляет, если с циклом "поиграться"

Oira666:
Мне необходима функция отправки писем в цикле.

              $mail->ClearAddresses();

Сделайте в цикле вывод адресов.. посмотрите, что и куда он пытается отправить. И ещё "от кого".

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
O6
На сайте с 27.07.2013
Offline
0
#3
ivan-lev:

Сделайте в цикле вывод адресов.. посмотрите, что и куда он пытается отправить. И ещё "от кого".

Пытается отправть что нужно куда нужно(((

Когда просматриваю трассировку ошибки, вижу, что ошибку выкидывает метод AddReplayTo()

Ему в качестве адреса кто-то передает пустую строку.

Если цикл внутри функции, то этого не происходит.

Еще одну вещь замечала - когда функция отправки вызывается в цикле, при повторном вызове она не авторизуется заново на SMTP сервере(((пробовала подсунуть ей некорректный пароль - она его съедает без ошибки). А если цикл внутри функции - то авторизация происходит каждый раз.

Скорее всего, я чего-то не понимаю в принципе работы SMTP. Такое ощущение, что соединение между иттерациями цикла сохраняется, несмотря на то, что в конце функциии вызывается метод SmtpClose()

Других идей нет и что с этой идеей делать тоже не знаю(((

IL
На сайте с 20.04.2007
Offline
435
#4
Oira666:
Ему в качестве адреса кто-то передает пустую строку.

Если цикл внутри функции, то этого не происходит.

Ну, не кто-то, а вполне конкретный...

              $mail->AddReplyTo($__smtp['username']);

Можете добавить

global $__smtp; 
в начало функции, но лучше вынести в параметры.

Не поможет, видимо, т.к. скорее всего хранится всё это в sql/smtp_login.php и вызывается require_once один раз. Первый только.

Даже нет, не так.. в зависимости от того, что в sql/smtp_login.php (есть ли там функции или нет)

- заменить require_once на require

- сохранять значение $__smtp['username'] между вызовами функций (например, в static)

O6
На сайте с 27.07.2013
Offline
0
#5
ivan-lev:

Даже нет, не так.. в зависимости от того, что в sql/smtp_login.php (есть ли там функции или нет)
- заменить require_once на require
- сохранять значение $__smtp['username'] между вызовами функций (например, в static)

Функций там нет. Там $__smtp = Array(тут конфиг);

Спасибо!!!!!

Проблема, как оказалось, действительно в этом.

Эта функция будет методом класса, поэтому написала конструктор, который параметры сразу запишет в свойство объекта.

Заработало.

Спасибо!!!!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий