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,即可自动发送邮件。

笔记加载中…