SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知[参考文献5]。Python中的smtplib模块支持创建SMTP 客户端会话对象,能将邮件发送到互联网上任何带有SMTP或ESMTP监听程序的计算机。本文学习并测试参考文献1中的发送邮件示例代码,测试使用smtplib模块发送简单的电子邮件。
smtplib模块支持普通连接和加密连接SMTP服务器,前者使用SMTP类,后者使用SMTP_SSL类。测试代码主要使用的函数如下表所示:
序号 | 类或函数 | 说明 |
---|---|---|
1 | MIMEText | 本类用于创建主类型为 text 的 MIME 对象,测试代码中用于保存邮件主体内容,同时保存邮件的其它信息,如发件人、收件人、邮件标题等 |
2 | MIMEText .as_string | 所属基类Message中的函数,以展平的字符串形式返回整个消息对象。 |
3 | SMTP_SSL | 加密连接SMTP服务器,默认端口为465 |
4 | SMTP_SSL.sendmail | 发送邮件函数,最重要的参数包括发件人地址,收件人地址及消息字符串。 |
5 | SMTP_SSL.login | 登录到需要认证的SMTP服务器,输入参数是用户名和授权码。 |
6 | SMTP_SSL. quit | 终结 SMTP 会话并关闭连接 |
测试代码主要来自参考文献1,在这里主要是列出程序代码及程序执行结果:
# coding=utf-8
import smtplib
from email.mime.text import MIMEText
sender='XXXXXXXXX@qq.com'
password='NNNNNNNNNNN'
to='YYYYYYYYYY@qq.com'
def mail():
ret=True
try:
msg=MIMEText('smtp发送邮件测试','plain','utf-8')
msg['From']=sender
msg['To']=to
msg['Subject']='通过SMTP协议发送邮件测试'
server=smtplib.SMTP_SSL('smtp.qq.com')
server.login(sender,password)
server.sendmail(sender,to,msg.as_string())
print(msg.as_string())
server.quit()
except Exception as e:
ret=False
print(e)
return ret
if mail():
print('邮件发送成功')
else:
print('邮件发送失败')
除了参考文献1中的测试代码,参考文献2中也有类似的测试代码,唯一的区别是参考文献2中的SMTP示例连接SMTP服务器后,没有调用login函数登录服务器,而是直接调用sendmail函数发送邮件,此时会发送失败,并报下面的错误。参考文献1中给出的解释是使用126或QQ等免费邮箱的话,发送Email前必须先登录到自己的Email,才能利用Email发送邮件。事实也确实如此。
本文学习了使用smtplib模块发送简单邮件,后续还会继续学习参考文献1中的发送带附件的电子邮件。
参考文献:
[1]Python从菜鸟到高手
[2]https://docs.python.org/zh-cn/3/library/smtplib.html?highlight=smtplib
[3]https://github.com/python/cpython/blob/3.11/Lib/smtplib.py
[4]https://datatracker.ietf.org/doc/html/rfc821
[5]https://baike.baidu.com/item/SMTP/175887?fromtitle=smtp%E5%8D%8F%E8%AE%AE&fromid=421587&fr=aladdin