【问题标题】:How to use Mailgun's recipient-variables with Django SMTP mail backend?如何将 Mailgun 的收件人变量与 Django SMTP 邮件后端一起使用?
【发布时间】:2021-11-20 08:58:14
【问题描述】:

如何使用 SMTP 协议在 Django 中使用 MailGun 正确发送 batch/bulk/mass emails

到目前为止我尝试了什么?

这是我尝试发送电子邮件的代码 sn-p。

from django.core.mail import EmailMultiAlternatives
import json

to_emails = [
    "mail_1@example.com",
    "mail_2@example.com",
    "mail_3@example.com",
    "mail_4@example.com",
    "jerinpetergeorge@gmail.com",
]
mail = EmailMultiAlternatives(
    subject="Hey - %recipient.name%",
    body="Hey %recipient.name%,\n\nThis is just a batch email test!!!",
    from_email="JPG <me@somehost.com>",
    to=to_emails,
)
recipient_variables = {
    address: {"name": address} for address in to_emails
}
mail.extra_headers["X-Mailgun-Recipient-Variables"] = json.dumps(recipient_variables)
response = mail.send()
print(response)

我收到了如下邮件,

如我们所见,to 属性填充了所有电子邮件地址,这不是我所期望的.

那么,我如何告诉 Mailgun/Django 正确解析我的变量以使电子邮件看起来更个性化?


备注

  • 我更喜欢使用 SMTP 协议
  • 我已经尝试过 Mailgun 的 REST API,并且很成功(但是,我更喜欢 SMTP)
  • 我找到了django-anymail,似乎它有这个功能。但是,它也使用 API(如果我错了,请纠正我)

更新-1

  • to 参数更新为 to="%recipient%" 但是,得到了
    • TypeError: "to" 参数必须是列表或元组

  • to 参数更新为 to=["%recipient%"] 但是,得到了
    • smtplib.SMTPRecipientsRefused: {'=?utf-8?q?=25recipient=25?=': (501, b'无效命令或无法解析到地址')}

【问题讨论】:

    标签: python django email smtp mailgun


    【解决方案1】:

    如我们所见,to 属性填充了所有电子邮件地址,这不是我所期望的。

    Mailgun 不正确支持 SMTP。

    但是,依靠 Mailgun 中 BCC 的(不直观的)实现,有一个解决方法:

    mail = EmailMultiAlternatives(
        subject="Hey - %recipient.name%",
        body="Hey %recipient.name%,\n\nThis is just a batch email test!!!",
        from_email="JPG <me@somehost.com>",
        # to=to_emails,  # Replace this
        bcc=to_emails,   # with this
    )
    recipient_variables = {
        address: {"name": address} for address in to_emails
    }
    mail.extra_headers["To"] = "%recipient%"  # Add this
    mail.extra_headers["X-Mailgun-Recipient-Variables"] = json.dumps(recipient_variables)
    

    参考:https://stackoverflow.com/questions/37948729/mailgun-smtp-batch-sending-with-recipient-variables-shows-all-recipients-in-to-field


    1. 为什么to=["%recipient%"] 不适用于 SMTP?

    这是协议中的标准。

    来自https://documentation.mailgun.com/_/downloads/en/latest/pdf/

    如果提供的电子邮件地址未通过 RFC5321、RFC5322、RFC6854 的语法检查,SMTP 发送将出现“无法解析到地址”或“无法从地址解析”错误。

    1. 如何正确支持使用 Mailgun 进行批量发送?

    使用 API。

    来自https://stackoverflow.com/questions/30787399/laravel-5-sending-group-emails(多发至https://laracasts.com/discuss/channels/laravel/sending-email-to-1000s-of-reciepents):

    到目前为止,我已经创建了一组收件人电子邮件地址,将电子邮件发送到网站管理员类型的地址,并将最终收件人包含在密件抄送中

    虽然可行,但并不理想。

    我没有使用 Laravel 内置的 Mail,而是选择直接使用 Mailgun 的 API(特别是批量发送)

    这还允许我访问我的电子邮件模板中的唯一收件人变量

    (它不是特定于 Laravel/PHP,而是通过 Mailgun 的 SMTP。)

    1. 您所说的 Mailgun 中“不直观”的 BCC 实施是什么意思?

    Mailgun 使用收件人变量有效地为每个密件抄送收件人个性化电子邮件。

    来自https://github.com/mailgun/mailgun-js-boland/issues/89

    密件抄送人收到的电子邮件是发给他们的,而不是密件抄送的一部分

    当您实际上希望密件抄送收件人获得相同的内容时,这会导致一个单独的问题。

    来自https://stackoverflow.com/questions/48887866/bcc-in-mailgun-batch-send-does-not-include-substitutions

    在发送到密件抄送地址的副本中,没有进行recip_vars替换。

    据 Mailgun 的好心人说,这是不可能的,至少在当前版本的服务中是不可能的。

    【讨论】:

    • 这行得通并且有副作用(正如你提到的。)即使我开始使用 API,我很高兴我也得到了 SMTP 解决方案。所有参考都很棒,谢谢
    猜你喜欢
    • 2017-11-12
    • 2016-10-23
    • 2019-07-30
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多