Python使用smtplib发送邮件常见错误及解决方案
本文详解Python中利用smtplib模块发送邮件时遇到的典型报错及解决方法。重点解析SSL连接配置、授权码获取方式以及常见SMTP命令,帮助开发者快速排查发送失败问题,确保邮件服务稳定运行。
以下代码经过测试验证,可用于正常发送邮件:
import smtplib
from email.mime.text import MIMEText
# 第三方 SMTP 服务
mail_host = "smtp.163.com" # SMTP服务器
mail_user = "username" # 用户名
mail_pass = "passwd" # 密码(这里的密码不是登录邮箱密码,而是授权码)
sender = 'sender_mail@163.com' # 发件人邮箱
receivers = ['receive_mail@qq.com'] # 接收人邮箱
content = 'Python Send Mail !'
title = 'Python SMTP Mail Test' # 邮件主题
message = MIMEText(content, 'plain', 'utf-8') # 内容, 格式, 编码
message['From'] = "{}".format(sender)
message['To'] = ",".join(receivers)
message['Subject'] = title
try:
smtpObj = smtplib.SMTP_SSL(mail_host, 465) # 启用SSL发信, 端口一般是465
smtpObj.login(mail_user, mail_pass) # 登录验证
smtpObj.sendmail(sender, receivers, message.as_string()) # 发送
print("mail has been send successfully.")
except smtplib.SMTPException as e:
print(e)
问题排查与注意事项:
1. 报错信息:Error: A secure connection is requiered(such as ssl)
解决方法:该错误通常由邮箱SSL验证机制引起。需将代码中的 smtplib.SMTP() 替换为 smtplib.SMTP_SSL(),并将端口号设置为 465。
2. 报错信息:535, b'Error: authentication failed'
解决方法:此错误可能源于用户名配置不当。代码中的用户名应填写为邮箱地址中 @ 符号前的部分,或者使用在邮箱设置中配置的账户昵称。
3. SMTP服务器地址需根据所发送邮箱的类型进行选择。例如,若代码中使用的是 163 邮箱,则 mail_host 应设置为 "smtp.163.com"。
用户也可根据实际使用的邮箱服务商,将其更改为 "smtp.126.com"、"smtp.qq.com" 等其他对应域名。
4. 代码中的 mail_pass 参数代表的是授权码,而非邮箱登录密码。授权码是用于登录第三方邮件客户端的专用密码。
获取方式如下:QQ邮箱可通过 设置→帐户→生成授权码 路径获取;网易邮箱(126/163)可通过 设置→客户端授权密码 路径获取。
知识点扩展:
Python 的 smtplib 模块提供了一种便捷的电子邮件发送途径,它对 SMTP 协议进行了简单的封装。
SMTP 协议包含以下基本命令:
- HELO:用于向服务器标识用户身份
- MAIL:初始化邮件传输,格式为 mail from:
- RCPT:标识单个邮件接收人,通常位于 MAIL 命令之后,可包含多个 rcpt to:
- DATA:在单个或多个 RCPT 命令之后使用,表示所有邮件接收人已标识并开始初始化数据传输,以 . 结束
- VRFY:用于验证指定用户或邮箱是否存在;出于安全考虑,服务器通常禁止此命令
- EXPN:用于验证给定邮箱列表是否存在并扩充邮箱列表,该命令也常被禁用
- HELP:用于查询服务器支持哪些命令
- NOOP:无操作指令,服务器应响应 OK
- QUIT:用于结束会话
- RSET:重置会话,取消当前传输
- MAIL FROM:指定发送者地址
- RCPT TO:指明接收者地址
至此,关于 Python 中执行 smtplib 失败的处理方法介绍完毕。如需了解更多相关 Python 邮件发送失败的处理内容,请搜索本站历史文章或继续浏览后续相关文章。希望大家日后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









