PYTHON自动发送报表邮件
要实现上述的功能的话我们需要以下几步:
1、做好报表模板
2、更新报表数据
3、发送报表邮件
下面我们就用一个例子来给大家演示一下:
1、报表模板
我们选用一份保险公司每天完成保单的数据进行模板制作,要求一份为员工当月累计交单,一份为网点整体交单,效果如下:
2、报表数据更新
我们直接使用之前跟大家分享过的数据分析进阶技能——Excel连接数据库就可以,这样更新数据时直接右键刷新就可以了,也方便利用PYTHON进行自动化的刷新
假设已经做好的报表路径为
Path=D:\test\保单统计表.xlsx
使用PYTHON自动刷新代码:
# -*- coding:utf-8 -*-
from win32com.client import DispatchEx
import time
import os
import traceback
Path='D:\\test\\保单统计表.xlsx'
class ExcelApp:
def __init__(self):
self.app = DispatchEx('Excel.Application')
self.app.EnableEvents = False
self.app.DisplayAlerts = 0 # 不显示弹窗
self.app.Visible = False # 隐藏进程
def quit(self):
self.app.DisplayAlerts = 1
self.app.Visible = True
self.app.Quit()
del self.app
def open(self, Path):
workbook = self.app.Workbooks.Open(Path, False, False, None)
return workbook
def refresh(self, Path):
workbook = self.open(Path)
workbook.RefreshAll()
workbook.Save()
workbook.Close()
try:
t = time.time()
print('正在刷新 >>> %s' % Path)
excel = ExcelApp()
excel.refresh(Path)
t = time.strftime('%H:%M:%S', time.gmtime(time.time() - t))
print('刷新完成 >>> 耗时:%ss %s' % (t, Path))
except Exception as e:
print('刷新失败 >>> %s' % Path)
print(traceback.format_exc())
excel.quit()
raise
excel.quit()
效果如下:
改了下表格数据,自动刷新后变为:
3、代码发送邮件
邮箱配置为
Host = mail.xxx.com #邮箱服务器
Port = yy #邮箱端口,一般25
User = name@xxx.com #用户名
Password = pazzzz #密码
To=toname@yyyy.com #收件人
Subject=title #邮件主题
使用PYTHON发邮件代码:
# -*- coding:utf-8 -*-import smtplibfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.mime.application import MIMEApplicationHost ='mail.xxx.com'Port = 25User ='name@xxx.com'Password = 'pazzzz'To='toname@yyy.com'Subject='保单情况'class EmailApp: def __init__(self, host, port=25): self.host = host self.port = port self.user = None self.mail = smtplib.SMTP(host, port, timeout=10) def login(self, user, password): self.user = user self.mail.login(user, password) return self def send(self, To, Cc=None, subject=None, **kwargs): msg = MIMEMultipart() msg['From'] = self.user msg['To'] = To msg['Subject'] = Subject # ---这是正文部分--- text = kwargs.get('text', '') part = MIMEText(text) msg.attach(part) # ---这是附件部分--- file = kwargs.get('file', '') filename = os.path.basename(file) part = MIMEApplication(open(file, 'rb').read()) part.add_header('content-disposition', 'attachment', filename=('gbk', '', filename)) msg.attach(part) self.mail.sendmail(self.user, To, msg.as_string()) def quit(self): self.mail.quit() del self.mailtry: email = EmailApp(Host, port=Port) email.login(User, Password) text = '大家好,这是今天的%s报表更新,请查收!' % Subject email.send(To=To, subject=Subject, file=Path, text=text) print('发送成功 >>> %s' % Path)except Exception as e: print('邮件发送失败 >>> %s' % Path) print(traceback.format_exc()) email.quit() raiseemail.quit()
效果如下:
到此我们就实现了使用代码完成报表刷新和发送的任务,再设置个任务计划程序定时跑PYTHON就可以了:
1、把上面的合成代码存储为文件'sendmail.py'
2、将下面的文本复制进记事本并更改后缀为bat,命名为“run_sendmail.bat”
@echo offcd /D D:\test #第一步代码存贮的路径@echo onpython sendmail.py
样式参考:
3、邮件“计算机”选择“管理”,选择“任务计划程序”,“创建基本任务”,后面按提示把“run_sendmail.bat”设为自动启动就可以了
最后说一句,你可以批量设置,批量发送邮件,例如客户生日批量发送不同的祝福邮件,或者根据数据库里的逾期数据发送给客户逾期催收邮件,再或者给客户发送客户的账单消费信息,感兴趣的可以自己动手研究。