欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python实现自动写邮件

程序员文章站 2022-03-18 09:30:04
...

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服务。
Python实现自动写邮件
发送邮件通常有发件人(名字),收件人(名字),标题,正文,图片,附件。下面将演示如何一步步发送带图片,附件的邮件。

初始化

首先在函数里定义发件人收件人,标题。其中若收件人为多人,需要注意一下,初始定义为以’,’或’;’连接的字符串,而在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()

总结

最后效果如图
Python实现自动写邮件

自动发邮件在监控系统运营情况时较为有效,通过datetime模块设置自动发邮件的时间,再定时执行相关文件输出表格,最后再发送邮件,可以在非上班时间实时监测系统运营情况。

相关标签: Python SMTP