点蓝字关注 设为星标 ☆ 优先赏阅
数据化审计-SmartAudit:问题导向、应用至上、解决痛点
工作回顾
在上一篇《年底收官,“表哥”如何高效推进整改 -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。
具体处理流程如下:
整理一个“各机构联系信息”excel文件,包括机构名称、机构邮箱等字段。如下图: 
使用glob库,循环读取需要发送的台账压缩文件,并提取机构名称。 根据机构名称从联系人信息表中找出当前机构联系信息。 根据联系信息、附件文件名称构造 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 ―
“因为公众号平台更改了推送规则,如果不想错过新文章,记得读完点一下“赞”、“在看”,这样每次新文章推送才会第一时间出现在您的订阅列表里。
”




