暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python | 年底收官,“表哥”如何分机构批量发送邮件通知和整改台账 ?

数据化审计 2021-10-24
828

点蓝字关注  设为星标 ☆ 优先赏阅
数据化审计-SmartAudit:问题导向、应用至上、解决痛点

内容导读利用Python高效推进整改之多机构邮件及附件批量发送

工作回顾

在上一篇《年底收官,“表哥”如何高效推进整改 -01》中已实现了如下功能:

  • 按照问题机构自动拆分整改台账,批量生成各机构的整改台账
  • 根据相应机构的整改台账,批量生成存放整改证明材料的空文件夹
  • 按照问题机构,批量将整改台账和整改证明材料文件夹压缩成一个压缩文件,方便发送

这一步,已将 “ 表哥 ” 从手工拆分台账、生成台账压缩文件中解放出来。

但看着文件夹中数十到上百个(N个)台账压缩文件,如果要一个个手工写邮件正文、添加附件,将邮件分别发送给数十到上百个(N个)机构,也会是一场噩梦。

这个工作不仅仅价值密度低,还有可能出错,很容易张冠李戴,甚至不小心造成信息泄露。

实战思路

Python 中可以发送邮件的库很多,这次使用 zmail 这个库。

国人写的这个 zmail 库,封装的非常完备,就像手工发邮件一样,给定地址、附件啥的就可以发送了。

zmail 库在标准 Anaconda 或者 python 环境中没有,需要通过 pip install zmail 进行安装。用户手册参见:https://github.com/zhangyunhao116/zmail/blob/master/README-cn.md需要注意的是 zmail 只支持 python3 环境

如何安装第三方库,以及如何在不联网的工作环境中安装第三方库,可参见《数字化审计实务指南》一书的 P117、P119

具体处理流程如下:

  1. 整理一个“各机构联系信息”excel文件,包括机构名称、机构邮箱等字段。如下图:


  2. 使用glob库,循环读取需要发送的台账压缩文件,并提取机构名称。
  3. 根据机构名称从联系人信息表中找出当前机构联系信息。
  4. 根据联系信息、附件文件名称构造 zmail ,发送邮件。

详细流程如下图:

实现代码

本文运行环境:Python 3.8 / Pandas 1.1.3 / zmail 0.2.8

代码可以按住屏幕,左右滑动查看

# -*- coding:utf-8 -*-
import pandas as pd
import zmail
import glob
import os

# 定义一个函数用于发送邮件
# 参数:
# df_info 联系信息记录 
# attachfile 附件文件名
def SendNoticMail(df_info,attachfile):
    # 定义一个HTML格式的邮件正文    
    content_html = '<html><head><meta charset="utf-8"> \
        </head><body style="font-size:25px; word-wrap:break-word;"> \
        <b>%s:</b><br><br> \
        根据整改工作规定,请在收到通知 \
        <font color="red">30</font>日内更新整改台账。\
        <br>并提供整改佐证材料。<br>\
        <br><b><font color="red">请勿更改台账格式和佐证材料文件名!</font></b><br> \
        <br>感谢支持!</body></html>'
%(df_info.iloc[0,0])
    # 定义邮件体:主题、正文、附件
    curmail = {
        'subject''%s问题整改跟踪台账'%(df_info.iloc[0,0]),  
        'content_html': content_html, 
        'attachments': attachfile
    }
    # 初始化邮件服务器 需要有发送邮件服务器smtp 用户名需要包括域名的全称
    # smtp.xxxx.com 替换为发件邮件服务器地址
    server = zmail.server('发件邮箱地址''发件邮箱密码',
                          smtp_host='smtp.xxxx.com',
                          smtp_port=25,smtp_ssl=False)
    # 发送邮件 如果成功 返回True
    return server.send_mail(df_info.iloc[0,1], curmail)

## 主程序 
if __name__ == "__main__":
    # 提取程序当前路径
    curpath = os.getcwd()
    # 读取机构联系信息数据
    df = pd.read_excel('各机构联系信息.xlsx')
    # 循环读取和发送上一步拆分后压缩好的文件 以机构名命名的zip文件
    for f in glob.glob('整改资料收集/*.zip'):
        # 提取当前压缩文件的机构名称
        # 先按照\将文件路径切分为list,取list最后一个值字符串的非后4位
        curbr = f.split('\\')[-1][:-4]
        # 当前机构的资料压缩文件名 zmail带附件需要全路径 所以加上路径
        curbrzip = '%s/%s'%(curpath,f)
        print(curbrzip)
        # 根据当前机构名称从联系信息表中提取机构的联系信息
        df_br = df[df['机构名称']==curbr]
        # 调用函数 发送当前机构附件
        SendNoticMail(df_br,curbrzip)

实现效果

机构C收到的邮件截图如下:

延伸问题

不可否认,微信已成了工作交流不可或缺的工具。

邮件发送了,最好能通过微信再通知下联系人及时查收邮件,尽快处理。

这如何实现呢?

关于《数字化审计实务指南》

在万物皆可数字化的时代,数字化审计已不再是深不可测的“技术黑箱”,而是每个审计人员都应该具备的工作技能。

数字化审计又该如何做呢?《数字化审计实务指南》一书从多个维度提供了可借鉴之处。

《数字化审计实务指南》目前在京东、当当、天猫都已全线上架。

相关阅读

0基础教程 | 1x01-Python整合平台Anaconda的安装和使用
0基础教程 | 1x02-Python应用型基础入门(一)
0基础教程 | 1x03-Python应用型基础入门(二)

― End ―

因为公众号平台更改了推送规则,如果不想错过新文章,记得读完点一下“”、“在看”,这样每次新文章推送才会第一时间出现在您的订阅列表里。


文章转载自数据化审计,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论