Python批量发送个性化邮件 模板替换姓名
Python批量给不同客户发送个性化邮件,用字符串模板把姓名、公司、金额替换进正文,每人收到一封专属邮件,附完整代码与Excel读取。
场景痛点
要给500个客户发续费提醒,总不能一封封手工写"张三先生您好"。通用模板里把姓名、公司名、应缴金额做成占位符,从Excel读出来循环替换,每人收到的都是"张三,您所在的XX公司本期应缴XXXX元",看着像人工写的,不是垃圾群发。
用到的库
pip install openpyxl
完整代码
# -*- coding: utf-8 -*-
import time
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from openpyxl import load_workbook
SMTP_SERVER = "smtp.qq.com"
SMTP_PORT = 465
SENDER = "your_account@qq.com"
AUTH_CODE = "your_smtp_auth_code"
# 邮件模板,{name} {company} {amount}是占位符,用format替换
TEMPLATE = """{name} 您好,
您所在的 {company} 本期服务费账单如下:
- 应缴金额:{amount} 元
- 缴费截止:{deadline}
请登录系统完成续费,如有疑问直接回复本邮件。
祝好,
客服团队
"""
def load_customers(excel_path):
"""从Excel读客户信息:列依次为 邮箱, 姓名, 公司, 金额, 截止日期"""
wb = load_workbook(excel_path, read_only=True)
ws = wb.active
customers = []
for row in ws.iter_rows(min_row=2, values_only=True):
if not row or not row[0]:
continue
customers.append({
"email": str(row[0]).strip(),
"name": row[1],
"company": row[2],
"amount": row[3],
"deadline": row[4],
})
wb.close()
return customers
def send_one(customer):
# 用format把模板占位符替换成该客户的数据
body = TEMPLATE.format(
name=customer["name"],
company=customer["company"],
amount=customer["amount"],
deadline=customer["deadline"],
)
msg = MIMEText(body, "plain", "utf-8")
msg["From"] = Header(f"客服 <{SENDER}>", "utf-8")
msg["To"] = Header(customer["email"], "utf-8")
msg["Subject"] = Header(
f"【续费提醒】{customer['company']} 本期账单", "utf-8"
)
# 每个人单独发一封,收件人之间互相看不到
server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
server.login(SENDER, AUTH_CODE)
server.sendmail(SENDER, [customer["email"]], msg.as_string())
server.quit()
def main():
customers = load_customers("customers.xlsx")
print(f"共{len(customers)}个客户,开始发送...")
for i, c in enumerate(customers, 1):
try:
send_one(c)
print(f"[{i}/{len(customers)}] OK: {c['email']}")
except Exception as e:
print(f"[{i}/{len(customers)}] FAIL: {c['email']}: {e}")
time.sleep(0.8) # 间隔0.8秒,避免被限流
if __name__ == "__main__":
main()
代码讲解
- 模板占位符:用Python字符串的
{name}占位,TEMPLATE.format(name=..., company=...)一次性替换。比字符串拼接干净,也不会因为某个字段是数字就报错。 - 每个人单独发一封:不是把所有人塞一封邮件的To里,而是循环调用
send_one(),每人收到一封只写自己邮箱的邮件,对方看不到其他客户。 - Excel列顺序:按代码里的顺序在Excel里放好列,第一行写表头,从第二行开始是数据。
- 循环里每次重新建SMTP连接:500封以下这么写简单稳定;量大可以把连接提到循环外,发完再quit。
time.sleep(0.8):按经验值间隔,发太快会被SMTP服务限流。
运行结果
控制台逐行打印进度,每个客户收到一封正文里带自己姓名、公司名、金额的专属邮件,主题里也带了公司名。
注意事项
- Excel里某个字段为空时
format会报KeyError或显示None,读取时给个默认值更稳。 - 批量个性化邮件最容易被判垃圾邮件:正文里带大量不同公司名、金额,模板相似度又高。建议正文里加一点随机句子、不要全是链接、加退订说明。
- 主题里写公司名比写"通知""提醒"更不容易进垃圾箱。
- 发送前先给自己邮箱发一封测试,确认占位符都替换正确、没漏花括号。
- 如果模板很长(HTML邮件),把模板存成单独的.txt或.html文件,读进来再format,代码更整洁。

更新时间:2026-09-14 21:13:53
上一篇:Python下载邮件附件自动归档到文件夹 按日期发件人分类