影刀RPA 邮件合并:批量发送个性化邮件的完整方案

发布时间:2026/7/25 5:52:01
影刀RPA 邮件合并:批量发送个性化邮件的完整方案 影刀RPA 邮件合并批量发送个性化邮件的完整方案作者林焱需要给客户发500封邮件每封的内容不一样收件人姓名、金额、订单号都不同。这就是邮件合并——用模板数据源自动生成个性化邮件并发送。邮件合并的三要素模板邮件的骨架固定部分数据源Excel或数据库里的个性化数据变量部分合并引擎Python代码把模板和数据组装成最终邮件店群矩阵自动化突破运营极限基于Excel数据源的邮件合并importopenpyxlimportsmtplibfromemail.mime.textimportMIMETextfromemail.mime.multipartimportMIMEMultipart# 读取数据源defload_recipients(excel_path):wbopenpyxl.load_workbook(excel_path)wswb.active headers[cell.valueforcellinws[1]]recipients[]forrowinws.iter_rows(min_row2,values_onlyTrue):recipients.append(dict(zip(headers,row)))returnrecipients# 邮件模板template 尊敬的{姓名} 您好 您在{日期}的订单订单号{订单号}已发货预计{预计到达}送达。 订单详情 - 商品{商品名称} - 数量{数量} - 金额¥{金额} 物流单号{物流单号} 如有问题请联系客服。 祝好 # 发送defsend_merged_emails(recipients,template,smtp_config):forpersoninrecipients:# 填充模板bodytemplate.format(**person)msgMIMEMultipart()msg[Subject]f订单{person[订单号]}发货通知msg[From]smtp_config[from_email]msg[To]person[邮箱]msg.attach(MIMEText(body,plain,utf-8))withsmtplib.SMTP_SSL(smtp_config[server],smtp_config[port])ass:s.login(smtp_config[from_email],smtp_config[password])s.sendmail(smtp_config[from_email],person[邮箱],msg.as_string())print(f已发送{person[姓名]}({person[邮箱]}))time.sleep(2)# 控制发送频率避免被限# 使用smtp_config{server:smtp.qq.com,port:465,from_email:yourqq.com,password:授权码}recipientsload_recipients(客户名单.xlsx)send_merged_emails(recipients,template,smtp_config)带附件的邮件合并fromemail.mime.baseimportMIMEBasefromemailimportencodersdefsend_with_attachment(person,template,attachment_path,smtp_config):msgMIMEMultipart()msg[Subject]f您的账单-{person[姓名]}msg[From]smtp_config[from_email]msg[To]person[邮箱]# 正文bodytemplate.format(**person)msg.attach(MIMEText(body,plain,utf-8))# 附件withopen(attachment_path,rb)asf:partMIMEBase(application,octet-stream)part.set_payload(f.read())encoders.encode_base64(part)part.add_header(Content-Disposition,fattachment; filename{person[姓名]}_账单.pdf)msg.attach(part)# 发送withsmtplib.SMTP_SSL(smtp_config[server],smtp_config[port])ass:s.login(smtp_config[from_email],smtp_config[password])s.sendmail(smtp_config[from_email],person[邮箱],msg.as_string())错误处理与重试defsafe_send(recipients,template,smtp_config,max_retries3):success[]failed[]forpersoninrecipients:forattemptinrange(max_retries):try:send_merged_emails([person],template,smtp_config)success.append(person)breakexceptExceptionase:ifattemptmax_retries-1:person[error]str(e)failed.append(person)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3d59c4ac4c7d47ffb9f74dd40027e73d.png#pic_center)time.sleep(5)# 等5秒再重试time.sleep(1)# 发送间隔# 生成发送报告print(f发送完成成功{len(success)}失败{len(failed)})iffailed:withopen(发送失败列表.txt,w)asf:forpinfailed:f.write(f{p[姓名]}{p[邮箱]}:{p.get(error,未知错误)}\n)returnsuccess,failed踩坑实录坑1str.format()和花括号冲突如果你的邮件模板里有{}比如JSON数据str.format()会把它当成占位符导致报错。转义花括号{{表示{}}表示}。temu店群自动化报活动案例坑2SMTP发送频率限制QQ邮箱限制每小时发送量、每分钟发送量。大量发送邮件可能会触发临时封禁。建议每条间隔2-3秒每小时不超过50封。如果量大用企业邮箱或SendCloud等服务。坑3收件人邮箱无效导致发送中断某个收件人的邮箱不存在或格式错误整个流程会卡住。用try/except包住每条发送记录失败的继续下一条。坑4邮件被标记为垃圾邮件原因包括短时间内大量发送、邮件内容包含大量链接、From地址没有SPF/DKIM记录。解决方法发送间隔不要太密内容少用链接和图片使用企业邮箱而非个人免费邮箱写在最后邮件合并是客户运营和内部通知的利器。影刀负责把最新数据写入ExcelPython负责读取数据并发送个性化邮件——你只需要维护好模板和数据源剩下的全自动。