Foreach为每个循环发送电子邮件

问题描述:

我有一个PHP foreach循环,通过电子邮件提示运行并发送电子邮件。 我的问题是,它会发送一封电子邮件给队列中每一行的每个邮件,因此可以说有50封电子邮件,我会收到50封电子邮件。不冷静Foreach为每个循环发送电子邮件

在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

运行它不会真正帮助你与你的问题,当它被插入每一封邮件,而是一个“在线等待”发音'队列',而不是'提示'。 – 2013-04-05 10:08:55

+1

你似乎想开始接收比你已经有的更多的垃圾邮件,因为你很高兴地显示你的电子邮件地址.... – 2013-04-05 10:09:20

+1

@loler我删除了一些看起来有效的邮件。 – 2013-04-05 10:13:19

我发现了!我忘了把

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

在脚本的结束,所以通过$mail->AddAddress($value);

几件事情:

  • 您可能会在BCC模式(密件抄送)发送一个邮件,因而没有一个接收器获取的所有电子邮件
  • 你可以在循环外运行SQL更新的其他邮件列表(多更新,分离),建立一个大的sql查询字符串,并在循环后执行它,这样可以节省一些沉重的SQL访问权限(尝试10000次更新或10000次记录)
  • 您可能总是使用SQL查询中使用的变量(即:$ letter_id)来自范围之外(所以你永远不知道它是否安全),否则你将容易受到sql注入的影响
  • 然后关于你var_dump:暂时看不到,var_dump放在哪里日e代码?