SMTP是一种简单的邮件传输协议、Python默认支持SMTP。使用SMTP可以构造纯文本的邮件和带附件的邮件。SMTP提供smtplib和email两个主要模块,其中smtplib负责发送邮件,email负责构造邮件。本节进行SMTP邮件发送实战。
以QQ邮箱为例,首先设置QQ邮箱授权码。进入邮箱,单击“设置”→“账户”选项,开启POP3/SMTP服务。默认是关闭状态,单击“开启”按钮即可,如图2.39所示。
图2.39 POP3/SMTP服务设置界面
开启后,需要配置邮件客户端。编辑短信“配置邮箱客户端”到号码“1069 0700 69”,如图2.40所示。
图2.40 配置邮件客户端界面
发送信息完成,单击“我已发送”按钮,会出现如图2.41所示的界面。
图2.41 授权码生成界面
示例如下:
import smtplib # 调用SMTP发件服务 from email.mime.text import MIMEText # 导入做纯文本的邮件模板类 smtpsever = 'smtp.qq.com' # QQ邮箱服务器 sender = 'qq邮箱账号@qq.com' # 发送者邮箱 psw = "hcygozfxeassddhhb" # 配置邮箱客户端生成的QQ邮箱授权码 receiver = '126邮箱账号@126.com' # 接收者邮箱 port = 465 # QQ邮箱服务器默认端口号
配置发送参数,如连接邮箱服务器,授权码,定义接收者、发送者邮箱账号和端口等。
msg = MIMEText(body,'html','utf-8') # 邮件正文内容 msg['from'] = qq邮箱账号@qq.com' # 发送者账号 msg['to'] = '126邮箱账号@qq.com' # 接收者账号 msg['subject'] = "这个是纯文本发送的邮件示例"
编写正文内容到邮件中。
smtp = smtplib.SMTP_SSL(smtpsever,port) # 调用发件服务 smtp.login(sender,psw) # 通过发送者的邮箱账号和授权码登录邮箱 smtp.sendmail(sender,receiver,msg.as_string()) # 发送邮件,信息以字符串方式保存 smtp.quit() # 关闭邮件服务
QQ邮箱的SMTP服务在登录时使用授权码登录,登录采用SSL方式,最后关闭服务。邮件发送界面如图2.42所示。
图2.42 邮件发送界面
以QQ邮箱为例,向126邮箱发送带附件的邮件,这里需要用到MIMEMultipart类,示例如下:
import smtplib from email.mime.text import MIMEText # 导入做纯文本的邮件模板类 from email.mime.multipart import MIMEMultipart # 导入MIMEMultipart类 # 发邮件相关参数 smtpsever = 'smtp.qq.com' # QQ邮箱服务器 sender = '239xxxxx@qq.com' # 发送者邮箱 psw = "xxxxxxxxxxxxxxxx" # QQ邮箱授权码 receiver = 'xxxxx@126.com' # 接收者邮箱账号 port = 465 # QQ邮箱服务器默认端口号
定义发送邮件的相关参数设置。
filepath = r"./readme.txt" # 编辑邮件的内容 with open(filepath,'rb') as fp: # 读文件 mail_body=fp.read()
open()方法用于打开readme.txt,并以read()方法读取所有内容。
# 主题 msg = MIMEMultipart() msg["from"] = sender msg["to"] = receiver msg["subject"] = "带附件的邮件发送模板主题"
MIMEMultipart()方法表示构造的邮件由多个部分组成。
body = MIMEText(mail_body,"html","utf-8") msg.attach(body) att = MIMEText(mail_body,"base64","utf-8") att["Content-Type"] = "application/octet-stream" att["Content-Disposition"] = 'attachment;filename="test_report.xhtml"' msg.attach(att)
application/octet-stream表明返回的是一个二进制的文件,客户端收到这个声明后,会根据文件扩展名来判断。test_report.html是以.html结尾的文件名。
try: smtp = smtplib.SMTP() smtp.connect(smtpsever) # 连接QQ邮箱服务器 smtp.login(sender,psw) # 调用发件服务 except: smtp = smtplib.SMTP_SSL(smtpsever,port) smtp.login(sender,psw) # 登录邮箱 smtp.sendmail(sender,receiver,msg.as_string()) # 发送邮件 smtp.quit()
查看生成的带附件的邮件,如图2.43所示。
图2.43 带附件的邮件界面
yagmail发送邮件相对SMTP服务更为简单和便捷。yagmail是Python的一个第三方库。使用前先安装yagmail模块,使用在线安装方式,通过pip命令安装。打开cmd命令提示符界面,输入“pip install yagmail”,如下所示表示安装成功:
C:\Users\23939>pip install yagmail Collecting yagmail Usingcached https://files.pythonhosted.org/packages/bf/2e/66af8d975/yagmail- 0.11.214-py2.py3-none-any.whl Installing collected packages: yagmail Successfully installed yagmail-0.11.214
1. 使用yagmail发送带正文的邮件
示例如下:
import yagmail # 导入yagmail模块 # 链接邮箱服务器 yagindex = yagmail.SMTP(user="xxxxxx@qq.com",password="qq邮箱授权码", host='smtp.qq.com') Yag_contents = ['这是一个yagmail发送邮件正文的实例'] # 邮箱正文 yagindex.send('xxxxxx@126.com','Yagmail主题实例',Yag_contents) # 给单个接收者发送邮件
如果给多个接收者发送邮件,可以使用列表存储多个接收人。
# 给多个接收者发送邮件 yagindex.send(['aa@126.com','bb@qq.com','cc@gmail.com'],'subject',Yag_contents)
导入yagmail模块,yagmail调用SMTP服务。定义发送者账号信息、客户端授权码,以及服务器的主机地址和邮件正文。最后调用send()方法发送给接收人,并传入邮件主题和内容。发送成功后,如图2.44所示。
图2.44 邮件正文内容界面
2. 使用yagmail发送带附件的邮件
示例如下:
import yagmail # 导入yagmail模块 # 链接邮箱服务器 yagindex = yagmail.SMTP(user="xxxxxx@qq.com",password="qq邮箱授权码",host='smtp.qq.com') # 邮箱正文 Yag_contents = ['这是一个yagmail发送邮件正文的实例']
查看发送结果:
# 发送带附件的邮件 yagindex.send('xxxxxx@126.com','Yagmail发送带附件主题',Yag_contents,["E://cnblogs.png"])
注意:如果发送多个附件,在列表内追加其他附件的所在路径即可。发送完成后,如图2.45所示。
图2.45 邮件中的附件界面