【问题标题】:PHPMailer sending double emailsPHPMailer 发送双重电子邮件
【发布时间】:2017-01-16 20:23:16
【问题描述】:

我正在开发从 DB 获取客户电子邮件、将它们存储在数组中、遍历数组并分别向每个客户发送电子邮件的应用程序。

当 PHPMailer 向客户发送双封电子邮件时出现问题,并且在其中一个电子邮件“收件人”字段中包含收件人地址,并且在第二封电子邮件中也有第二个客户电子邮件。

我认为这是一个漏洞。

这是我的代码: $array = [ 0 => 'email@gmail.com' , 1 => 'email2@gmail.com' ]; //示例

foreach ($array as $key => $value) {
    $mail->addAddress($value);
    if (!$mail->send())
    {
        throw new Exception($mail->ErrorInfo);

    } else
    {
        $mail->addAddress(NULL); //Attempt to unset 
        header('Location: ../public/email.php'); //Redirect to start page

    }

}

总结一下:运行时,它会向“email@gmail.com”和“email2@gmail.com”发送电子邮件。

第一封电子邮件将获得一份电子邮件副本。 第二封电子邮件将获得同一封电子邮件的两份副本,第一封显示自己为收件人,第二封显示自己是收件人+其他客户的电子邮件。

我只用 2 个获取的客户端对此进行了测试,我猜会有更多的重复。 谢谢各位!

【问题讨论】:

标签: php mysql email phpmailer


【解决方案1】:

我认为您正在重复使用 $value。尝试使用 unset($value);看看它是否有帮助。也可以看here

警告 即使在 foreach 循环之后,对 $value 和最后一个数组元素的引用仍然存在。建议通过 unset() 将其销毁。否则您将遇到以下行为:

【讨论】:

    【解决方案2】:

    这里有两个问题:

    • 您并未从邮件中删除地址,因此当您添加第二个地址时,第一个地址仍然存在,并且两者都会看到另一个地址。
    • 您正在循环中使用header 重定向,而没有终止您的脚本。这可能会导致重定向后的代码运行,但无法保证运行多少和多久。

    您可以通过在循环结束时清除收件人来解决的第一个问题:

    $mail->ClearAllRecipients();
    

    至于第二个问题,您不应该在循环内的任何地方重定向,当您在发送完所有消息后重定向时,您应该使用exit; 退出您的 scipt,这样之后就不会执行任何操作。

    【讨论】:

    • 你是对的。 header() 的愚蠢错误。谢谢大佬,成功了。不知道 ClearAllRecipients() 虽然 :-) 再次感谢!
    猜你喜欢
    • 2019-04-16
    • 2014-07-04
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 2019-01-19
    相关资源
    最近更新 更多