Sendgrid Python库发送邮件返回空响应体,如何获取sg_message_id?
解决SendGrid发送邮件后获取sg_message_id的问题
SendGrid的v3 API返回202状态码时,响应体确实是空的——这是因为邮件此时仅进入SendGrid的发送队列,尚未完成处理,因此不会在响应体中返回消息ID。要实现发送记录与webhook事件的关联,有两种可靠方案:
方案一:自定义唯一标识(推荐)
自己生成一个唯一ID(比如UUID),通过邮件的custom_args参数附加到邮件上,发送时将这个ID存入数据库。当webhook触发打开/点击等事件时,事件数据里会包含这个自定义参数,直接用它匹配数据库记录即可。
示例代码:
import uuid # 生成自定义唯一标识 my_message_id = str(uuid.uuid4()) message = Mail( from_email=from_email, to_emails=recipients, subject=subject, plain_text_content=text_content, html_content=html_content ) # 添加自定义参数,用于后续关联 message.custom_args = {"internal_message_id": my_message_id} message.tracking_settings = TrackingSettings( open_tracking=OpenTracking(enable=True) ) try: sg = SendGridAPIClient(api_key=sendgrid_key) sg.send(message) # 将自定义ID和发送记录绑定存入数据库 # save_to_db(my_message_id, recipients, subject, ...) except Exception as e: print(f"发送失败: {e}")
当收到webhook事件时,事件payload里的custom_args.internal_message_id就是你存入的ID,直接用它找到对应的发送记录并更新状态。
方案二:从响应头获取SendGrid生成的Message-ID
SendGrid返回202响应时,响应头里的X-Message-Id字段就是它生成的邮件唯一标识,这个ID和webhook事件里的sg_message_id完全一致,可以直接提取并存入数据库。
示例代码:
message = Mail( from_email=from_email, to_emails=recipients, subject=subject, plain_text_content=text_content, html_content=html_content ) message.tracking_settings = TrackingSettings( open_tracking=OpenTracking(enable=True) ) try: sg = SendGridAPIClient(api_key=sendgrid_key) response = sg.send(message) # 从响应头提取SendGrid生成的消息ID sg_message_id = response.headers.get("X-Message-Id") if sg_message_id: # 将sg_message_id存入数据库 # save_to_db(sg_message_id, recipients, subject, ...) except Exception as e: print(f"发送失败: {e}")
两种方案对比:自定义ID完全由你控制,不依赖SendGrid的返回逻辑,适合需要多系统关联的场景;用SendGrid的ID则省去自己生成标识的步骤,更贴合SendGrid的原生事件体系。
内容的提问来源于stack exchange,提问作者Michael Gugliuzza
相关产品推荐
相关产品推荐

