当前位置: > 运维管理 > python学习笔记 >

Python读取指定日期邮件

时间:2017-11-09 02:05来源:blog.csdn.net 作者:tcl415829566的博客 举报 点击:

背景:9月份有部分数据缺失,这部分数据在邮箱里,需要重新拉取,但是每天几百封邮件,总共有6、7万封邮件,使用stat()和retr(which)结合遍历很

耗时

基于如上背景,初始大致思路为:

使用二分法获取到需要恢复数据时间范围内的中间一个值,也就是第几封邮件,然后分两头遍历,

读取到所有需要的邮件

算法函数:

1、获取到邮件的时间,由于可能收到格林威治时间邮件,所以这里做了相应的处理

 

[python] view plain copy
 
  1. def getTimeStamp(cn):  
  2.     messages=mailServer.retr(cn)[1]  
  3.     mail = email.message_from_bytes('\n'.encode('utf-8').join(messages))  
  4.     date=email.header.decode_header(mail.get('date'))  
  5.     utcstr = date[0][0].replace('+00:00','')  
  6.     global utcdatetime  
  7.     try:  
  8.         utcdatetime = datetime.datetime.strptime(utcstr, '%a, %d %b %Y %H:%M:%S +0000 (GMT)')  
  9.         localdatetime = utcdatetime + datetime.timedelta(hours=+8)  
  10.         localtimestamp = localdatetime.timestamp()  
  11.     except:  
  12.         utcdatetime = datetime.datetime.strptime(utcstr, '%a, %d %b %Y %H:%M:%S +0800')  
  13.         localtimestamp = utcdatetime.timestamp()  
  14.     return localtimestamp  

 

 

2、二分法
[python] view plain copy
 
  1. bu_daytimestamp yesterdaytimestamp两个是需要补数据的时间戳  

[python] view plain copy
 
  1. key_nums=0  
  2. mid2=mailCount  
  3. while 1==1:  
  4.     mid=getTimeStamp(round(mailCount))  
  5.     mid2=round(mid2/2)  
  6.     if mid >bu_daytimestamp:  
  7.         mailCount=mailCount-mid2  
  8.     elif mid<yesterdaytimestamp:  
  9.         mailCount=mailCount+mid2  
  10.     elif mid <=bu_daytimestamp and mid >=yesterdaytimestamp:  
  11.         key_nums=mailCount  
  12.         break  
  13.     print(mailCount)  
  14. print(key_nums)  

 

这里只记录算法,后续遍历比较简单,就不展示了

解释下部分参数:

 

[python] view plain copy
 
  1. mailServer:登录后的邮箱  
[python] view plain copy
 
  1. <pre name="code" class="python">mailCount:总的邮件数量,来源于mailServer.stat()第二个参数</pre><pre name="code" class="python"></pre>  
  2.  

 



			
------分隔线----------------------------
发表评论
为了和诣的生活,我关闭了评论页面,请大家到QQ群里交流吧:348944156,也欢迎关注本站微信公众号:centoscn