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

SendGrid多收件人场景下含+符号重复邮箱仅发一封问题

SendGrid is_multiple=True 下同一邮箱+变体仅发送一封的问题

我使用SendGrid的is_multiple=True参数批量发送邮件,原本功能正常,但当收件人包含同一主邮箱的带+符号变体(比如abc@gmail.com和abc+test@gmail.com)时,只能成功发送其中一封。用Gmail直接给这两个地址发信能正常收到两封,但SendGrid只发一封。相关代码如下:

message = Mail(
    from_email=From(self.sender, "Test"),
    to_emails=all_recipients,
    is_multiple=True,
)
all_recipients = [
            To(
                email=recipient["email"],
                dynamic_template_data=recipient["template_data"],
            )
            for recipient in recipients_and_template_data
        ]

问题原因

SendGrid默认会对收件人地址进行去重处理,它会忽略邮箱地址中+后面的后缀部分,将abc+test@gmail.com和abc@gmail.com判定为同一个收件人,因此只会发送一次邮件。而Gmail本身支持+后缀的别名机制,会将这类地址视为独立收件地址投递。

解决方法

要绕过这个去重逻辑,有两种可行方案:

方案一:为每个收件人单独创建邮件发送

循环遍历收件人列表,为每个地址单独生成Mail对象并发送,确保每个投递请求都是独立的:

from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail, From, To

sg = SendGridAPIClient("你的SendGrid API密钥")

for recipient in recipients_and_template_data:
    message = Mail(
        from_email=From(self.sender, "Test"),
        to_emails=To(
            email=recipient["email"],
            dynamic_template_data=recipient["template_data"],
        ),
        template_id="你的动态模板ID"  # 如果使用了动态模板
    )
    try:
        response = sg.send(message)
        print(f"发送至 {recipient['email']} 成功,状态码:{response.status_code}")
    except Exception as e:
        print(f"发送至 {recipient['email']} 失败:{str(e)}")

方案二:使用独立的Personalization块批量发送

通过为每个收件人创建独立的Personalization条目,保持批量发送的效率同时避免地址去重:

from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail, From, Personalization, To

message = Mail(from_email=From(self.sender, "Test"))
message.template_id = "你的动态模板ID"

# 为每个收件人添加独立的个性化设置
for recipient in recipients_and_template_data:
    personalization = Personalization()
    personalization.add_to(To(email=recipient["email"]))
    personalization.dynamic_template_data = recipient["template_data"]
    message.add_personalization(personalization)

sg = SendGridAPIClient("你的SendGrid API密钥")
try:
    response = sg.send(message)
    print(f"批量发送成功,状态码:{response.status_code}")
except Exception as e:
    print(f"批量发送失败:{str(e)}")

这种方式下,每个收件人对应一个独立的投递条目,SendGrid会将它们视为不同的目标地址,确保abc@gmail.com和abc+test@gmail.com都能收到邮件。

内容的提问来源于stack exchange,提问作者ManojPrabhakar M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:10:27