利用Python imaplib和email模块 读取邮件文本内容及附件内容

python使用imap接收邮件的过程探索

https://www.cnblogs.com/yhlx/archive/2013/03/22/2975817.html

#! encoding:utf8
''' 
环境:
	Win10 64位 Python 2.7.5
参考:
	http://www.pythonclub.org/python-network-application/email-format
	http://blog.sina.com.cn/s/blog_4deeda2501016eyf.html
'''


import imaplib
import email


def parseHeader(message):
    """ 解析邮件首部 """
    subject = message.get('subject')   
    h = email.Header.Header(subject)
    dh = email.Header.decode_header(h)
    subject = unicode(dh[0][0], dh[0][1]).encode('gb2312')
    # 主题
    print subject
    print '</br>'
    # 发件人
    print 'From:', email.utils.parseaddr(message.get('from'))[1]
    print '</br>'
    # 收件人
    print 'To:', email.utils.parseaddr(message.get('to'))[1]
    print '</br>'
	# 抄送人
    print 'Cc:',email.utils.parseaddr(message.get_all('cc'))[1]
    


def parseBody(message):
	""" 解析邮件/信体 """
	# 循环信件中的每一个mime的数据块
	for part in message.walk():
    	# 这里要判断是否是multipart,是的话,里面的数据是一个message 列表
	    if not part.is_multipart(): 
	        charset = part.get_charset()
	        # print 'charset: ', charset
	        contenttype = part.get_content_type()
	        # print 'content-type', contenttype
	        name = part.get_param("name") #如果是附件,这里就会取出附件的文件名
	        if name:
	            # 有附件
	            # 下面的三行代码只是为了解码象=?gbk?Q?=CF=E0=C6=AC.rar?=这样的文件名
	            fh = email.Header.Header(name)
	            fdh = email.Header.decode_header(fh)
	            fname = dh[0][0]
	            print '附件名:', fname
	            # attach_data = par.get_payload(decode=True) # 解码出附件数据,然后存储到文件中
	 
	            # try:
	            #     f = open(fname, 'wb') #注意一定要用wb来打开文件,因为附件一般都是二进制文件
	            # except:
	            #     print '附件名有非法字符,自动换一个'
	            #     f = open('aaaa', 'wb')
	            # f.write(attach_data)
	            # f.close()
	        else:
	            #不是附件,是文本内容
	            print part.get_payload(decode=True) # 解码出文本内容,直接输出来就可以了。
	 			# pass
	        # print '+'*60 # 用来区别各个部分的输出


def getMail(host, username, password, port=993):
	try:
		serv = imaplib.IMAP4_SSL(host, port)
	except Exception, e:
		serv = imaplib.IMAP4(host, port)

	serv.login(username, password)
	serv.select()
	# 搜索邮件内容
	typ, data = serv.search(None, '(FROM "xx@xxx.com")')

	count = 1
	pcount = 1
	for num in data[0].split()[::-1]:
	    typ, data = serv.fetch(num, '(RFC822)')
	    text = data[0][1]
	    message = email.message_from_string(text)	# 转换为email.message对象
	    parseHeader(message)
	    print '</br>'
	    parseBody(message)	  
	    pcount += 1
	    if pcount > count:
	    	break

	serv.close()
	serv.logout()


if __name__ == '__main__':
	host = "imap.mail_serv.com" # "pop.mail_serv.com"
	username = "Trevor@mail_serv.com"
	password = "your_password"
	getMail(host, username, password)

参考:https://my.oschina.net/dexterman/blog/177650

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏个人分享

Spark Netty与Jetty (源码阅读十一)

  spark呢,对Netty API又做了一层封装,那么Netty是什么呢~是个鬼。它基于NIO的服务端客户端框架,具体不再说了,下面开始。

18640
来自专栏崔庆才的专栏

是时候抛弃print了,开始体验下logging的强大吧!

25120
来自专栏芋道源码1024

注册中心 Eureka 源码解析 —— 网络通信

本文主要分享 Eureka 的网络通信部分。在不考虑 Eureka 2.x 的兼容的情况下,Eureka 1.x 主要两部分的网络通信:

11620
来自专栏码匠的流水账

聊聊spring for kafka对consumer的封装与集成

本文主要解析一下spring for kafka对原生的kafka client consumer的封装与集成。

20010
来自专栏微服务生态

玩转EhCache之最简单的缓存框架

Ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cach...

78140
来自专栏日常分享

Java 端口扫描器 TCP的实现方法

想必很多朋友都实现过一个简易的聊天室这个功能,其中涉及到Socket套接字这个类,我们通过一个特定的IP以及特定的端口创建一个服务端的套接字(ServerSoc...

22510
来自专栏黑泽君的专栏

day12_JavaWeb设计模式与案例学习笔记

    C/S:客户端 / 服务器 (胖客户端)比如:LOL、CS、魔兽世界。.exe安装文件。     B/S:浏览器 / 服务器(瘦客户端)比如:页游。网页...

9820
来自专栏编程之旅

Linux的用户管理(二)

上次的博客我们讲了关于Linux的用户管理的内容,现在我们来讲第二部分——系统用户组的管理。

15110
来自专栏云霄雨霁

Java虚拟机--(互斥同步与非阻塞同步)和锁优化

22040
来自专栏沃趣科技

MySQL中server_id一致带来的问题

简 介 我们都知道在MySQL搭建复制环境的时候,需要设置每个server的server_id不一致,如果主库与从库的server_id一致,那么复制会失败。...

43860

扫码关注云+社区

领取腾讯云代金券