最近在学习Python中的SMTP发送邮件,但在过程中出现了许多的问题,所以写出来提供一个参考,以后碰见类似错误,可以提供一个参考。
刚开始按部就班写出了一些代码来发送邮件:

from email.mime.text import MIMEText
import smtplib
import sys
# 构造邮件内容
msg=MIMEText('This is from Python!','Plain','utf-8') # 第一个参数是邮件正文内容,第二个参数表示纯文本,第三个参数表示编码格式为UTF-8
# 设置发送邮箱和密码
from_email=input('请输入发件箱:')
password=input('请输入密码:')
# 设置收件箱
to_email=input('请输入收件箱:')
# 设置SMTP服务器
smtp_server=input('SMTP Server:')

# 发送邮件
try:
    server=smtplib.SMTP(smtp_server,465)  # smtp.qq.com 的端口是465或587
    server.set_debuglevel(1)    # 打印和服务器的交互信息
    server.login(from_email,password)   # 登录
    server.sendmail(from_email,to_email,msg.as_string())    # 发送邮件
    server.quit()
except:
    print('Error:',sys.exc_info())

捕捉到的异常提示

Error: (<class ‘smtplib.SMTPServerDisconnected’>, SMTPServerDisconnected(‘Connection unexpectedly closed’), <traceback object at 0x0000019B0EC2C800>)

提示’SMTP’服务器连接失败

在看了一些其他的资料后,把通过smtp的server地址,端口连接换成通过smtp_ssl连接,即将
server = smtplib.SMTP(smtp_server,465)改成使用
server= smtplib.SMTP_SSL(smtp_server)进行连接
代码修改如下:

from email.mime.text import MIMEText
import smtplib
import sys
# 构造邮件内容
msg=MIMEText('This is from Python!','Plain','utf-8') # 第一个参数是邮件正文内容,第二个参数表示纯文本,第三个参数表示编码格式为UTF-8
# 设置发送邮箱和密码
from_email=input('请输入发件箱:')
password=input('请输入密码:')
# 设置收件箱
to_email=input('请输入收件箱:')
# 设置SMTP服务器
smtp_server=input('SMTP Server:')

# 发送邮件
try:
    server=smtplib.SMTP_SSL(smtp_server)  # smtp.qq.com 的端口是465或587
    server.set_debuglevel(1)    # 打印和服务器的交互信息
    server.login(from_email,password)   # 登录
    server.sendmail(from_email,to_email,msg.as_string())    # 发送邮件
    server.quit()
except:
    print('Error:',sys.exc_info()[1]) #这里只想将报错的实例输出

本以为这次能够发送成功,结果还是提示报错,报错信息如下:
Error: SMTPAuthenticationError(535, b’Login Fail. Please enter your authorization code to login. More information in http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256

提示我们需要输入授权码进行登录,这就让我想起在windows email上登陆自己的qq邮箱的时候,没有输入密码,而是输入了16位授权码,于是我将密码替换成授权码,重新运行了一次代码:

from email.mime.text import MIMEText
import smtplib
import sys
# 构造邮件内容
msg=MIMEText('This is from Python!') # 第一个参数是邮件正文内容,第二个参数表示纯文本,第三个参数表示编码格式为UTF-8
# 设置发送邮箱和密码
from_email=input('请输入发件箱:')
Email_Pass=input('请输入授权码:')
# 设置收件箱
to_email=input('请输入收件箱:')
# 设置SMTP服务器
smtp_server=input('SMTP Server:')

# 发送邮件
try:
    server=smtplib.SMTP_SSL(smtp_server)  # smtp.qq.com 的端口是465或587
    server.set_debuglevel(1)    # 打印和服务器的交互信息
    server.login(from_email,Email_Pass)   # 登录
    server.sendmail(from_email,to_email,msg.as_string())    # 发送邮件
    server.quit()
except:
    print('Error:',sys.exc_info()[1])

瞬间发送成功!!!

在这里插入图片描述
但是我们也发现这封邮件有两个问题:

  1. 无主题
  2. 发件人明明是你的好友却不显示名称

这是因为这些东西不是SMTP发给MTA的,而是包含在发给MTA的文本中的,有时间我就这些在水一篇文章!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐