利用Python定时取数、发邮件

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

这里的关键点: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 等。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    aimaile阅读 26,294评论 6 428
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,165评论 4 16
  • 英文原版:https://github.com/vinta/awesome-python中文版:https://g...
    会灰的大飞狼阅读 3,559评论 1 56
  • 我知道世界上没有后悔药这种东西,也知道假如要是这种假设局也是真真切切的不存在的。但是有一句话说的好:人是要有梦想的...
    未恋小王子阅读 340评论 0 0
  • 每当我安静下来的时候,身体不舒服的时候,开心的时候,不开心的时候,离不开手机的时候,都无比厌恶这样的自己。你一点都...
    嘟嘟嘴_f328阅读 173评论 0 0