Python实现自动写邮件
Python实现自动写邮件
上星期接到任务要完成一个自动写邮件的脚本,基本功能是每两小时执行一次程序跑出统计表格,并将统计表格的summary发送到领导的邮箱。由于公司是做数字货币的,每两小时实时监测策略交易情况较为必要。下面来实现自动写邮件的功能部分
准备工作
本文将以腾讯企业邮箱为例,利用python编写自动写邮件程序。将用到以下库和模块,其中pandas用来演示用邮件利用html语言发送数据框:
import smtplib
from email.mime.text import MIMEText
from email import encoders
from email.mime.multipart import MIMEMultipart
from email.utils import formataddr
import pandas as pd
要使用smtp服务,需要登陆邮箱并进行设置。登陆邮箱后在设置-客户端设置-开启SMTP服务。
发送邮件通常有发件人(名字),收件人(名字),标题,正文,图片,附件。下面将演示如何一步步发送带图片,附件的邮件。
初始化
首先在函数里定义发件人收件人,标题。其中若收件人为多人,需要注意一下,初始定义为以’,’或’;’连接的字符串,而在sendmail函数里需要利用split进行分割传入一个列表参数,具体见代码
def mail():
sender = 'aaa@qq.com' #发件人
password = 'XXX' #密码
receiver = 'aaa@qq.com,aaa@qq.com' #多个收件人
subject = '测试邮件' #标题
msg = MIMEMultipart('mixed') #初始化定义,mixed为含多种功能的邮件
msg['From'] = sender
msg['To'] = receiver
msg['Subject'] = subject
下面我们通过定义添加附件的函数,添加正文的函数,添加图片的函数来完善功能,只需将msg作为参数传入即可
添加正文
添加正文有两种方式,一种是通过html语言,一种是直接传入字符串。而作为监控邮件,通常需要看的是一张表格中的数据,这时利用html调整格式较为美观且方便。这里将演示读入数据框df后如何发送
def create_df():
'''随意定义一个数据框作测试,此函数可更改为pd.read_csv来读取想要发送的数据'''
df = pd.DataFrame({'a':[1,2,3,4],'b':[2,3,4,5]})
return df
def attach_text(msg):
df = create_df()
col = df.columns
d = ''
for i in range(df.shape[0]):
d = d + """
<tr>
<td width="80">""" + str(df.iloc[i][0]) + """</td>
<td width="80">""" + str(df.iloc[i][1]) + """</td>
</tr>
"""
html = """/
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
<div id="container">
<strong>测试表格:
<div id="content">
<table width="30%" border="2" bordercolor="black" cellspacing="0" cellpadding="0">
<tr>
<td width="80"><strong>a</strong></td>
<td width="80"><strong>b</strong></td>
</tr> + d + """
</table>
</div>
</div>
</div>
</body>
</html>
"""%(df.columns
context = MIMEText(html,_subtype='html', _charset='utf-8')
msg.attach(context)
print('添加正文表格完成')
添加附件
def attach_enclosure(msg):
file = 'C:/Users/19470/Desktop/test.xlsx' #发送附件的文件路径
attach = MIMEText(open(file, 'rb').read(), 'base64', 'utf-8')
attach['Content-type'] = 'application/octet-stream'
attach_name = "attachment;filename='test_enclosure'"
attach['Content-Disposition'] = attach_name
msg.attach(attach)
print('添加附件完成')
添加图片
要把图片嵌入到邮件正文中,我们只需按照发送附件的方式,先把邮件作为附件添加进去,然后,在HTML中通过引用src=”cid:0”就可以把附件作为图片嵌入了。如果有多个图片,给它们依次编号,然后引用不同的cid:x即可。
这里不再演示。
最后步骤
假设我们需要发送包含附件,图片以及正文的邮件,在mail函数中完善为一下代码
def mail():
sender = 'aaa@qq.com' #发件人
password = 'XXX' #密码
receiver = 'aaa@qq.com,aaa@qq.com' #多个收件人
subject = '测试邮件' #标题
msg = MIMEMultipart('mixed') #初始化定义,mixed为含多种功能的邮件
msg['From'] = sender
msg['To'] = receiver
msg['Subject'] = subject
msg = MIMEMultipart('mixed')
attach_enclosure(msg) #添加附件
attach_text(msg) #添加正文
smtp = smtplib.SMTP() #建立smtp对象
smtp.connect('smtp.exmail.qq.com') #可在邮箱客户端查看,smtp服务地址
smtp.set_debuglevel(1) #输出程序执行log
smtp.login(sender, password) #登陆
smtp.sendmail(sender, receiver.split(','), msg.as_string()) #发送邮件,需要将收件人split成列表
print('%s 发送成功'%subject)
smtp.quit()
总结
最后效果如图
自动发邮件在监控系统运营情况时较为有效,通过datetime模块设置自动发邮件的时间,再定时执行相关文件输出表格,最后再发送邮件,可以在非上班时间实时监测系统运营情况。
上一篇: php接口如何传输图片
下一篇: c++php java哪个简单