使用“收件人变量”发送的MailGun SMTP批量显示“收件人”字段中的所有收件人

时间:2016-06-21 15:33:39

标签: php email smtp mailgun

我正在尝试让批量发送通过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"
    }
}

生成的电子邮件只应在“收件人”字段中为每封电子邮件显示一个收件人。我错过了什么吗?

3 个答案:

答案 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 
] );