每天五行代码

利用Python定时取数、发邮件

2018-06-03  本文已影响27人  废柴社

定时发数据类日报、周报什么的非常枯燥,如果能定时自动化实现,是件美事。

这里的关键点:1. 数据源是否自动更新的;2. 统计汇总公式等可否函数化;3. 统计好后如何展示并发布给使用者。

最好的方案当然是直接做一套前后端一体的网页日报,但对小型团队来说这有点耗成本,何况工作多变,领导哪天关注点就变了。

三个关键点:其中1需要通过共享的数据存取服务来解决——数据库、或者一个数据接口(这个最麻烦,很多传统企业数据都是放到excel中处理的,当然,python也可以调用,但实时性差很多);2 :写好程序调用执行即可;3. 写个网页页面(耗时而不够灵活),或者:发个邮件附上数据表?

使用python 并采取最简方案处理

两种定时任务器

一是间隔多久执行一次;

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 等。

上一篇 下一篇

猜你喜欢

热点阅读