【Python】 自动发邮件
参考:
WordHTML|在线Word转Html编辑器
https://wordhtml.com/
python输入多行字符串
https://www.jb51.net/article/164376.htm
利用Python调用outlook自动发送邮件
使用Python实现自动化邮件发送,可以让你摆脱繁琐的重复性业务,可以节省非常多的时间。Python有两个内置库:smtplib和email,能够实现邮件功能,smtplib库负责发送邮件,email库负责构造邮件格式和内容。邮件发送需要遵守SMTP协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
方法1:通过本地应用发email(Outlook)
-
outlook需要处于打开状态
-
如果outlook有多个账号,会默认从设置的第一个邮箱账户
Python 发送outlook
outlook一般没有权限smtp发送邮件
1.基础版本–能自动发送就是成功
1 import win32com.client as win32 2 3 # 自动群发邮件 4 def send_group_mail(): 5 outlook = win32.Dispatch('outlook.application') 6 mail = outlook.CreateItem(0) 7 mail.To = '1692679247@qq.com' # 收件人 8 # mail.CC = '12345678@qq.com' # 抄送人 9 #mail.Bcc='12345678@qq.com' # 密抄收件人 10 mail.Subject = 'Python发邮件~' # 邮件主题 11 mail.Body = '这是一封测试邮件' # 邮件正文 12 mail.Importance = 2 # 设置重要性为高 13 mail.Attachments.Add(r'C:\Users\kai.cao\OneDrive\图片\python-logo.jpg') #添加附件 14 mail.Send() #发送 15 16 17 if __name__ == '__main__': 18 send_group_mail()
2.添加多个附件
如果需要添加多个附件,则直接使用多次的 .Attachments.Add即可
1 import win32com.client as win32 2 3 outlook = win32.Dispatch('outlook.application') 4 mail = outlook.CreateItem(0) 5 mail.To = '1692679247@qq.com@qq.com' #收件人 6 mail.Subject = 'test1' #邮件主题 7 mail.Body = '这是一封多附件测试邮件' #邮件正文 8 mail.Attachments.Add(r'C:\Users\Desktop\测试.xlsx') #添加附件 9 mail.Attachments.Add(r'C:\Users\Desktop\测试2.txt') #添加第二个附件 10 mail.Send() #发送
3.选择发送邮箱/账号
自动发送默认使用outlook中的默认邮箱,但是我们的outlook邮箱可能除了我们自己的邮箱账号外还有其他的账号,例如公共邮箱。只要设定一下.SentOnBehalfOfName即可:
1 import win32com.client as win32 2 3 outlook = win32.Dispatch('outlook.application') 4 mail = outlook.CreateItem(0) 5 mail.SentOnBehalfOfName = 'accoumt2@outlook.com' #选择发送邮箱,只需要修改对应使用的邮箱/账号地址即可 6 mail.To = '1692679247@qq.com@qq.com' #收件人 7 mail.Subject = 'test1' #邮件主题 8 mail.Body = '这是一封测试邮件' #邮件正文 9 10 mail.Send() #发送
4.修改正文格式
如果需要修改正文中的字体,则需要在正文中使用HTML格式调整,代码示例如下:
1 import win32com.client as win32 2 3 # 自动群发邮件 4 def send_group_mail(): 5 outlook = win32.Dispatch('outlook.application') 6 7 mail = outlook.CreateItem(0) 8 mail.To = '1692679247@qq.com' #收件人 9 mail.Subject = 'Project xxx: complete' #邮件主题 10 mail.Body = '这是一封测试邮件 html' #邮件正文 11 mail.BodyFormat = 2 #2表示使用Html format,可以调整格式等 12 mail.HTMLBody = '''<H2>XXX 你好</H2><BR> 13 <FONT SIZE=4>请注意<BR> 14 这是一封<Font Face=Times Roman Size=4.5 Color=blue>测试邮件</font>并且<Font Face=Times Roman Size=4.5 Color=red>没有附件</font>。<BR>''' 15 mail.Display() #显示发送邮件界面 16 mail.Send() #发送 17 18 19 if __name__ == '__main__': 20 send_group_mail()
其中正文中的HTML标签含义如下:
其他格式,例如加粗,斜体等都可以使用特定的HTML标签实现,具体百度即可。
1 <H2> </H2>标签: 在Html语句中<h1> - <h6> 标签可定义标题。<h1> 定义最大的标题。<h6> 定义最小的标题。 2 <br> 标签:插入一个换行符 3 <font>标签: 规定文本的字体、字体尺寸、字体颜色。例如示例中的<Font Face=Times Roman Size=4.5 Color=blue>
image-20211225234830336

5.插入图片
如果需要在正文中插入图片的话则需要先插入图片附件,然后利用HTML将图片插入到正文中
import win32com.client as win32 # 自动群发邮件 def send_group_mail(): outlook = win32.Dispatch('Outlook.Application') mail = outlook.CreateItem(0) mail.To = '1692679247@qq.com' # 收件人 mail.Subject ='Project:BGB001 complete' # 主题 mail.BodyFormat = 2 # 2表示使用Html format,可以调整格式等 mail.HtmlBody = '''<p>Hello</p> <p>I like it~</p> <p> </p> <p><strong>Kai Cao </strong><strong>曹锴</strong></p> ''' # 然后在htmlbody里面调用这个图片,就可以进入到正文里面了 mail.Attachments.Add(r"C:\Users\kai.cao\OneDrive\图片\python-logo.jpg") # 先把要插入的图片当作一个附件添加 mail.Attachments.Add(r"C:\Users\kai.cao\OneDrive\桌面\personal document\test.xlsx") # 添加正常的附件 mail.Display() mail.Send() if __name__ == '__main__': send_group_mail()
效果:

image-20211225235015940
方法2:通过SMTP发email(QQ邮箱)
干货 | 解放双手,用Python实现自动发送邮件 - 朱卫军的文章 - 知乎
Python实现自动发送邮件(详解)
0.预先设置SMTP服务器,获取邮箱授权码

image-20211225235354060
1.先导入相关的库和方法
import smtplib import email # 负责构造文本 from email.mime.text import MIMEText # 负责构造图片 from email.mime.image import MIMEImage # 负责将多个对象集合起来 from email.mime.multipart import MIMEMultipart from email.header import Header
2.设置邮箱域名、发件人邮箱、邮箱授权码、收件人邮箱
# SMTP服务器,这里使用qq邮箱 mail_host = "smtp.qq.com" # 发件人邮箱 mail_sender = "******@qq.com" # 邮箱授权码,注意这里不是邮箱密码,如何获取邮箱授权码,请看本文最后教程 mail_license = "********" # 收件人邮箱,可以为多个收件人 mail_receivers = ["******@qq.com","******@outlook.com"]
3.构建MIMEMultipart对象代表邮件本身,可以往里面添加文本、图片、附件等
mm = MIMEMultipart('related')
4.设置邮件头部内容
# 邮件主题 subject_content = """Python邮件测试""" # 设置发送者,注意严格遵守格式,里面邮箱为发件人邮箱 mm["From"] = "sender_name<******@qq.com>" # 设置接受者,注意严格遵守格式,里面邮箱为接受者邮箱 mm["To"] = "receiver_1_name<******@qq.com>,receiver_2_name<******@outlook.com>" # 设置邮件主题 mm["Subject"] = Header(subject_content,'utf-8')
5.添加正文文本
# 邮件正文内容 body_content = """你好,这是一个测试邮件!""" # 构造文本,参数1:正文内容,参数2:文本格式,参数3:编码方式 message_text = MIMEText(body_content,"plain","utf-8") # 向MIMEMultipart对象中添加文本对象 mm.attach(message_text)
6.添加图片
# 二进制读取图片 image_data = open('a.jpg','rb') # 设置读取获取的二进制数据 message_image = MIMEImage(image_data.read()) # 关闭刚才打开的文件 image_data.close() # 添加图片文件到邮件信息当中去 mm.attach(message_image)
7.添加附件(excel表格)
# 构造附件 atta = MIMEText(open('sample.xlsx', 'rb').read(), 'base64', 'utf-8') # 设置附件信息 atta["Content-Disposition"] = 'attachment; filename="sample.xlsx"' # 添加附件到邮件信息当中去 mm.attach(atta)
8.发送邮件
# 创建SMTP对象 stp = smtplib.SMTP() # 设置发件人邮箱的域名和端口,端口地址为25 stp.connect(mail_host, 25) # set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息 stp.set_debuglevel(1) # 登录邮箱,传递参数1:邮箱地址,参数2:邮箱授权码 stp.login(mail_sender,mail_license) # 发送邮件,传递参数1:发件人邮箱地址,参数2:收件人邮箱地址,参数3:把邮件内容格式改为str stp.sendmail(mail_sender, mail_receivers, mm.as_string()) print("邮件发送成功") # 关闭SMTP对象 stp.quit()
效果:

image-20211225235518683
Code for QQ:
1 # -*- coding: utf-8 -*- 2 """ 3 Spyder Editor 4 5 This is a temporary script file. 6 """ 7 import smtplib 8 9 # 负责构造文本 10 from email.mime.text import MIMEText 11 # 负责构造图片 12 from email.mime.image import MIMEImage 13 # 负责将多个对象集合起来 14 from email.mime.multipart import MIMEMultipart 15 from email.header import Header 16 17 18 19 20 21 22 # SMTP服务器,这里使用qq邮箱 23 mail_host = "smtp.qq.com" 24 # 发件人邮箱 25 mail_sender = "1692679247@qq.com" 26 # 邮箱授权码,注意这里不是邮箱密码,如何获取邮箱授权码,请看本文最后教程 27 mail_license = "xxxxxxxxx" 28 # 收件人邮箱,可以为多个收件人 29 mail_receivers = ["xxxxxx@163.com","xxx@outlook.com"] 30 31 mm = MIMEMultipart('related') 32 33 # 邮件主题 34 subject_content = """Python邮件测试""" 35 # 设置发送者,注意严格遵守格式,里面邮箱为发件人邮箱 36 mm["From"] = "sender_name<1692679247@qq.com>" 37 # 设置接受者,注意严格遵守格式,里面邮箱为接受者邮箱 38 mm["To"] = "receiver_1_name<xxxxxx@163.com>,receiver_2_name<xxx@outlook.com>" 39 # 设置邮件主题 40 mm["Subject"] = Header(subject_content,'utf-8') 41 42 # 邮件正文内容 43 body_content = """你好,这是一个测试邮件!""" 44 # 构造文本,参数1:正文内容,参数2:文本格式,参数3:编码方式 45 message_text = MIMEText(body_content,"plain","utf-8") 46 # 向MIMEMultipart对象中添加文本对象 47 mm.attach(message_text) 48 49 50 51 # 二进制读取图片 52 image_data = open('C:/Users/169/OneDrive/图片/python-logo.jpg','rb') 53 # 设置读取获取的二进制数据 54 message_image = MIMEImage(image_data.read()) 55 # 关闭刚才打开的文件 56 image_data.close() 57 # 添加图片文件到邮件信息当中去 58 mm.attach(message_image) 59 60 # 创建SMTP对象 61 stp = smtplib.SMTP() 62 # 设置发件人邮箱的域名和端口,端口地址为25 63 stp.connect(mail_host, 25) 64 # set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息 65 stp.set_debuglevel(1) 66 # 登录邮箱,传递参数1:邮箱地址,参数2:邮箱授权码 67 stp.login(mail_sender,mail_license) 68 # 发送邮件,传递参数1:发件人邮箱地址,参数2:收件人邮箱地址,参数3:把邮件内容格式改为str 69 stp.sendmail(mail_sender, mail_receivers, mm.as_string()) 70 print("邮件发送成功") 71 # 关闭SMTP对象 72 stp.quit()