如何通过Django SMTP后端使用Mailgun recipient-variables发送批量邮件
解决方案
你遇到的问题是因为将所有收件人直接填入to参数,导致SMTP协议默认将所有收件人地址公开在邮件头中,同时也无法触发Mailgun的单收件人变量替换逻辑,按以下步骤修改即可解决:
- 调整收件人字段配置:不要将真实收件人列表放在
to参数中,改为放到bcc参数,to参数可填入一个你的发信域名下的通用地址即可 - 保留
X-Mailgun-Recipient-Variables的配置不变,Mailgun会自动识别bcc列表中的地址,匹配你配置的变量,为每个收件人生成独立的个性化邮件,且每个收件人只会在to字段看到自己的地址,不会暴露其他收件人信息
修改后的代码示例:
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=["no-reply@somehost.com"], # 替换为你自己域名下的通用地址即可 bcc=to_emails # 真实收件人全部放bcc字段 ) 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)
补充说明
你之前尝试填入%recipient%到to参数报错,是因为Django原生SMTP后端会在提交请求到Mailgun之前先校验收件人地址格式合法性,占位符%recipient%不符合邮箱格式规则,直接被拦截报错,不需要用这种配置方式。
你提到的django-anymail也支持SMTP模式的批量发送配置,不需要强制调用API,不过按上述修改方法,用原生django.core.mail.backends.smtp.EmailBackend就可以实现你的需求。
内容的提问来源于stack exchange,提问作者JPG
相关产品推荐
相关产品推荐

