使用Mailgun向字典列表批量发送个性化邮件仅首封成功问题咨询
问题原因
你的代码仅发送第一封邮件的核心问题是:在循环内部直接调用了return语句,第一次发信请求执行完成后函数就直接终止,后续所有用户的发信逻辑都不会运行。
另外需要注意你定义用户字典时Days字段是大写开头,原始代码中调用的是d['days'](小写开头),键名不统一会触发KeyError,需要先统一字段名。
修复方案1:调整循环逻辑(单条发送)
适合用户量较小的场景,逻辑简单易排查:
import requests def send_email(): # 可存储所有发信响应用于后续排查 response_list = [] # 给未过期用户发送提醒 for d in notify_users: resp = requests.post( "https://api.mailgun.net/v3/MYDOMAIN/messages", auth=("api", "MAILGUN_API_KEY"), data={ "from": "IT <mailgun@MYDOMAIN>", "to": d['Email'], "subject": "Password Reminder", "text": f"Hello {d['User']}, you have {d['Days']} days left to reset your password. -IT" } ) response_list.append(resp) # 给已过期用户发送提醒 for d in expired_users: resp = requests.post( "https://api.mailgun.net/v3/MYDOMAIN/messages", auth=("api", "MAILGUN_API_KEY"), data={ "from": "IT <mailgun@MYDOMAIN>", "to": d['Email'], "subject": "Password Reminder", "text": f"Hello {d['User']}, your password has expired, please change it asap. -IT" } ) response_list.append(resp) return response_list send_email()
修复方案2:使用Mailgun批量个性化发信功能
Mailgun支持类似Twilio的批量传参发送能力,通过recipient-variables参数一次提交所有收件人和对应个性化变量,仅需一次接口请求,适合用户量较大的场景,也不会暴露所有收件人邮箱:
import requests import json def send_batch_email(): to_list = [] recipient_vars = {} # 拼接未过期用户信息 for d in notify_users: user_email = d['Email'] to_list.append(user_email) recipient_vars[user_email] = { "user": d['User'], "notice_content": f"you have {d['Days']} days left to reset your password." } # 拼接已过期用户信息 for d in expired_users: user_email = d['Email'] to_list.append(user_email) recipient_vars[user_email] = { "user": d['User'], "notice_content": "your password has expired, please change it asap." } # 调用批量发信接口 return requests.post( "https://api.mailgun.net/v3/MYDOMAIN/messages", auth=("api", "MAILGUN_API_KEY"), data={ "from": "IT <mailgun@MYDOMAIN>", "to": to_list, "subject": "Password Reminder", "text": "Hello %recipient.user%, %recipient.notice_content% -IT", "recipient-variables": json.dumps(recipient_vars) } ) send_batch_email()
两种方案都可以实现每个用户收到对应个性化内容的需求。
内容的提问来源于stack exchange,提问作者troy
相关产品推荐
相关产品推荐

