手动发邮件在通知、提醒、信息分享等场景里效率低、容易出错,用脚本把发送动作固化下来更可靠。下面按原文思路整理一份可落地的 Python 自动发邮件实践,核心是 smtplib 提供的 SMTP 客户端会话,以及 email 模块负责的邮件内容构造。
一、运行环境与前置条件
脚本运行需要三样东西:一是本机已安装 Python,原文以 Python 3.x 讲解;二是一个可用的邮箱账号,原文以 QQ 邮箱为例;三是该邮箱的授权码。授权码不是邮箱登录密码,而是专门给第三方客户端登录用的凭证,各邮箱的获取入口不同,需要按对应邮箱的帮助文档操作。脚本里的 password 变量实际存放的就是授权码,这一点在调试时最容易混淆。
二、SMTP 与连接方式
SMTP 即简单邮件传输协议,负责把邮件投递到邮件服务器。Python 的 smtplib 库封装了 SMTP 客户端会话,可以直接连接服务器并完成发送。原文示例使用 SMTP_SSL 连接 smtp.qq.com 的 465 端口,即在建立连接阶段就走 SSL 加密通道,因此不需要再单独调用 starttls。
三、邮件由哪几部分组成
一封邮件通常分为三块:邮件头、邮件体、附件。邮件头承载发件人、收件人、主题等信息;邮件体是正文,可以是纯文本,也可以是 HTML;附件则是随邮件携带的文件。纯文本场景用 MIMEText 构造邮件体即可,配合 Header 处理中文发件人、收件人和主题,避免编码问题。
四、完整发送流程与代码
原文给出的步骤是:导入 smtplib 和 email 库;创建 SMTP 对象并连接服务器;登录邮箱;设置邮件头、邮件体和附件;发送邮件;关闭连接。把这些步骤落到代码上如下:
- import smtplib
- from email.mime.text import MIMEText
- from email.header import Header
- # 邮箱服务器信息
- smtp_server = 'smtp.qq.com'
- smtp_port = 465
- # 发件人、收件人与授权码
- sender = 'your_email@qq.com'
- receiver = 'receiver_email@example.com'
- password = 'your_email_password'
- # 创建 SMTP 对象(SSL 连接)
- smtp = smtplib.SMTP_SSL(smtp_server, smtp_port)
- # 登录邮箱
- smtp.login(sender, password)
- # 设置邮件内容
- subject = 'Python 自动发送邮件测试'
- body = '这是一封来自 Python 脚本的自动发送邮件。'
- msg = MIMEText(body, 'plain', 'utf-8')
- msg['From'] = Header(sender, 'utf-8')
- msg['To'] = Header(receiver, 'utf-8')
- msg['Subject'] = Header(subject, 'utf-8')
- # 发送邮件并关闭连接
- smtp.sendmail(sender, receiver, msg.as_string())
- smtp.quit()
复制代码
五、关键参数与调用方式
smtp_server 和 smtp_port 决定连接目标,QQ 邮箱对应 smtp.qq.com 与 465;smtp_port 与 SMTP_SSL 必须匹配,换成其他端口时连接方式也要相应调整。smtp.login(sender, password) 的第一个参数是发件邮箱地址,第二个参数是授权码而不是登录密码。MIMEText(body, 'plain', 'utf-8') 的三个参数分别表示正文内容、正文类型和字符编码,正文类型为 plain 即纯文本。msg['From']、msg['To']、msg['Subject'] 分别写入邮件头,值统一用 Header 包装并声明 utf-8,中文主题才不会出现乱码。smtp.sendmail(sender, receiver, msg.as_string()) 负责投递,msg.as_string() 把邮件对象序列化成可传输的字符串;smtp.quit() 用于结束会话、释放连接。
六、排查思路
脚本跑不通时,优先核对三处:一是登录凭证,若把邮箱登录密码当作 password 传入,登录环节就会失败,应改用授权码;二是端口与连接方式,465 对应 SMTP_SSL,若改走其他端口却仍用 SMTP_SSL,连接会建立不起来;三是编码,正文与邮件头都应显式指定 utf-8,否则中文主题和正文可能显示异常。按“连接—登录—构造邮件—发送—关闭”的顺序分段验证,可以快速定位问题出在哪一步。
七、适用场景
这种写法适合固定收件人的通知类邮件、定时提醒、脚本运行结果汇报等轻量场景。需要携带附件时,原文的邮件结构说明已指出附件是独立组成部分,可在纯文本正文基础上另行构造对应 MIME 部件,发送流程本身不变。 |