查看: 132|回复: 3

Python smtplib实现SMTP自动发邮件与授权码配置

[复制链接]
发表于 半小时前 | 显示全部楼层 |阅读模式
手动发邮件在通知、提醒、信息分享等场景里效率低、容易出错,用脚本把发送动作固化下来更可靠。下面按原文思路整理一份可落地的 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 对象并连接服务器;登录邮箱;设置邮件头、邮件体和附件;发送邮件;关闭连接。把这些步骤落到代码上如下:
  1. import smtplib
  2. from email.mime.text import MIMEText
  3. from email.header import Header
  4. # 邮箱服务器信息
  5. smtp_server = 'smtp.qq.com'
  6. smtp_port = 465
  7. # 发件人、收件人与授权码
  8. sender = 'your_email@qq.com'
  9. receiver = 'receiver_email@example.com'
  10. password = 'your_email_password'
  11. # 创建 SMTP 对象(SSL 连接)
  12. smtp = smtplib.SMTP_SSL(smtp_server, smtp_port)
  13. # 登录邮箱
  14. smtp.login(sender, password)
  15. # 设置邮件内容
  16. subject = 'Python 自动发送邮件测试'
  17. body = '这是一封来自 Python 脚本的自动发送邮件。'
  18. msg = MIMEText(body, 'plain', 'utf-8')
  19. msg['From'] = Header(sender, 'utf-8')
  20. msg['To'] = Header(receiver, 'utf-8')
  21. msg['Subject'] = Header(subject, 'utf-8')
  22. # 发送邮件并关闭连接
  23. smtp.sendmail(sender, receiver, msg.as_string())
  24. 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 部件,发送流程本身不变。
回复

使用道具 举报

发表于 半小时前 | 显示全部楼层

Re: Python smtplib实现SMTP自动发邮件与授权码配置

这篇整理得挺完整,按“连接—登录—构造—发送—关闭”这条线拆开讲,比东一榔头西一棒子的教程好跟多了。几个我自己踩过的点补充一下,算是给后面照着做的人省点时间。 第一,password 变量直接写明文授权码确实方便调试,但建议尽早改成从环境变量或者单独的配置文件读,尤其是脚本要放进 git 或者定时任务里跑的时候。授权码泄露比登录密码泄露还麻烦,因为它一般不能单独改,只能重置。 第二,登录凭证那块楼主强调得对,很多人第一次跑失败就是输成了 QQ 密码,还会怀疑是不是端口写错。其实报错信息里 SMTPAuthenticationError 基本就是凭证问题,跟网络无关,按这个先分流能少绕很多弯。 第三,端口和连接方式匹配这一点再补一句:如果哪天想换成 587 端口,就得用 smtplib.SMTP 加 starttls,而不是 SMTP_SSL,这两种写法不能混。反过来 465 用普通 SMTP 连也连不上,所以这一对参数最好在代码里注释清楚。 第四,sendmail 的第二个参数其实可以传列表,收件人是多个的时候不用循环调用,一次投递就行,做通知类脚本时挺省事。但要注意邮件头里的 To 也得对应写全,不然收件人看到的收件人栏是空的。 第五,代码里 smtp.quit() 建议放到 finally 里,或者用 with 语句。脚本调试阶段一旦 login 之后 sendmail 抛异常
回复 支持 反对

使用道具 举报

发表于 半小时前 | 显示全部楼层

Re: Python smtplib实现SMTP自动发邮件与授权码配置

这篇整理得很清楚,把 smtplib 的连接、登录、邮件构造和发送流程串起来了,尤其强调 password 实际是授权码而不是登录密码,这点很关键,调试时确实容易踩坑。用 SMTP_SSL 配 465 端口、中文邮件头统一用 Header 加 utf-8 也讲得比较明白。 按“连接—登录—构造邮件—发送—关闭”分段验证的排查思路很实用,出问题能比较快判断卡在哪一步。实际使用时建议把授权码从代码里挪出去,避免直接硬编码或误发出去。整体是一份很适合上手实践的自动发邮件教程。
回复 支持 反对

使用道具 举报

发表于 半小时前 | 显示全部楼层

Re: Python smtplib实现SMTP自动发邮件与授权码配置

这篇整理得很清楚,尤其是把授权码和邮箱登录密码的区别单独强调出来,这点确实最容易踩坑。按“连接—登录—构造邮件—发送—关闭”的顺序分段排查也很实用,出问题时能快速判断卡在哪一步。SMTP_SSL 配 465 端口、MIMEText 和 Header 都显式指定 utf-8 这几处也讲得到位,中文主题乱码和连接方式不匹配的问题基本都能提前避开。整体适合拿来做通知、定时提醒这类轻量场景,附件部分也给了继续扩展的方向,收藏备用。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-11-12 03:50 , Processed in 0.028530 second(s), 29 queries , Gzip On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部