2013-04-05 7 views
2

У меня есть цикл foreach PHP, который проходит через электронную почту и отправляет электронное письмо. Моя проблема заключается в том, что он отправляет электронное письмо по каждой почте из метки для каждой строки в ключе, так что, скажем, 50 писем в реплике, я получу 50 писем. Не крутоForeach отправляет электронную почту для каждого цикла

Еогеасп это:

$cue = new NewsletterHandler;  
$cue->GetEmailCue($letter_id, $lhash); 

require_once(INCLUDE_DIR."/class.phpmailer.php"); 
$mail = new PHPMailer(); 
$mail->From  = "[email protected]"; 
$mail->FromName = "Randers Tegl"; 
$mail->Host  = "smtp.xxxxx.dk"; 
$mail->Mailer = "smtp"; 

foreach($cue->email_row as $key => $value) { 
    $mail->AddAddress($value); 
    $mail->Subject = $subject ." - ". date("d-m-Y"); 
    $mail->Body = $this->htmlTemplate;  

    if(!$mail->Send()) { 
     echo "E-mailen er ikke sendt til ". $value; 
     echo "Mailer Error: ". $mail->ErrorInfo; 
     echo "<br />"; 
     mail("[email protected]", "Error", "Letter not send. ". $mail->ErrorInfo .""); 
    } else { 
     $sql_update = "UPDATE newsletter_emailcue SET time_recieved = NOW() WHERE email = '". $value ."'"; 
     SQLHandling::SQLquery($sql_update);  
     echo "Newsletter send to ". $value ."<br />"; 
    } 
} 

функция GetEmailCue:

function GetEmailCue($letter_id, $lhash) { 

     $sql = "SELECT * FROM newsletter_emailcue WHERE mail_to_recieve = '". $letter_id ."' AND time_recieved = '0000-00-00 00:00:00' LIMIT 50"; 
     $result = SQLHandling::SQLquery($sql); 

     if(mysql_num_rows($result) < 1) { 
      Main::txtOutput("Der er ikke nogle modtagere til nyhedsbrevet", "TXT_ERR"); 

      /*** If there aren't any emails in the cue table, but a pending letter was found 
      * that letter will be updated with '2' in status, which is send completed. 
      */ 
      $sql_update = "UPDATE newsletter_items SET status = 2 WHERE letter_id = '". $letter_id ."'"; 
      SQLHandling::SQLquery($sql_update); 
     } else {    
      while($row = mysql_fetch_array($result)) { 
       $this->email_row[] = $row["email"]; 
      } 
     } 

      return $this->email_row; 
     } 

если я var_dump($cue->email_row) outside the foreach я получаю array(2) { [0]=> string(17) "[email protected]" [1]=> string(14) "[email protected]" } но внутри я получаю

array(2) { [0]=> string(17) "[email protected]" [1]=> string(14) "[email protected]" } 
array(2) { [0]=> string(17) "[email protected]" [1]=> string(14) "[email protected]" } 
+1

Это не будет реально помочь вам с вашим вопросом, но «ожидания линии» произносится 'queue', а не' cue'. –

+1

Вы, похоже, хотите получить больше спама, чем у вас уже есть, потому что вы так счастливо показываете свои адреса электронной почты .... –

+1

@loler Я удалил некоторые из них, которые выглядели как действительные. –

ответ

1

Я нашел его! Я забыл поставить

$mail->ClearAddresses(); 
$mail->ClearAttachments(); 

в конце сценария, поэтому он вставлял каждую почту при запуске через $mail->AddAddress($value);

0

несколько вещей:

  • вы можете отправить одну почту в режиме BCC (слепая копия), так что никто получатель не получит всю другой список рассылки писем
  • вы можете работать обновление SQL вне цикла (мульти обновления с, отделяя), построить один большой sql-запрос и выполнить его после цикла, чтобы вы сохранили некоторый тяжелый многопользовательский доступ SQL (попробуйте с 10000 различными обновлениями или один раз для 10000 записей)
  • вы можете ВСЕГДА избегать SQL переменных, используемых в запросе (то есть: $ letter_id), выходящие за пределы области действия (так что вы никогда не знаете, безопасно ли это), или вы будете уязвимы для SQL-инъекции
  • то о чем вы var_dump: не видите на данный момент, где размещены var_dump в го e код?
Смежные вопросы