循环发送 PHPMailer

8
当我发送电子邮件时,我会收到两封邮件,但应该将电子邮件发送给各自的电子邮件地址。这是循环问题吗?
$array_values = Array
(
[0] => Array
(
[0] => uname1
[1] =>  fullname1
[2] => email 1


)
[1] => Array
(
[0] => uname2
[1] =>  fullname2
[2] => email 2


)
)
$f=0;
foreach($array_values as $mail_vars)
{

//$mail->AddReplyTo($mail_vars[2],'RED');
$mail->AddAddress($mail_vars[2], 'sss');
$body .="<br>";
$body .= 'Username: '. $mail_vars[0];
$body .="<br>";
$body .= 'Password: '.$mail_vars[1];
$body .="<br>";
$mail->SetFrom('email', 'FULLNAME');
$mail->Subject    = "NEW";
$mail->MsgHTML($body);
//$mail->Send();

$f++;
}

8
请先进行一些基本的调试。您正在引用一个根本不存在的 mail_vars[4] - Pekka
3个回答

40

阅读 PHP Mailer 的源代码,您需要清除字段。至少是地址,可能还有其他字段。以下是 PHPMailer 类中具有清除功能的代码段。您可以自由查看并尝试这些功能等。这显然是重新实例化新对象的替代方法,这可能会导致内存泄漏(取决于调用次数)。

因此,实现 clearAddresses 代码:

    $mail->Subject    = "NEW";
    $mail->MsgHTML($body);
    $mail->Send();
    $mail->ClearAddresses(); // should reset the To address and remove the first one from it.

我删除了实际的代码,因为你只需要描述和函数名称。

    /////////////////////////////////////////////////
  // CLASS METHODS, MESSAGE RESET
  /////////////////////////////////////////////////

  /**
   * Clears all recipients assigned in the TO array.  Returns void.
   * @return void
   */
  public function ClearAddresses() {
  }

  /**
   * Clears all recipients assigned in the CC array.  Returns void.
   * @return void
   */
  public function ClearCCs() {
  }

  /**
   * Clears all recipients assigned in the BCC array.  Returns void.
   * @return void
   */
  public function ClearBCCs() {
  }

  /**
   * Clears all recipients assigned in the ReplyTo array.  Returns void.
   * @return void
   */
  public function ClearReplyTos() {
  }

  /**
   * Clears all recipients assigned in the TO, CC and BCC
   * array.  Returns void.
   * @return void
   */
  public function ClearAllRecipients() {
  }

  /**
   * Clears all previously set filesystem, string, and binary
   * attachments.  Returns void.
   * @return void
   */
  public function ClearAttachments() {
  }

  /**
   * Clears all custom headers.  Returns void.
   * @return void
   */
  public function ClearCustomHeaders() {
  }

2
干得好,Brad。这是清理地址的最佳方式,而不是重新创建对象。这应该是被接受的答案...但只有一个人点赞了。 - vkGunasekaran

5

如果你查看php邮件发送器的代码,你会发现一个有用的方法ClearAllRecipients(),它可以同时清除所有的收件人、抄送和密送。


4

您需要:

$mail=new PHPMailer()

在你的for循环的开头-就像现在这样,第二次循环只是在处理第一个电子邮件(因为没有创建新的电子邮件)。
正如你所指出的那样,邮件正文也需要重置 - 实际上,像那样使用一个分离的变量并不是非常有用 - 最好直接提供给MsgHTML。由于你的电子邮件内容很简单,你可能还想发送数据的纯文本版本(取决于你的目标收件人)。
因此,更新后的脚本:
foreach($array_values as $mail_vars)
{
  $mail=new PHPMailer();
  $mail->SetFrom('email', 'FULLNAME');
  $mail->AddAddress($mail_vars[2], 'sss');

  $mail->Subject    = "NEW";

  $mail->MsgHTML("<br>\nUsername: ".$mail_vars[0]."<br>\nPassword: ".$mail_vars[1]."<br>");

  //$mail->Send();
  $f++;
}

循环中应在顶部重置 $body。 - mark rammmy
是的,没错 - 显然你已经让它工作了,足以弄清楚这一点 ;) 你真的不需要 $body 变量 {edited} - Rudu
如果您要发送密码(或任何个性化内容),在调用 $mail->MsgHTML() 之前,应先调用 $mail->AltBody = ''; ,否则电子邮件的文本版本将包含第一个收件人的内容。 - Hobo
1
这不够高效。1)在每次迭代中创建一个PHPMailer对象。2)当销毁时,PHPMailer会关闭与SMTP的连接。这意味着连接/电子邮件。你知道那不便宜... Brad的答案提供了一种更有效的方法。 - Wahib Mkadmi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接