You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Django SMTP后端使用Mailgun recipient-variables发送批量邮件

解决方案

你遇到的问题是因为将所有收件人直接填入to参数,导致SMTP协议默认将所有收件人地址公开在邮件头中,同时也无法触发Mailgun的单收件人变量替换逻辑,按以下步骤修改即可解决:

  1. 调整收件人字段配置:不要将真实收件人列表放在to参数中,改为放到bcc参数,to参数可填入一个你的发信域名下的通用地址即可
  2. 保留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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:06:03