利用Python定时取数、发邮件
2018-06-03 本文已影响27人
废柴社
定时发数据类日报、周报什么的非常枯燥,如果能定时自动化实现,是件美事。
这里的关键点:1. 数据源是否自动更新的;2. 统计汇总公式等可否函数化;3. 统计好后如何展示并发布给使用者。
最好的方案当然是直接做一套前后端一体的网页日报,但对小型团队来说这有点耗成本,何况工作多变,领导哪天关注点就变了。
三个关键点:其中1需要通过共享的数据存取服务来解决——数据库、或者一个数据接口(这个最麻烦,很多传统企业数据都是放到excel中处理的,当然,python也可以调用,但实时性差很多);2 :写好程序调用执行即可;3. 写个网页页面(耗时而不够灵活),或者:发个邮件附上数据表?
使用python 并采取最简方案处理:
- 定时任务器
- 通过python连接数据库取数、生成Excel文件
- 发送邮件
两种定时任务器
一是间隔多久执行一次;
import schedule
import time
# 每隔10分钟;小时、天均可. 注意do 中的函数不带括号
schedule.every(10).minutes.do(sendmails)
time.sleep(10)
while True:
schedule.run_pending()
二是指定每天几点几分执行一次。
while True:
# 配置
# __time_____
ehour = 1# 定时小时
emin = 1# 定时分钟
esec = 1 # 定时秒
current_time = time.localtime(time.time()) # 当前时间date
# 操作
if ((current_time.tm_hour == ehour) and (current_time.tm_min == emin) and (current_time.tm_sec == esec)):
print("START")
# 调用相关方法:执行计算、发邮件动作。
sendmails()
time.sleep(1)
实时取数
这个不展开,利用pymysql链接数据库,利用pandas下的read_sql_query,执行对应的sql语句即可。生成dataframe后,按df处理数据并保存到excel中即可。
# filepath + filename 两项统一配置,在发送邮件选择附件时也需要用到。
# 配置数据库链接:
def get_conn_dmm():
connect = pymysql.Connect(
host= ,
port= ,
user=' ',
passwd=' ',
db=' ',
charset='utf8'
)
return connect
def getcustList():
conn = get_conn_dmm()
dflist = pd.read_sql_query(sqlNewCustList,conn)
writer = pd.ExcelWriter(filepath + filename)
#用writer可以写多个sheet.
dfsum.to_excel(writer, sheet_name='', header=['col1','col2'], index=False)
dflist.to_excel(writer, sheet_name=' sheet1', index=False)
writer.save()
writer.close()
发邮件
有了定时器,有了可执行的查询并生成excel文件的函数,剩下的就是发邮件了。
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email import encoders
import time
#设置登录及服务器信息
receivers = ['Email add 1 ','Email add 2']
sender = 'myEmail @ xx.com'
# 请在邮件服务商中查找,阿里企业邮为此串;
mail_host = 'smtp.mxhichina.com',
# 密码
mail_pass = ''
def sendmails(subject,receivers):
#设置eamil信息
#添加一个MIMEmultipart类,处理正文及附件
message = MIMEMultipart()
message['From'] = sender
message['To'] = receivers[0]
#邮件标题
message['Subject'] = subject
# 邮件正文,当然也可以写在一个文本文件中,读取进来。
e_content = '您好! \n 附件是…… \
'\n祝顺利!' \
'\n \n \n----- \n如有问题…'
message.attach(MIMEText(e_content, 'plain', 'utf-8'))
att1 = MIMEText(open(file_path + file_name, 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
#att1["Content-Disposition"] = "attachment;filename=" + ('gbk','',file_name)
att1.add_header('Content-Disposition', 'attachment', filename=('gbk', '', filename))
# gbk,以及encoders可以降低附件名称出现乱码的概率,但在outlook中查看附件时仍可能出现乱码。
encoders.encode_base64(att1)
message.attach(att1)
#登录并发送
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host,25)
smtpObj.login(sender,mail_pass)
smtpObj.sendmail(
sender,receivers,message.as_string())
print('success')
smtpObj.quit()
except smtplib.SMTPException as e:
print('error',e)
其它问题:
如果是日报,生成的文件最好可以加上日期,避免文件冲突—— 可以把time中的日期放入文件命名中;
如果生成的文件比较多,最好可以创建带日期的文件路径(os.makedirs(path)),当然,创建前需要判断该路径是否存在。
如果生成的Excel 排版不够好…… 这个就复杂一点,需要使用python直接操控excel的库,比如xlsxwriter 等。