python imaplib 获取邮件的时间 python自动获取邮件数据_SQL


日常工作中我们会遇到很多重复性的数据需求,比如基础的日报,临时性的活动需求,可能每次只是改个时间参数,具体的表头和内容都是固定不变的,但是每天重复性的给业务方这个数据就很耽误自己的效率,所以如果可以有一个脚本每天处理数据并发邮件给相关人就会节省自己很多时间,提高效率。这个时候就可以使用Python来解决这个问题。
Python有很丰富的第三方包,这里我们需要Python连接mysql数据库来获取数据,然后需要处理Excel,把数据写入Excel,最后在通过邮件把数据发给相关小伙伴,这里需要连接数据库的pymysql包、操作Excel的openpyxl包、发送邮件的smtplib和email包,接下来我们按步骤来解决问题。
一、先导入需要的包


python imaplib 获取邮件的时间 python自动获取邮件数据_SQL_02


二、然后连接数据库处理数据


python imaplib 获取邮件的时间 python自动获取邮件数据_数据_03


python imaplib 获取邮件的时间 python自动获取邮件数据_从mysql中获取数据发送html邮件_04


这里为什么要处理两次呢,一个是获取我们的数据,一个是获取对应的表头,这里我们定义一个函数去接受连接数据库参数和SQL以及时间参数,这里默认时间参数为None,主要的流程是连接数据库,执行SQL,获取数据,关闭连接(不要忘关闭)。
连接数据库和我们日常连接参数一样:


python imaplib 获取邮件的时间 python自动获取邮件数据_SQL_05


这些参数我们写在main()方法里面,执行SQL的时候做一个判断,一般情况下一个SQL可能满足不了数据需求,同时可能需要传入多个日期参数,但是我们执行SQL的这个函数可以执行不同参数的SQL,所以做一个判断,对不同传参执行不同的SQL,然后通过fetchall()获取所有数据,fetchone()是获取一条数据,然后close()并返回数据,到这里连接数据库处理数据的工作就完成了
三、写入Excel
Python的pandas可以直接把SQL数据结果转成DateFrame,然后to_excel写入Excel,但是需要我们去拼接表头,这里在网上看见别人的一个轮子,写的不错,就直接copy过来使用了
这种遍历每个单元格写入数据的时候会出现因为包含特殊字符串而报错,Python有现成的第三方包可以处理这个问题


from openpyxl.cell.cell import ILLEGAL_CHARACTERS_RE


在单元格处理的时候加上这个方法就可以了


value=u'%s' % ILLEGAL_CHARACTERS_RE.sub(r'', str(data_2[row][col])))


python imaplib 获取邮件的时间 python自动获取邮件数据_数据_06


流程是新建一个工作簿,然后激活sheet页,再遍历数据往单元格里面写,如果需要把第二份数据写入第二个Excel则只需要再新激活一个sheet就可以了


python imaplib 获取邮件的时间 python自动获取邮件数据_SQL_07


最后保存并返回就可以了

这里处理方法会有点麻烦,需要单独循环遍历处理每一个单元格,还可以直接使用pandas来读取SQL然后获取df格式的数据,直接用pandas写入Excel,具体方法很简单,只需要简单运行对应的函数方法就可以了,具体以后有机会再说
四、发送邮件
发送邮件分成两部分,先写邮件再发送


python imaplib 获取邮件的时间 python自动获取邮件数据_从mysql中获取数据发送html邮件_08


写邮件就是把常规发送邮件的内容完善,包括发件人、收件人、邮件主题、正文、附件


python imaplib 获取邮件的时间 python自动获取邮件数据_从mysql中获取数据发送html邮件_09


这里使用163邮箱发送,进行对应的配置,这里把错误打印出来,163邮箱还是蛮坑的,很多莫名其妙的报错,公司内部一般都是使用企业邮箱,会方便很多,配置也是一样


python imaplib 获取邮件的时间 python自动获取邮件数据_从mysql中获取数据发送html邮件_10


python imaplib 获取邮件的时间 python自动获取邮件数据_数据_11


同样的邮件内容和配置信息也是写在main()方法里面,收件人可以随便添加,也可以是邮件组,到这儿邮件的部分就结束了
五、日期参数


python imaplib 获取邮件的时间 python自动获取邮件数据_从mysql中获取数据发送html邮件_12


因为我们的SQL还需要接受时间参数,所以这里定义两个函数去获取日期,但是需要注意的是返回的是str格式,否则在跑SQL的时候会报错
六、main()方法
这里还需要说一下SQL的传参


python imaplib 获取邮件的时间 python自动获取邮件数据_从mysql中获取数据发送html邮件_13


这里我们写了两个SQL然后把日期当做参数传进来
剩下的就是补全main()方法,然后运行就可以了
然后把脚本放在服务器上面设置定时任务就完事了,就解放自己啦,其他的需求基本上都是类似处理,日常的重复性需求就不需要花费很多精力,如果脚本多了还需要关注每天这些脚本是否发送成功,这里可以在脚本里面增加邮件发送失败报警,可以是邮件报警,也可以是电话报警,这里根据实际情况处理就ok了。