python从邮箱获取指定邮件_用python提取并统计指定邮箱里的特定邮件 | 学步园
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提取并统计指定邮箱里的特定邮件 | 学步园相关推荐
- python根据月份获取月初月末_用python获取月末数据
我对Python很陌生.在 我试图找出如何为每个数据集(aapl.intc.ebay和amzn)获取月末的"Adj Close"行.在 以下是我所做的:import numpy a ...
- python从邮箱获取指定邮件_用python提取并统计指定邮箱里的特定邮件
1.需求描述: 我们经常有这样的需求,需要某个邮箱中提取一个mailist的人员,发来的特定邮件,比如他们的周报,提交的patch等等.由于这是一个周期性的工作,有很大的重复和繁杂性,我们这里编写了一 ...
- python自动发outlook邮件_使用python自动发邮件(163、QQ、outlook邮箱)
import smtplib fromemail.mime.text import MIMEText fromemail.utils import formataddr fromdatetime im ...
- smtplib 抄送邮件_用Python收发电子邮件
电子邮件是最古老的互联网服务之一,发明于1969年,它已经50岁了!它并不要求收信人发信人同时连接网络,邮件存放于服务器,所以至今在企业内部还在大量使用.而且它是开放协议,没有被某大公司垄断.我们完全 ...
- pandas整表写入excel指定位置_当Python遇到Excel,一个能打的都没有~
几乎人人都在用Excel,这种极易上手的数据分析工具无处不在,一旦你掌握了窍门,它就变得非常强大.而Python通常被认为更具有挑战性,但能做的事也更多. 当Python遇到Excel会发生什么?本文 ...
- native.loadlibrary获取路径不对_【Python专题(三)】Python模块导入与路径管理
前言 Python项目的路径管理是一个让人头疼的问题.在写python项目的时候,明明 import了文件A,代码运行时却收到 ModuleNotFoundError,仔细一看,是引用路径不对,很是 ...
- python获取网卡名称_用Python获取计算机网卡信息
0. 前言 正常情况下,如果想要查看电脑的网卡IP地址或是MAC地址,直接通过界面找到网卡进行查看就有了,亦或是通过命令如linux的ifconfig得到IP等信息,那么本节教大家如何通过python ...
- python经纬度获取县名_利用 Python 批量获取县镇运输距离
起因 最近做规划项目,领导让查出某几个市的所有乡镇级行政区域,距离所在县级行政中心的交通运输距离.想着也不是啥难事儿,高德地图一搜就有. 当我把各市行政区划统计完,发现一共有五百多个乡镇,意味着要在地 ...
- python 获取唯一值_从Python列表中获取唯一值
python 获取唯一值 In this article, we will be understanding 3 ways to get unique values from a Python lis ...
最新文章
- 个人博客前端模板_博客设计——概述
- js 引用 java常量_java调用JS 与JS 调java
- 在R中调用关联规则——Apriori算法
- 关于目录操作walk
- 【qduoj - 夏季学期创新题】矩形剖分(递归,dp)
- 昇兴集团:搭建帆软报表系统,打破数据孤岛,工作效率提升5倍
- Ext JS 3.2.0发布(转)
- linux 指针什么意思,在linux中获取指向结构设备指针的更简洁方法是什么?
- vue源码解析推荐文章
- html a标签中 href 和 onclick 同时使用的问题 优先级别
- 【优化算法】差分松鼠搜索优化算法(DSSA)【含Matlab源码 1330期】
- 超分辨率重建测试(DASR)
- C语言中的除法运算符
- 基于ssm+java+sql企业名录综合统计系统
- Linux命令之ss命令
- Ubuntu离线网卡驱动安装
- 深入理解操作系统实验——bomb lab(phase_3)
- 关于我的大学ACM江湖
- perforce(p4)相关问题
- 手把手教你用TensorFlow、Keras打造美剧《硅谷》中的“识别热狗”APP
热门文章
- Lync 2010 客户端:无法登陆到Lync,验证服务器中的证书时遇到问题
- Python算法题笔记
- OPPO手机计算机怎么打符号,OPPO手机怎么开启输入的九键快捷符号调频功能
- Neutron DHCP-Agent问题分析定位(1)
- 笔记本电脑安装 OMV 关闭屏幕自动休眠的问题
- javascript蜘蛛纸牌
- 4.11 Lewis Carroll等式
- 瑞禧整理常见的抗体药物偶连物(ADC-Linker)名称及结构式大全
- PCI Express学习篇---Power Management(二)
- hadoop分布式安装部署具体视频教程(网盘附配好环境的CentOS虚拟机文件/hadoop配置文件)...