一、思路
- 使用脚本发送邮件的思路,其实和客户端发送邮件一样,过程如下:
登录 -—> 邮件 -—> 发送
-
思维脑图
二、Python中的email模块
- SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件;
- Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件;
- smtplib是关于 SMTP(简单邮件传输协议)的操作模块,在发送邮件的过程中,起到服务器之间互相通信的作用;
- email是用来设置服务器之间通信的信息,包括信息头、信息主体等等;
- 用脚本发邮件时,需要先打开自己邮箱的 SMTP 功能,各家邮箱的设置方法不同,可自行百度;
三、代码
- 以用163邮箱给qq、126、gmail邮箱发送邮件为例,其中,邮件包含:文本、超链接、表格、插入式图片、附件excel等;
- 本文代码在Jupyter notebook中实现,提前准备好照片、表格数据等;
- 入参:邮箱账户密码及接受人
# 入参:邮箱账户密码及接受人
host = "smtp.163.com"
user = "1*******0@163.com"
pwd = "W*******i"
sender = "l*******1@163.com"
title = "Python_test_mail"
receiver = "l*******1@gmail.com,1*******1@qq.com"
cc = "l*******2.com,1*******1@qq.com"
bcc = "6*******5@qq.com"
- 设置邮件主体
msg = MIMEMultipart() # 发送多种形态的邮件
msg.add_header("Subject", title) # 邮件主题
msg.add_header("From", sender) # 发件人
msg.add_header("To", receiver) # 收件人
msg.add_header("Cc", cc) # 抄送人
msg.add_header("BCc", bcc) # 密抄人
to_list = receiver.split(",") + cc.split(",") + bcc.split(",") # 接收邮件人列表
- 设置txt/Html,包括:文本、超链接、图片、数据表格
# 设置txt/Html,包括:文本、超链接、图片、数据表格
txt_html = """
<p>Hello! This is a test mail.</p>
<p>Send by <a href = "http://www.python.org">Python...</a></p>
<p>Picture Case:</p>
<p><img src="cid:image01"></p>
""" + open("data.html", "r").read()
part_html = MIMEText(txt_html, "html", "utf-8")
msg.attach(part_html)
- 设置excel附件
# 设置excel附件
part_excel = MIMEApplication(open("data.xlsx", "rb").read())
part_excel.add_header("Content-Disposition", "attachment", filename="data.xlsx")
msg.attach(part_excel)
- 设置正文图片
# 设置正文图片
part_picture = MIMEApplication(open("fighting.jpeg", "rb").read())
part_picture.add_header("Content-Disposition", "attachment", filename="fighting.jpeg")
part_picture.add_header("Content-ID", "<image01>") # 设置图片ID,插入正文
part_picture.add_header("X-Attachment-Id", "image01")
msg.attach(part_picture)
- 发送邮件
# 发送邮件
try:
smtp_obj = smtplib.SMTP()
smtp_obj.connect(host, 25) # 连接到服务器,SMTP协议默认端口是25,需要SSL认证的邮箱,SMTP_SSL连接
smtp_obj.login(user, pwd) # 登录服务器
smtp_obj.sendmail(sender, to_list, msg.as_string()) # 发送
smtp_obj.quit() # 退出
except smtplib.SMTPException as e:
print("Error:", e) # 发送失败,返回异常
-
邮件展示
四、小结
- 需要SSL认证的邮箱,SMTP不能满足要求,需要使用SMTP_SSL连接服务器,如QQ邮箱:smtp_obj = smtplib.SMTP_SSL(mail_host)
- 收件人(To)、抄送人(Cc)、暗抄人(BCc)均为字符串,有多人时中间用逗号隔开;
- 所有收信人、抄送人、暗抄人都一样,放在sendmail()的第二个参数里,具体区别由sendmail()里第三个参数的关键词决定;
- 实际上,email中收件人和sendmail中的收件人没啥联系。前者是前端邮件里展示的收件人/抄送人/暗抄人,必须是字符串;后者是服务器发送的地址,必须是邮箱地址组成的列表;
- 构造一个邮件对象就是一个Messag对象;如果构造一个MIMEText对象,表示一个文本邮件对象;如果构造一个MIMEImage对象,就表示一个含图片的邮件对象;要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象;
- 需要添加附件时,推荐使用MIMEApplication,支撑常见的各种附件类型,如:txt、excel、pdf、csv、image、mp3等;
- 推荐使用html格式的正文内容,这样比较灵活,可以拼接各种内容,插入图片,调整格式等。
网友评论