首页 文章

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

提问于
浏览
1

我试图让批量发送工作在SMTP上,但即使我发送给多个收件人并且我已经指定了用户变量(并且变量在发送的电子邮件中成功替换),每个收件人都会显示在接收器上生成的消息的To:字段中 .

每个MailGun的文档Batch Sending ...

警告:使用批量发送也使用收件人变量很重要 . 这告诉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"
    }
}

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

2 回答

  • 1

    昨天我开始搞乱这个,我想我找到了解决方案 .

    诀窍是将To:地址留空,并将收件人添加到BCC行 . 然后,添加自定义 Headers - 收件人:%收件人% . $ 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';
    }
    
  • 0

    我也是不成功的 . 我输了一封邮件故障单 . 这是他们回应的本质:

    我们文档中的“警告”实际上仅用于API,而不是SMTP . 这样做的原因是,在使用API时,我们会形成/创建电子邮件,并允许我们的服务在“收件人:”字段中为每个收件人分隔并创建新电子邮件 . 但是,当使用SMTP时,我们只是使用提交给我们服务的内容中继消息,我们实际上并不是从头开始创建消息MIME . 要解决此问题,您可以在收件人:字段中输入%recipient% . 这将在与我们的服务器的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." 我不熟悉其他邮件程序,但如果有任何允许此构造,我会感到惊讶 .

相关问题