【问题标题】:Foreach sends email for every loopForeach 为每个循环发送电子邮件
【发布时间】:2013-04-05 18:34:10
【问题描述】:

我有一个 PHP foreach 循环,它通过电子邮件提示运行并发送电子邮件。 我的问题是它会从提示中的每一行向提示中的每封邮件发送一封电子邮件,所以假设提示中有 50 封邮件,我将收到 50 封电子邮件。不爽

foreach 是这样的:

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

require_once(INCLUDE_DIR."/class.phpmailer.php");
$mail = new PHPMailer();
$mail->From     = "tegl@xxxxxxx";
$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("morten@domain.dk", "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-&gt;email_row) outside the foreach 我得到 array(2) { [0]=&gt; string(17) "morten@domain1.dk" [1]=&gt; string(14) "morten@domain2.dk" } 但在里面我得到

array(2) { [0]=> string(17) "morten@adomain1.dk" [1]=> string(14) "morten@domain2.dk" } 
array(2) { [0]=> string(17) "morten@domain1.dk" [1]=> string(14) "morten@domain2.dk" }

【问题讨论】:

  • 它不会真正帮助您解决您的问题,但“等待线”的发音是 queue,而不是 cue
  • 您似乎想开始收到比您已经拥有的更多的垃圾邮件,因为您非常乐意显示您的电子邮件地址......
  • @loler 我删除了一些看起来像有效的。

标签: php arrays loops foreach phpmailer


【解决方案1】:

我找到了!我忘记放了

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

在脚本的末尾,所以它在运行$mail-&gt;AddAddress($value);时插入每封邮件

【讨论】:

    【解决方案2】:

    几件事:

    • 您可能会以密件抄送模式(密件)发送一封邮件,因此没有一个收件人会收到所有其他邮件列表
    • 您可以在循环之外操作 sql 更新(使用 , 分隔进行多次更新),构建一个大的 sql 查询字符串并在循环之后执行一次,这样您就可以节省大量 SQL 访问,(尝试 10000 次不同的更新或一次10000 条记录)
    • 您可能总是逃避 SQL 查询中使用的变量(即:$letter_id)来自范围之外(因此您永远不知道它是否安全),否则您将容易受到 sql 注入的攻击
    • 那么关于您的 var_dump :暂时看不到,代码中的 var_dump 放在哪里?

    【讨论】:

      猜你喜欢
      • 2018-01-27
      • 2016-08-13
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 2021-12-30
      相关资源
      最近更新 更多