很多数据分析师的工作的流程:
(1)数据库取数-->(2)根据业务主题分析汇总数据-->(3)邮件汇报分析结果。
对于1、2步而言,一般都是使用python或者R语言编写程序进行任务处理(也可以是Scala等处理spark平台的海量数据)
通常情况下对于相似主题的数据分析任务,可以重复使用之前的程序。比如业务决策层想每天10点准时看某项业务的数据表现,此时分析的任务就是固定的,如果不会自动定时发邮件,那就要求分析师每天10点准时统计数据,并且手动编写邮件内容、添加附件后发送邮件,这听起来不是高效的方式。试想如果每天花5-10分钟在编写重复结构的邮件上,一年下来就是30-60小时,如果会自动发邮件,这笔时间就省下来了。
废话不多说,上代码:
实现邮件功能的脚本 main.py:
# -*- coding: utf-8 -*-
"""
@author: heting
"""
import smtplib
import email
from email.mime import multipart# import MIMEMultipart
from email.mime import text# import MIMEText
from email.mime import base# import MIMEBase
import os.path
import mimetypes
#邮箱认证
#"username": "***@***.com",
#"password": "******",
def Send_email(file_name_list,email_text,recei_list):
mail_info = {
"from": "***@***.com",#自己的邮箱账号
"to": "***@***.com",#接收邮件的对方账号
"hostname": "smtp.exmail.qq.com",
"username": "***@***.com",#开通smtp服务的邮箱账号
"password": "******",#开通smtp服务的对应密码
"mail_subject": "test",
"mail_text": "hello, this is a test email, sended by python",
"mail_encoding": "utf-8"
}
server = smtplib.SMTP_SSL(mail_info["hostname"],port=465)
server.ehlo(mail_info["hostname"])
server.login(mail_info["username"],mail_info["password"])#仅smtp服务器需要验证时
# 构造MIMEMultipart对象做为根容器
main_msg = multipart.MIMEMultipart()
# 构造MIMEText对象做为邮件显示内容并附加到根容器
text_msg = text.MIMEText(email_text,_charset="utf-8")
main_msg.attach(text_msg)
# 构造MIMEBase对象做为文件附件内容并附加到根容器
for file_name in file_name_list:
## 读入文件内容并格式化 [方式1]
data = open(file_name, 'rb')
ctype,encoding = mimetypes.guess_type(file_name)
if ctype is None or encoding is not None:
ctype = 'application/octet-stream'
maintype,subtype = ctype.split('/',1)
file_msg = base.MIMEBase(maintype, subtype)
file_msg.set_payload(data.read())
data.close()
email.encoders.encode_base64(file_msg)#把附件编码
## 设置附件头
basename = os.path.basename(file_name)
file_msg.add_header('Content-Disposition','attachment', filename = basename,encoding='utf-8')
main_msg.attach(file_msg)
# 设置根容器属性
main_msg['From'] = mail_info['from']
main_msg['To'] = ';'.join(recei_list)
main_msg['Subject'] = email_text
main_msg['Date'] = email.utils.formatdate()
#得到格式化后的完整文本
fullText = main_msg.as_string()
#用smtp发送邮件
try:
server.sendmail(mail_info['from'], recei_list, fullText)
finally:
server.quit()
类似的可以网上搜索如何开通所使用类型邮箱的smtp服务。
实现定时功能的脚本 timer.py:
# -*- coding: utf-8 -*-
"""
@author: heting
"""
# 以需要的时间间隔执行某个命令
import time, os
import logging
def re_exe(cmd_list, inc = 10):
while True:
ts_start = datetime.datetime.now()
if ts_start.hour==10:#每天10点定时运行task脚本
for cmd in cmd_list:
os.system(cmd);
logging.info('update sucess!-->%s分割线----------'%ts_start.strftime('%Y%m%d %H:%M:%S'),'\n')
time.sleep(inc)
cmd_list = ['python task.py']
re_exe(cmd_list, 10)
实现数据分析任务的脚本:task.py
#此处发送2张dataframe样表为例,应该放入实际的数据分析任务代码
from pandas import DataFrame
from main import Send_email
import datetime
import os
os.chdir('./')
df1 = DataFrame({'type':['a','b','c','d'],'value':[1,2,3,4]})
df2 = DataFrame({'type':['e','f','g','h'],'value':[5,6,7,8]})
df1.to_excel('df1.xlsx')
df2.to_excel('df2.xlsx')
#将2张表邮件发送
file_name_list = ['df1.xlsx','df2.xlsx']
email_text = "%s数据分析结果"%datetime.datetime.now().strftime('%Y%m%d %H')
recei_list = ['12345678@qq.com','66666666@qq.com']#写上自己的邮箱测试一下
Send_email(file_name_list,email_text,recei_list)
打印一下df1和df2表具体内容:
type value
0 a 1
1 b 2
2 c 3
3 d 4
type value
0 e 5
1 f 6
2 g 7
3 h 8
最后我们只需要在后台运行timer.py就OK了,收件列表里面的邮箱用户就能每天定时收到这两张表了,
不用守着电脑发邮件了 ,把省出来的时间听听音乐或者学习新技能吧!
如果您觉得有帮助的话,可以扫码,赞赏鼓励一下!谢谢!