【进阶】自动化发送邮件(包含图片/html报告等附件)
目录
流程:
步骤:
【重点】
【MIMEText--发送文本类型的邮件】
【MIMEImage-发送附件为图片的邮件】
【MIMEBase--发送附件为html报告的邮件】
以qq邮箱为例,提前打开POP3/IMAP/SMTP/Exchange/CardDAV 服务 ,并获取授权码 *
账号与安全--->安全设置--->POP3/IMAP/SMTP/Exchange/CardDAV 服务
授权码不是qq密码
163邮箱不需要授权码,账号和密码就ok
密码失败的话,就换授权码_
需要用到smtplib 模块、email 模块,python内置模块,不需要下载
smtplib用于发送邮件,email用于编写邮件内容
邮箱登录后可以给任意邮箱发送邮件(qq可以发给163,qq等)
抄送邮件(发送同一邮件到多人),传收件人参数时,用英文分号隔开,如:'xiaoming@xx.com;xiaohong@xx.com'
流程:
连接邮箱服务器
登录邮箱
准备邮件数据
添加邮件数据到邮件对象
发送邮件
步骤:
导包
定义发送邮件的方法,需传参数(发送人邮箱、授权码、收件人邮箱、标题/主题、主体内容、附件路径)
创建邮件(MIMEMultipart)对象
构建邮件头部显示样式
1. 
2.
包括--标题/主题、发件人、收件人(时间是自动生成的,无需设置)
根据不同正文内容类型,构建不同email对象,设置文件主体内容(正文)
连接邮箱服务器,SMTP_SSL协议(安全邮件传输协议),传参服务器地址、端口号
登录、发送邮件
【重点】
根据发送的不同类型文件构建不同邮件对象
掌握步骤后,发送任何形式的邮件,都可套用步骤,只需修改正文内容,也就是构建不同的邮件对象
【MIMEText--发送文本类型的邮件】
语法:MIMEText(文字内容,文本类型,编码方式)
文字内容:普通文本就是’文字内容‘,超链接文本三对双引号包裹起来的html语言,二进制文本则为路径
文本类型:普通文本(plain),超文本(html),二进制文本--附件为txt,html,xlsx等(base64)
连接邮箱服务器,SMTP_SSL协议(安全邮件传输协议),传参服务器地址、端口号
服务器地址:'smtp.qq.com' ,qq可替换为其他使用邮箱,如:'smtp.163.com'等 端口号:465/25,用于区分服务器下的不同服务 使用with...as可避免忘记关闭链接对象
发送文本类型为普通文本的内容
1. # 第一步 :导包
2. import smtplib
3.
4. # 发文本类型的文件所用到的模块
5. from email.mime.text import MIMEText
6. # 创建邮件对象(真正被发送的对象)所需要的模块
7. from email.mime.multipart import MIMEMultipart
8. # 定义邮件主题所用到的模块
9. from email.header import Header
10.
11.
12. def send_email(from_email, pass_code, to_email, title, email_body):
13. '''
14. 第二步 :定义发送邮件的方法
15. :param from_email: 发件人邮箱
16. :param pass_code: 发件人邮箱的授权码(163邮箱是密码)
17. :param to_email: 收件人邮箱
18. :param title: 邮件标题
19. :param email_body: 邮件正文
20. :return: 无
21. '''
22. # 第三步 :创建邮件对象
23. msg = MIMEMultipart()
24.
25. # 第四步 : 构建邮件头部显示样式
26. # 设置邮件主题---语法:Header(主题/标题,编码格式)
27. # 设置主题后,对其进行二进制编码
28. subject = Header(title, 'utf-8').encode()
29. msg['Subject'] = subject
30. # 设置邮件发件人
31. msg['From'] = from_email
32. # 设置收件人
33. msg['To'] = to_email
34.
35. # 第五步 : 设置邮件主体内容---文本类型
36. # 语法:MIMEText(文字内容,文本类型,编码方式)
37. # 文本类型:普通文本(plain),超文本(html),二进制文本(附件为文本文件.txt等 base64)
38. body = MIMEText(email_body, 'plain', 'utf-8')
39. # 将主体添加到邮件中
40. msg.attach(body)
41.
42. # 第六步 : 连接邮箱服务器,SMTP_SSL协议(安全邮件传输协议),传参服务器地址、端口号
43. # 服务器地址 :'smtp.qq.com' qq可替换为其他使用邮箱,如:'smtp.163.com'等
44. # 端口号 :465/25,用于区分服务器下的不同服务
45. # 使用with...as可避免忘记关闭连接对象
46. with smtplib.SMTP_SSL('smtp.qq.com', 465) as smtp:
47. # 第七步 : 登录
48. smtp.login(from_email, pass_code)
49. # 发送邮件
50. smtp.send_message(msg)
51.
52. if __name__ == '__main__':
53. send_email('发件人邮箱','发件人邮箱授权码','收件人邮箱','主题','正文')
AI写代码
发送文本类型为超链接的内容
1. # 发送文本类型为超链接的文本
2. import smtplib
3.
4. from email.header import Header
5. from email.mime.text import MIMEText
6. from email.mime.multipart import MIMEMultipart
7.
8. def send_email(from_email, pass_code, to_email, title, email_body):
9. '''
10. 第一步:定义发送邮件的方法
11. :param from_email: 发件人邮箱
12. :param pass_code: 发件人邮箱的授权码(163邮箱就是密码)
13. :param to_email: 收件人邮箱
14. :param title: 邮件标题
15. :param email_body: 邮件正文
16. :return: 无
17. '''
18. msg = MIMEMultipart()
19.
20. subject = Header(title, 'utf-8').encode()
21. msg['Subject'] = subject
22. msg['From'] = from_email
23. msg['To'] = to_email
24.
25. body = MIMEText(email_body, 'html', 'utf-8')
26. msg.attach(body)
27.
28. with smtplib.SMTP_SSL('smtp.qq.com', 465) as smtp:
29. smtp.login(from_email, pass_code)
30. smtp.sendmail(from_email, to_email, msg.as_string())
31.
32.
33. if __name__ == '__main__':
34. send_email('发件人@qq.com', '授权码', '收件人@qq.com', '发送html格式的文本邮件', """
35. <img src="https://www.baidu.com/img/flexible/logo/pc/result.png">
36. <a href="https://www.baidu.com/">点我去百度</a>
37. """)
AI写代码
效果如下图:
* 
发送文本类型为二进制的内容,以.html为例
设置附件名称时,后缀要与源文件保持一致
1. import smtplib
2.
3. from email.header import Header
4. from email.mime.text import MIMEText
5. from email.mime.multipart import MIMEMultipart
6.
7.
8. def send_email(from_email, pass_code, to_email, title, email_body):
9. '''
10. 第一步:定义发送邮件的方法
11. :param from_email: 发件人邮箱
12. :param pass_code: 发件人邮箱的授权码(163邮箱就是密码)
13. :param to_email: 收件人邮箱
14. :param title: 邮件标题
15. :param email_body: 邮件正文
16. :return: 无
17. '''
18. msg = MIMEMultipart()
19.
20. subject = Header(title, 'utf-8').encode()
21. msg['Subject'] = subject
22. msg['From'] = from_email
23. msg['To'] = to_email
24. file_content = open(email_body, 'rb').read()
25. body = MIMEText(file_content, 'base64', 'utf-8')
26. # 设置附件名称---附件名称须为英文,中文会乱码
27. body['Content-Disposition'] = 'attachment; filename="test.html"'
28. msg.attach(body)
29.
30. with smtplib.SMTP_SSL('smtp.qq.com', 465) as smtp:
31. smtp.login(from_email, pass_code)
32. smtp.sendmail(from_email, to_email, msg.as_string())
33.
34.
35. if __name__ == '__main__':
36. send_email('发件人@qq.com', '授权码', '收件人@qq.com', '发送html格式的文本邮件',
37. r'路径\test.html')
AI写代码
【MIMEImage-发送附件为图片的邮件】
与发送文本的流程、步骤均一致,构建邮件对象发生了变化
获取图片内容,创建邮件图片对象---MIMEImage(),传参图片的二进制数据 ,通过open('path',mode='rb')获取图片二进制
设置附件名称 ---除了文件名称外,其余都是固定名称,附件名称须为英文
图片路径可加r转义符
1. import smtplib
2.
3. from email.header import Header
4. from email.mime.text import MIMEText
5. from email.mime.multipart import MIMEMultipart
6.
7. def send_email(from_email, pass_code, to_email, title, email_body):
8. '''
9. 第一步:定义发送邮件的方法
10. :param from_email: 发件人邮箱
11. :param pass_code: 发件人邮箱的授权码(163邮箱就是密码)
12. :param to_email: 收件人邮箱
13. :param title: 邮件标题
14. :param email_body: 邮件正文
15. :return: 无
16. '''
17. msg = MIMEMultipart()
18.
19. subject = Header(title, 'utf-8').encode()
20. msg['Subject'] = subject
21. msg['From'] = from_email
22. msg['To'] = to_email
23.
24. body = MIMEImage(open(email_body, mode='rb').read())
25. # 设置附件名称---附件名称须为英文,中文会乱码
26. body['Content-Disposition'] = 'attachment; filename="englishName.png"'
27. msg.attach(body)
28.
29. with smtplib.SMTP_SSL('smtp.qq.com', 465) as smtp:
30. smtp.login(from_email, pass_code)
31. smtp.sendmail(from_email, to_email, msg.as_string())
32.
33.
34. if __name__ == '__main__':
35. send_email('发件人@qq.com', '授权码', '收件人@qq.com', '发送html格式的文本邮件', r'路径\01.png')
AI写代码
【MIMEBase--发送附件为html报告的邮件】
近似MIMEText的'base64'
可发送.html/.xlsx/.doc等
body = MIMEBase('application', 'octet-stream')
1. import smtplib
2.
3. from email.mime.multipart import MIMEMultipart
4. from email.mime.base import MIMEBase
5. # 用于编码
6. from email import encoders
7. # 定义邮件主题
8. from email.header import Header
9.
10. def send_email(from_email, pass_code, to_email, title, email_body):
11. '''
12. 定义发送邮件的方法
13. :param from_email: 发件人邮箱
14. :param pass_code: 发件人邮箱的授权码(163邮箱就是密码)
15. :param to_email: 收件人邮箱
16. :param title: 邮件标题
17. :param email_body: 邮件正文
18. :return: 无
19. '''
20.
21. msg = MIMEMultipart()
22. subject = Header(title, 'utf-8').encode()
23. msg['Subject'] = subject
24. msg['From'] = from_email
25. msg['To'] = to_email
26.
27. body = MIMEBase('application', 'octet-stream')
28. body.set_payload(open(email_body, mode='rb').read())
29. encoders.encode_base64(body)
30. # 附件名称须为英文
31. body['Content-Disposition'] = 'attachment; filename="test.html"'
32. # 将主体添加到邮件中
33. msg.attach(body)
34.
35. with smtplib.SMTP_SSL('smtp.qq.com', 465) as smtp:
36. smtp.login(from_email, pass_code)
37. smtp.sendmail(from_email, to_email, msg.as_string())
38.
39.
40. if __name__ == '__main__':
41. send_email('发件人@qq.com', '授权码', '收件人@qq.com', '发送html文件附件邮件', r'路径\test.html')
AI写代码
