# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之poplib模块下载并解析邮件 #https://github.com/michaelliao/learn-python/blob/master/email/fetchmail_pop3.py import poplib,email from email.parser import Parser from email.header import decode_header from email.utils import parseaddr #编码处理 def guess_charset(msg): charset = msg.get_charset()#从msg对象获取编码 if charset is None: content_type = msg.get('Content-Type', '').lower()#如果获取不到,再从content—type字段获取 if 'charset' in content_type: charset=content_type.split('charset=')[1].strip() return charset return charset #数据解码 def decode_str(s): value, charset = decode_header(s)[0]#数据,数据编码方式,from email.header import decode_header if charset: value = value.decode(charset) return value #print_ingo函数: def print_info(msg, indent=0):#indent用于缩进显示 if indent == 0: for header in ['From', 'To', 'Subject']:#邮件的from、to、subject存在于根对象上 value = msg.get(header, '') if value: if header=='Subject': value = decode_str(value)#需要解码subject字符串 else: #解码mail地址 hdr, addr = parseaddr(value) name = decode_str(hdr) value = '%s' % (addr) print '%s:%s'%(header,value) print '--'*20 if (msg.is_multipart()): #如果邮件对象是一个is_multipart,get_payload()返回一个list,包含所有子对象 parts = msg.get_payload()#循环获得列表项 for n, part in enumerate(parts): #print('%spart %s' % (' ' * indent, n)) #print('%s------------' % (' ' * indent)) #递归打印没一个子对象 print_info(part, indent + 1) else: #邮件对象不是一个is_multipart,就根据content_type判断 content_type = msg.get_content_type()#数据类型 if content_type=='text/plain' or content_type=='text/html':#纯文本 html文本 #纯文本或html内容 content = msg.get_payload(decode=True)#获得文本对象的字符串而非对象本身 charset = guess_charset(msg)#要检测文本编码 if charset:content = content.decode(charset) content='%s' % (content) print content#获取邮件文本内容,如果只有文本,打印显示的结果和邮件中看的效果一模一样 else: print '不是文本' #链接到pop3服务器 server=poplib.POP3('pop.163.com') #打印pop3服务器的欢迎对象 #server.getwelcome() #身份认证 email='xxxx@163.com' password='xxxx' server.user(email)#输入邮件地址 server.pass_(password)#输入口令 #print('Messages: %s. Size: %s' % server.stat())#Messages: 3. Size: 36090 #请求消息列表,返回所有邮件的编号;可以查看返回的列表类似['1 82923', '2 2184', ...] resp, mails, octets = server.list() #获取最新一封邮件 #Poplib模块的retr()函数使用来下载邮件的。它每次刚好下载一封邮件,我们必须传递给他想要下载的邮件的数字。 #print mails#['1 2721', '2 2784', '3 2986', '4 28987', '5 10056', '6 753', '7 763'] #注意索引号从1开始,那么最新的一封邮件就是索引最大的那个数值 lenString=len(mails) resp, mailContent, octets = server.retr(lenString)#mailContent:邮件内容 #解析邮件:只需要一行代码就可以把邮件内容解析为Message对象 msg = Parser().parsestr('\r\n'.join(mailContent)) #打印邮件内容,调用print_info函数: print_info(msg) #server.dele(len(mails))#慎重:将直接从服务器删除邮件: #关闭连接: server.quit() ''' From:dengyg200891@163.com ---------------------------------------- To:drgs156@163.com ---------------------------------------- Subject:我就是标题 ---------------------------------------- 见到我,表示邮件发送成功 '''