Python3 SMTP 发送邮件
程序自动发邮件(报警、报表、验证码)走的是 SMTP 协议。Python 的 smtplib 模块实现 SMTP 客户端,配合 email 模块构造邮件,几十行代码就能发信。注意:登录用的是邮箱服务商提供的"授权码",不是登录密码。
发送流程
连接邮件服务器 → 登录认证 → 构造邮件(MIMEText)→ sendmail 发送 → 关闭连接。
登录授权码
以 QQ/163 邮箱为例:登录网页邮箱,在"设置 → 账户"里开启 SMTP 服务,会生成一串授权码。代码 login 时使用"邮箱地址 + 授权码",不要把明文登录密码写进代码或仓库。
两种加密连接方式
- SMTP_SSL:直连 465 端口,全程 SSL 加密,最常用;
- SMTP + starttls:先连 587 端口,再调用 starttls() 升级为 TLS。
import smtplib
# 方式一:SSL 加密(推荐)
server = smtplib.SMTP_SSL("smtp.qq.com", 465)
# 方式二:STARTTLS(二选一即可)
# server = smtplib.SMTP("smtp.qq.com", 587)
# server.starttls()
server.login(sender, auth_code) # 用授权码登录
用 MIMEText 构造邮件
纯文本邮件用 MIMEText;中文标题、发件人需用 Header 显式声明 utf-8,否则会乱码:
from email.mime.text import MIMEText
from email.header import Header
msg = MIMEText("这是一封来自 Python 的测试邮件。", "plain", "utf-8")
msg["Subject"] = Header("Python 测试邮件", "utf-8") # 标题编码
msg["From"] = sender
msg["To"] = receiver
完整示例(需配置环境后运行)
# 运行前请开启邮箱 SMTP 服务并取得授权码,无需安装第三方依赖
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = "your_account@qq.com" # 改成自己的邮箱
auth_code = "你的授权码" # 设置里生成的授权码,不是登录密码
receiver = "someone@example.com" # 收件人邮箱
msg = MIMEText("正文:这是一封测试邮件。", "plain", "utf-8")
msg["Subject"] = Header("Python 测试邮件", "utf-8")
msg["From"] = sender
msg["To"] = receiver
server = smtplib.SMTP_SSL("smtp.qq.com", 465) # SSL 加密连接
server.login(sender, auth_code) # 登录认证
server.sendmail(sender, [receiver], msg.as_string()) # 发送
server.quit() # 关闭连接
print("邮件发送成功") # 输出:邮件发送成功
HTML 邮件与附件
发 HTML 邮件只需把 MIMEText 第二参数由 "plain" 改为 "html";要"正文 + 附件"同时携带,则改用 MIMEMultipart 容器,把各部分 attach 进去:
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
mail = MIMEMultipart() # 多功能容器
mail.attach(MIMEText("<h1>你好</h1><p>富文本正文</p>", "html", "utf-8"))
# 再构造 MIMEBase/MIMEApplication 读取本地文件并 attach,即可带上附件
小结:用 smtplib.SMTP_SSL(465)(或 SMTP+starttls 587)建立加密连接、以授权码 login,用 MIMEText 构造文本/HTML 邮件并处理好中文 Header,即可自动发送邮件。