使用 PHPMailer 发送时事通讯的最佳方式是什么?

What's the best way to send a newsletter with PHPMailer?

我正在尝试使用 PHPMailer 发送时事通讯,同时保护我的客户隐私。

起初我用mail->addAddress('customerEmail']);设置收件人配置,但我发现这样发送,每个收件人都可以看到其他客户的订阅者电子邮件地址。 我将 addAddress 更改为 mail->addBCC('customerEmail']); 这样它就不会显示每个电子邮件地址(事实上现在它甚至不会显示要发送给客户的收件人电子邮件地址) , 但这样如果有人想回复电子邮件,他们的回复也会发送给其他订阅者...

对您来说,面对这个问题的最佳选择是什么?

电子邮件服务器不使用邮件 headers 来传递邮件。当您发送电子邮件时,您的电子邮件客户端会保持这样的对话*:

EHLO example.com
MAIL FROM: mail@example.com
RCPT TO: info@example.net, customers@example.org, john@example.com
DATA
From: Me <webmaster@example.com>
To: Customers <whatever@example.com>
Subject: Important info
Dear Blah,

Blah blah.

Regards,
.

(*)它一个对话,因为它包括服务器对每个命令的响应,但我省略了那部分。

真正重要的是 DATA 块之前的特定命令中提供的信息。当然,大多数邮件工具会创建 headers 来匹配处理指令中的地址,但这样的 headers 仅供参考,它们不需要完全相同。事实上,这就是密件抄送的实际工作方式:您指示您的邮寄者将电子邮件发送到这样的地址,但从 headers.

中省略了它

所以:

  • 你可以很快完成(密件抄送和一条消息给所有人)
  • 你可以做得很好(收件人和每个收件人一封邮件)

如果您征求我的意见,知道新闻稿发送到的确切 e-mail 地址总是很好的——我们中的许多人都有多个地址。如果您想提供自动取消订阅链接,实际上必须发送自定义消息。

正如我所建议的那样,管理时事通讯的最佳方式是将电子邮件单独发送给每个客户,尽管这意味着发送时间会略有增加。这样您就可以提供自动退订链接和其他您无法提供的功能。

为了实现这一点,我只是做了一个简单的循环,从我的数据库中获取地址:

$sql = "SELECT `email` FROM `emails`";
$statement = $db->prepare($sql);
$statement->execute();

while ($fila = $statement->fetch()) {
    if(!empty($fila['email'])){
        $mail->addAddress($fila['email']);
        $success = $mail->Send();
        $mail->clearAllRecipients(); //Don't forget this!
    }
}

方法 clearAllRecipients(); 非常重要,因为它会清除最后一圈收件人,这样电子邮件的 'to' 部分就不会显示您所有的时事通讯收件人。