我正在尝试让批量发送通过SMTP工作,但即使我发送给多个收件人并且我已经指定了用户变量(并且变量在发送的电子邮件中成功替换) ),每个接收者都会出现在接收者生成的消息的To:字段中。
关于Batch Sending的每篇MailGun文档......
警告:使用批量发送同时使用收件人变量非常重要。这告诉Mailgun向每个收件人发送一封电子邮件,其中只有他们的电子邮件在收件人字段中。如果未使用它们,则所有收件人的电子邮件地址将显示在每个收件人的收件人字段中。
以下是我的SMTP标头示例...
To: foo@example.com, bar@example.com
X-Mailgun-Recipient-Variables: {
"foo@example.com":
{
"id":"12345",
"email":"foo@example.com",
"first_name":"Foo"
},
"bar@example.com":
{
"id":"45678",
"email":"bar@example.com",
"first_name":"Bar"
}
}
生成的电子邮件只应在“收件人”字段中为每封电子邮件显示一个收件人。我错过了什么吗?
答案 0 :(得分:1)
昨天我开始搞乱这个,我想我已经找到了解决方案。
诀窍是将To:地址留空并将收件人添加到BCC行。然后,添加自定义标题 - 收件人:%收件人%。 $ mail-> send()不会投诉,收到的电子邮件中的收件人:字段只显示收件人的个人电子邮件。
代码示例:
$mail = new PHPMailer();
$mail->isSMTP();
$mail->Host = 'smtp.host';
$mail->SMTPAuth = true;
$mail->Username = 'yourUserName';
$mail->Password = 'yourPassword';
$mail->SMTPSecure = 'tls';
$mail->From = 'email@server.net';
$mail->FromName = 'John Doe';
$mail->addBCC('foo1@bar.com');
$mail->addBCC('foo2@bar.com');
$headerLine = $mail->headerLine('X-Mailgun-Recipient-Variables', '{"foo1@bar.com": {"first":"FooBar1", "id":1}, "foo2@bar.com": {"first":"FooBar2", "id": 2}}');
$mail->addCustomHeader($headerLine);
$headerLine = $mail->headerLine('To','%recipient%');
$mail->addCustomHeader($headerLine);
$mail->Subject = 'Hello, %recipient.first%!';
$mail->Body = 'Hello %recipient.first%, Your ID is %recipient.id%.';
if(!$mail->send())
{
echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
}
else
{
echo 'Message has been sent';
}
答案 1 :(得分:0)
我也是不能成功的。我输了一封邮件故障单。以下是他们回应的实质:
我们文档中的“警告”实际上仅针对API,而不是SMTP。这样做的原因是,在使用API时,我们会形成/创建电子邮件,并允许我们的服务在“收件人:”字段中为每个收件人分隔并创建新电子邮件。但是,当使用SMTP时,我们只是使用提交给我们服务的内容中继消息,我们实际上并不是从头开始创建消息MIME。
要解决此问题,您可以在收件人:字段中输入%收件人%。这将在与我们的服务器的SMTP会话期间为“RCPT TO”中指定的每个地址创建单独的消息。现在,这是事情变得有点棘手,因为我对ASP SMTP连接器的不熟悉开始显示在这里。在我的研究中,我还没有找到使用ASP SMTP连接器指定RCPT TO的方法。它似乎依赖于您在To中输入的内容,并未提供指定To:字段和RCPT TO:字段的方法。
当我尝试使用%recipient%作为TO变量时,其内置方法会引发错误,"CDO.Message.1 error '8004020c' At least one recipient is required, but none were found."
我不熟悉其他邮件程序,但如果有任何允许此构造,我会感到惊讶。
答案 2 :(得分:0)
对 WordPress 网站有相同的要求,这是我为那些需要它的人带来的东西:
class PHPMailerForMailgunBatch extends PHPMailer {
public function createHeader() {
$header = parent::createHeader();
$header = preg_replace( "/To: .*\n/", "To: %recipient%\n", $header );
return $header;
}
}
然后
global $phpmailer;
$phpmailer = new PHPMailerForMailgunBatch( true );
// Config mailgun SMTP here
$mailgunBatchHeader = "X-Mailgun-Recipient-Variables: " . json_encode( $yourMailgunBatchVariables );
wp_mail( $emails, $subject, $content, [
$mailgunBatchHeader
] );