【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>&nbsp;</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()

 

posted @ 2022-12-28 10:23  锦绣良缘  阅读(538)  评论(0)    收藏  举报