【问题标题】:for loop in phpmailerphpmailer中的for循环
【发布时间】:2012-12-08 18:05:17
【问题描述】:

我正在尝试将电子邮件发送给 10 个不同的用户,我已将变量 $friendsEmails 放入一个包含 10 个不同电子邮件的数组中,但是看起来它将为每封 10x10 的电子邮件复制 10 个。难道我做错了什么?

  for($i =0; $i<11; $i++){

    $mail->SetFrom($email, $name);

    $mail->AddReplyTo($email,$name);

    $mail->Subject    = "We wish you a merry Christmas";

    $mail->AltBody    = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test

    $mail->MsgHTML($body);

    $mail->AddAddress($friendsEmails[$i], $friendsNames[$i]);

    if(!$mail->Send()) {
      echo "Mailer Error: " . $mail->ErrorInfo;
    } else {
      echo "Message sent!";
    }

       }

【问题讨论】:

  • 如果您的数组索引为零,那么您希望该循环条件为 $i
  • 是的,它给了我 100X 封电子邮件

标签: php phpmailer


【解决方案1】:

难怪您要发送多封电子邮件,因为在 for 循环的每次迭代中,您只是在添加新地址。在添加新的电子邮件地址之前,使用 PHPMailer::clearAllRecipients() 从上一次迭代中删除数据。

for($i =0; $i<11; $i++){
    $mail->SetFrom($email, $name);
    $mail->AddReplyTo($email,$name);
    $mail->Subject    = "We wish you a merry Christmas";
    $mail->AltBody    = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
    $mail->MsgHTML($body);
    $mail->AddAddress($friendsEmails[$i], $friendsNames[$i]);

    if(!$mail->Send()) {
      echo "Mailer Error: " . $mail->ErrorInfo;
    } else {
      echo "Message sent!";
    }
    $mail->clearAllRecipients(); // Clear all recipient types(to, bcc, cc).
}

【讨论】:

  • 如果有很多邮件,这会不会杀死请求或请求超时?
  • 如果配置的最大执行时间最终太低,这就是为什么必须增加它(如果可能的话)或者这个脚本需要通过某种排队系统来实现,这将允许脚本超时触发。
【解决方案2】:

将电子邮件地址放在数组中的键值对中更容易。所以键是你朋友的名字,值是电子邮件地址。并使用 foreach 循环遍历整个数组,而无需确定数组中有多少项。

哦,在每个循环中重新实例化您的邮件对象,不要让它也发送每封最后一封电子邮件(不确定,但这可能会发生)

试试这样的:

$friendsEmails = array('name' => 'email_address');

foreach($friendsEmails as $name => $email) {

    $mail = new Mailer();

    $mail->SetFrom($name);

    $mail->AddReplyTo($name);

    $mail->Subject = "We wish you a merry Christmas";

    $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test

    $mail->MsgHTML($body);

    $mail->AddAddress($email, $name);

    if(!$mail->Send()) {
      echo "Mailer Error: " . $mail->ErrorInfo;
    } else {
      echo "Message sent!";
    }
}

【讨论】:

    【解决方案3】:

    也许在每次迭代结束时,您应该清理您的 mail 对象。

    另一种选择是在循环开始时实例化一个不同的邮件类。

    【讨论】:

    • 我发现我从 $body .= 开始,这是我不应该开始的起点,我应该使用正常的 $body = "my html"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2021-07-30
    相关资源
    最近更新 更多