核心是用pandas读取Excel,再用.format()或f-string动态插入字段值;表头名须与模板占位符严格一致,空值需用row.get()或fillna()预处理,避免崩溃。

邮件内容怎么从Excel字段动态替换
核心是用 pandas 读取 Excel,再用字符串 .format() 或 f-string 插入字段值。别直接拼接 HTML 或纯文本——容易漏转义、错位、乱码。
-
openpyxl适合读写 .xlsx 且需保留样式;但仅读取通讯录,pandas.read_excel()更快更稳 - Excel 表头名(如
"姓名"、"邮箱"、"部门")必须和邮件模板里的占位符严格一致,比如模板写"亲爱的{姓名}:",就不能在 Excel 里写成"名字" - 空值会崩掉
.format(),务必加默认值:row.get("部门", "同事"),或用fillna("未知")预处理 DataFrame
SMTP 发信怎么避免被当垃圾邮件
不是发得出去就算成功——Gmail、Outlook 等对批量发信极其敏感。关键在发信身份和行为控制。
- 用企业邮箱 SMTP(如
smtp.exmail.qq.com:465)比个人 QQ/Gmail 更可信;个人账号建议走gmail-smtp.l.google.com:587+ App Password(非登录密码) - 每封邮件的
From必须和登录账户一致;To只填单个收件人,别塞进Cc或群发字段——否则一退信全挂 - 加
time.sleep(1)控制发送节奏,超过 50 封建议拆成批次,每批间隔 30 秒以上
附件和图片怎么嵌进个性化邮件
纯文本没说服力,但直接贴本地路径(如 "./img/logo.png")发出去对方根本看不到。得用 MIME 编码+内联引用。
- 用
email.mime.image.MIMEImage加载图片,设add_header("Content-ID", "<logo>")</logo>,HTML 正文里用<img src="cid:logo"> - 附件要用
email.mime.base.MIMEBase,不能直接 attach 文件对象;PDF/Excel 类附件记得设maintype="application", subtype="vnd.openxmlformats-officedocument.spreadsheetml.sheet" - 所有二进制内容(图片、附件)必须调用
encoders.encode_base64(part),否则 Outlook 会提示“损坏的附件”
发信失败后怎么定位是哪一行出问题
报错信息常是 smtplib.SMTPRecipientsRefused 或 UnicodeEncodeError,但不告诉你具体哪条数据、哪个字段。
立即学习“Python免费学习笔记(深入)”;
- 别用
df.iterrows()直接遍历——出错时索引已丢失。改用for idx, row in df.iterrows():,捕获异常时打印idx和row["邮箱"] - 把每封邮件的完整
MIMEText内容先写入临时文件(如f"debug_{idx}.eml"),出错时可双击用 Outlook 打开验证格式 - Excel 中邮箱含空格、中文、全角符号(如
"user@domain.com")会导致 SMTP 拒绝,发前统一用row["邮箱"].strip().replace(" ", "").replace(" ", "")
最麻烦的其实是 Excel 数据质量:合并单元格、隐藏行、日期存成数字、手机号带超链接……这些不会报错,但会让某几封邮件内容错乱或发不出去。动手前先用 df.info() 和 df.head() 过一遍原始数据。


















