2015-08-06 6 views
0

Я пытаюсь отправить электронные письма для взаимного использования людей с разными телами, используя один код, используя PHPMailer через SMTP. Мой код выглядит следующим образом:Несколько писем с PHPMailer

if ($_SERVER["REQUEST_METHOD"] == "POST") 
{ 
require_once("class.phpmailer.php"); 
$mail = new PHPMailer(); 
$mail->IsSMTP(); 
$mail->SMTPAuth = true;     
$mail->Host  = "xxxxxxxx"; 
$mail->SetFrom('[email protected]'); 
$mail->Subject = "System Change"; 

$add = array("a", "b", "c"); 
foreach ($add as $address) { 
$current = clone $mail; 
if ($address == 'a') 
{ 
    $current->AddAddress('[email protected]'); 
    $current->MsgHTML("Message1"); 
    $current->send(); 
} 
if ($address == 'b') 
{ 
    $current->AddAddress('[email protected]'); 
    $current->MsgHTML("Message2"); 
    $current->send(); 
} 
if ($address == 'c') 
{ 
    $current->AddAddress('[email protected]'); 
    $current->MsgHTML("Message3"); 
    $current->send(); 
} 
} 
exit; 
if($mail->Send()) 
{ echo "SUCCESSFUL"; } 
else echo "ERROR IN SENDING MAILS"; 
exit; 
} 
?> 

вопрос он отправляет почту, но только посылая первые 2, а затем отображая ошибку тайм-аута. Есть ли какой-либо параметр, который мне нужно изменить или это проблема с моим кодом? Редактировал его разными способами, но в итоге он отправляет только 2 письма вместо 3. Цените любую помощь :) Спасибо!

+3

Небольшая форма предупреждения: Я бы порекомендовал вызывать '' '$ current-> ClearAllRecipients()' '' после отправки почты. Это предотвращает отправку второй почты первому получателю, также когда '' '$ current-> send()' '' вызывается – AgeDeO

+1

Чтобы добавить: '$ mail-> ClearAddresses();', '$ mail-> ClearCCs() ; ',' $ mail-> ClearBCCs(); ',' $ mail-> clearAttachments(); ' – zanderwar

+0

Вы используете старую версию PHPMailer. Обновите его. – Synchro

ответ

2

Это, скорее всего, решит вашу проблему, нет необходимости клонировать объект PHPMailer.

Я отправил сотни писем сразу, используя этот метод без проблем с таймаутом.

if ($_SERVER["REQUEST_METHOD"] == "POST") 
{ 
    set_time_limit(120); 
    require_once("class.phpmailer.php"); 
    $mail = new PHPMailer(); 
    $mail->IsSMTP(); 
    $mail->SMTPAuth = true;     
    $mail->Host  = "xxxxxxxx"; 
    $mail->SetFrom('[email protected]'); 
    $mail->IsHTML(true); 
    $mail->Subject = "System Change"; 

    $add = array("a", "b", "c"); 

    foreach ($add as $address) { 
     $mail->clearAttachments(); 
     $mail->clearAllRecipients(); 

     if ($address == 'a') 
     { 
      $mail->AddAddress('[email protected]'); 
      $mail->Body("Message1"); 
      $mail->send(); 
     } 
     if ($address == 'b') 
     { 
      $mail->AddAddress('[email protected]'); 
      $mail->Body("Message2"); 
      $mail->send(); 
     } 
     if ($address == 'c') 
     { 
      $mail->AddAddress('[email protected]'); 
      $mail->Body("Message3"); 
      $mail->send(); 
     } 
    } 

    if($mail->send()) echo "SUCCESSFUL"; 
    else echo "ERROR IN SENDING MAILS"; 

    exit; 
} 
+0

Эй! Спасибо за ответ :) Я пробовал этот код, но все же он отправляет только 2 письма .. – SR1092

+0

Могу ли я спросить, какой SMTP-сервер вы используете? Имеются ли какие-либо ограничения? Что-то происходит на этой стороне вещей, у вас есть доступ к журналам? – zanderwar

+0

К сожалению, в журналах ошибок не отображаются ошибки – SR1092

2

Добавьте следующую строку коды после открытия цикла Еогеаспа

set_time_limit(60);

С помощью этой строки коды, вы даете каждой почте 60 секунд для отправки. Это число может быть как можно выше. Но я должен попытаться сохранить его как можно ниже.

Сброс timelimit до 60 секунд каждый раз, когда выполняется этот кусок кода. Возврат к нулю.

0

Оставьте свой код на the mailing list example provided with PHPMailer. Как правило, вы никогда не хотите делать такие вещи при загрузке страницы через веб-сервер - запустите его из cron, где тайм-ауты не являются проблемой.

+0

Он отправляет 3 письма .. Это не груз. * сдерживается от innuendo * – zanderwar

+0

Даже для одного сообщения SMTP не очень хорошо работает на загрузке страницы, хотя это не мешает многим делать это. В протоколе есть много мест, которые медленны, иногда преднамеренно. Если вам нужно это сделать, вы действительно хотите отправить на localhost или где-то поблизости с минимальными накладными расходами. – Synchro

+0

Яркий вызов, но серьезно не должен быть проблемой, с которой вы столкнулись бы при таком незначительном использовании (если только он не подключен к коммутируемому соединению с dial-up) – zanderwar

Смежные вопросы