1.需求描述:

我们经常有这样的需求,需要某个邮箱中提取一个mailist的人员,发来的特定邮件,比如他们的周报,提交的patch等等。由于这是一个周期性的工作,有很大的重复和繁杂性,我们这里编写了一个脚本来实现它。这里,我们的需求是:统计指定人员,发来的邮件主题是"weekly report"的邮件,然后查看有哪些人提交了相关的周报。

2.设计

我们可以使用python的imaplib库,来与特定的邮件服务器进行交互,提取相关的邮件,然后把这些找到的邮件都标记为“已读”。

3.代码实现与解析

配置文件部分:

1 [server]

2 hostname=imap.163.com//邮件服务器地址

3

4 [account]

5 username=yourusername

6 password=********

这个是针对python的特定配置文件,里面存放了相应的邮件服务器地址和相应的用户名和密码。

核心代码:

1 #!/usr/bin/python

2 import imaplib

3 from pprint import pprint

4 import ConfigParser

5 import os

6 import re

7 import datetime

8 import string

9 import csv

10 Maillist=['Wei NN Yang','Li AG Zhang','Ya Zhou L Li','Wan Peng WP Li','Guo Wen Shan','Jian Long Hei','Chen g Jie He','Sheng SH Liu','Jia AH He','Zhi Yong Wu','Yun YY Wang','Da Yu Qiu','Cong Meng','Guo SH Chao','Hu ai Cheng HC Zheng','Tian Hong BJ Wang','Man ML Li']

11 pattern=re.compile(r'\((?P.*)\) "(?P.*)" (?P.*)')

12 def parse_list_response(line):

13 match=pattern.match(line)#进行模式匹配

14 flags,delimiter,mailbox_name=match.groups()

15 mailbox_name=mailbox_name.strip('"')#去掉分号

16 return (flags,delimiter,mailbox_name)#注意返回的是“结构体类型”

17

18 def open_connection(verbose=False):

19 config=ConfigParser.ConfigParser()#初始化config对象

20 config.read([os.path.expanduser('./.pymotw')])读取配置文件

21

22 hostname=config.get('server','hostname')

23 username=config.get('account','username')

24 password=config.get('account','password')#读取相应配置文件的值

25

26 connection=imaplib.IMAP4_SSL(hostname)#初始化一个链接对象

27 try:

28 connection.login(username,password)

29 except Exception as err:

30 print "Errot:",err

31 return connection

32

33 def search_count(username,sincetime):

34 c=open_connection(verbose=True)

35 try:

36 typ,data=c.select('ibm')#注意这种赋值方式,返回值是状态和消息数目,但是这个函数改变了connection对象的组成

37 count=0

38 typ,msg_ids=c.search(None,'(FROM "'+username+'")','(TO "LTC")','(SENTSINCE "'+sincetime+'")')#注意search函数的使用

39 #print "msg_ids:",msg_ids

40 if msg_ids[0]=="":

41 return 0

42

43 ids=msg_ids[0].split(" ")#分割消息号

44 # print "ids:", ids

45 for msgid in ids:

46 # print msgid

47 content=c.fetch(msgid,'(BODY.PEEK[HEADER])')#提取消息体

52 count+=string.count((str)(content),"eekly")#查看消息体中是否含有weekly字样

53 #print count

54 except Exception as err:

55 print "error:" , err

56 finally:

57 return count

58 # c.close()

59 # c.logout()

68 def mounth_translate(mounth):#这是一个把数字月份转化成相关月份简称的函数

69 if mounth==1:

70 return 'JAN'

71 if mounth==2:

72 return 'FEB'

73 if mounth==3:

74 return 'MAR'

75 if mounth==4:

76 return 'APR'

77 if mounth==5:

78 return 'MAY'

79 if mounth==6:

80 return 'JUN'

81 if mounth==7:

82 return 'JUL'

83 if mounth==8:

84 return 'AUG'

85 if mounth==9:

86 return 'SEPT'

87 if mounth==10:

88 return 'OCT'

89 if mounth==11:

90 return 'NOV'

91 if mounth==12:

92 return 'DEC'

93 return 'NULL'

94

95 if __name__=='__main__':

96 mouth=input("please input the mounth of since time:")

97 strmouth=mounth_translate(mouth)

98 print strmouth

99 day=str(input("please input the day of since time:"))#python中的类型转化与C语言的差别从这一句中可以看出来

100 since=day+"-"+strmouth+"-2013"#这里的转化是为了符合后来的函数调用参数规范

101 print since

102 with open('ltc_weekly_report.csv','wt') as f:

103 writer=csv.writer(f)

104 writer.writerow(('name','state'))#这是一个简单的csv文件读写格式

105 for username in Maillist:

106 count=search_count(username,since)

107 writer.writerow((string.join(username),count))

108 today=datetime.date.today()#时间函数,提取当前年月日

109 print today

110 writer.writerow(("the information is get before 17:00 on",str(today)))

111 #print count

下面针对具体的函数和库进行相关解析:

(1)__name__=='__main__'的作用

__name__,__name__作为模块的内置属性,简单点说呢,就是.py文件的调用方式。

最后是__main__,刚才我也提过,.py文件有两种使用方式:作为模块被调用和直接使用。如果它等于"__main__"就表示是直接执行。

总结:在if __name__ == "__main__":之后的语句作为模块被调用的时候,语句之后的代码不执行;直接使用的时候,语句之后的代码执行。通常,此语句用于模块测试中使用。

(2 )python中的switch case语句

代码中有一段很长的if分支,因为python没有switch可以利用,此时我们可以用dict来实现switch的功能:

dict = {"a" : "apple", "b" : "banana", "g" : "grape", "o" : "orange"}dict["w"] = "watermelon"

(3) 写文件的时候,程序可以实现进度条的功能

此时,可以利用sys.stdout.write()或者print后面加上逗号来实现不还行

python从邮箱获取指定邮件_用python提取并统计指定邮箱里的特定邮件 | 学步园相关推荐

  1. python根据月份获取月初月末_用python获取月末数据

    我对Python很陌生.在 我试图找出如何为每个数据集(aapl.intc.ebay和amzn)获取月末的"Adj Close"行.在 以下是我所做的:import numpy a ...

  2. python从邮箱获取指定邮件_用python提取并统计指定邮箱里的特定邮件

    1.需求描述: 我们经常有这样的需求,需要某个邮箱中提取一个mailist的人员,发来的特定邮件,比如他们的周报,提交的patch等等.由于这是一个周期性的工作,有很大的重复和繁杂性,我们这里编写了一 ...

  3. python自动发outlook邮件_使用python自动发邮件(163、QQ、outlook邮箱)

    import smtplib fromemail.mime.text import MIMEText fromemail.utils import formataddr fromdatetime im ...

  4. smtplib 抄送邮件_用Python收发电子邮件

    电子邮件是最古老的互联网服务之一,发明于1969年,它已经50岁了!它并不要求收信人发信人同时连接网络,邮件存放于服务器,所以至今在企业内部还在大量使用.而且它是开放协议,没有被某大公司垄断.我们完全 ...

  5. pandas整表写入excel指定位置_当Python遇到Excel,一个能打的都没有~

    几乎人人都在用Excel,这种极易上手的数据分析工具无处不在,一旦你掌握了窍门,它就变得非常强大.而Python通常被认为更具有挑战性,但能做的事也更多. 当Python遇到Excel会发生什么?本文 ...

  6. native.loadlibrary获取路径不对_【Python专题(三)】Python模块导入与路径管理

    ​前言 Python项目的路径管理是一个让人头疼的问题.在写python项目的时候,明明 import了文件A,代码运行时却收到 ModuleNotFoundError,仔细一看,是引用路径不对,很是 ...

  7. python获取网卡名称_用Python获取计算机网卡信息

    0. 前言 正常情况下,如果想要查看电脑的网卡IP地址或是MAC地址,直接通过界面找到网卡进行查看就有了,亦或是通过命令如linux的ifconfig得到IP等信息,那么本节教大家如何通过python ...

  8. python经纬度获取县名_利用 Python 批量获取县镇运输距离

    起因 最近做规划项目,领导让查出某几个市的所有乡镇级行政区域,距离所在县级行政中心的交通运输距离.想着也不是啥难事儿,高德地图一搜就有. 当我把各市行政区划统计完,发现一共有五百多个乡镇,意味着要在地 ...

  9. python 获取唯一值_从Python列表中获取唯一值

    python 获取唯一值 In this article, we will be understanding 3 ways to get unique values from a Python lis ...

最新文章

  1. 个人博客前端模板_博客设计——概述
  2. js 引用 java常量_java调用JS 与JS 调java
  3. 在R中调用关联规则——Apriori算法
  4. 关于目录操作walk
  5. 【qduoj - 夏季学期创新题】矩形剖分(递归,dp)
  6. 昇兴集团:搭建帆软报表系统,打破数据孤岛,工作效率提升5倍
  7. Ext JS 3.2.0发布(转)
  8. linux 指针什么意思,在linux中获取指向结构设备指针的更简洁方法是什么?
  9. vue源码解析推荐文章
  10. html a标签中 href 和 onclick 同时使用的问题 优先级别
  11. 【优化算法】差分松鼠搜索优化算法(DSSA)【含Matlab源码 1330期】
  12. 超分辨率重建测试(DASR)
  13. C语言中的除法运算符
  14. 基于ssm+java+sql企业名录综合统计系统
  15. Linux命令之ss命令
  16. Ubuntu离线网卡驱动安装
  17. 深入理解操作系统实验——bomb lab(phase_3)
  18. 关于我的大学ACM江湖
  19. perforce(p4)相关问题
  20. 手把手教你用TensorFlow、Keras打造美剧《硅谷》中的“识别热狗”APP

热门文章

  1. Lync 2010 客户端:无法登陆到Lync,验证服务器中的证书时遇到问题
  2. Python算法题笔记
  3. OPPO手机计算机怎么打符号,OPPO手机怎么开启输入的九键快捷符号调频功能
  4. Neutron DHCP-Agent问题分析定位(1)
  5. 笔记本电脑安装 OMV 关闭屏幕自动休眠的问题
  6. javascript蜘蛛纸牌
  7. 4.11 Lewis Carroll等式
  8. 瑞禧整理常见的抗体药物偶连物(ADC-Linker)名称及结构式大全
  9. PCI Express学习篇---Power Management(二)
  10. hadoop分布式安装部署具体视频教程(网盘附配好环境的CentOS虚拟机文件/hadoop配置文件)...