python 3.5.4 正确 解析邮箱里邮件 示例
在学习Python的过程中,解析邮箱里邮件是绕不开的一个话题,
如下代码,能正确解析邮箱里的第一封邮件
收邮件分为两个步骤:
第一步:用poplib把邮件的原始文本下载到本地;
第二步:用email解析原始文本,还原成之前我的博客介绍的写邮件各个部分的内容(发件人、收件人、标题、附件、正文等)
#############################正文##################
#!usr/bin/python3
#-*-coding=UTF-8-*-
import poplib
from email.parser import Parser #这个库用以解析邮件中每一行的内容
from email.header import decode_header #解析标题栏
from email.utils import parseaddr
#解析标题栏的文本解码
def decode_str(s):
value,charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
#解析邮件内容中的文字的解码
def guess_charset(msg):
charset = msg.get_charset()
if charset is None:
content_type = msg.get('Content-Type','').lower()
pos = content_type.find('charset=')
if pos >= 0:
charset = content_type[pos+8:].strip()
return charset
#在命令行中输出邮箱里面的内容
def print_my_email_info(msg,indent = 0):
if indent == 0:
for header in['From','To','Subject']:
value = msg.get(header,'')
if value:
if header == 'Subject':
value = decode_str(value)
else:
hdr,addr = parseaddr(value)
name = decode_str(hdr)
value = u'%s<%s>'%(name,addr)
print('%s%s:%s'%(' '*indent,header,value))
if(msg.is_multipart()):
parts = msg.get_payload()
for n,part in enumerate(parts):
print('%s part %s'%(' '*indent,n))
print('%s----------------'%(' '*indent))
print_my_email_info(part,indent+1)
else:
content_type = msg.get_content_type()
if content_type == 'text/plain' or \
content_type == 'text/html' :
content = msg.get_payload(decode = True)
charset = guess_charset(msg)
if charset:
content = content.decode(charset)
print('%s Text:%s'%(' '*indent,content+'...'))
else:
print('%s Attachment:%s'%(' '*indent,content_type))
#输入邮件地址、口令和POP3服务器地址
email = 'xxx1@163.com' #输入你要解析的邮箱地址'#input('Email:')
pwd = 'duan00'# 获取的email邮箱地址的SMTP/POP3的授权码,而不是邮箱密码 #input('pwd:')
pop3_server = 'pop.163.com' #对应的邮箱的pop地址,我这用的是163邮箱的 #input('pop3server:')
#链接到POP3服务器
server = poplib.POP3(pop3_server)
#打开or关闭调试信息
server.set_debuglevel(1)
#可选:输出POP3服务器的欢迎文字
print(server.getwelcome().decode('utf-8'))
#身份认证
server.user(email)
server.pass_(pwd)
#start返回邮件数量和占用空间
#print('Message: .size: ',server.start())
print('Messages: %s. Size: %s'%server.stat())
#list返回所有邮件的编号
resp,mails,octets = server.list()
#查看返回的列表
print(mails)
#获取最新的一封邮件
index = len(mails)
resp,lines,octets = server.retr(index)
#lines 存储了邮件原始文本的每一行
#可以获取原始邮件的所有文本
msg_content = b'\r\n'.join(lines).decode('utf-8')
#稍后解析邮件
msg = Parser().parsestr(msg_content)
#展示解析的第一封邮件内容
print_my_email_info(msg)
#可以根据邮件索引号 直接从服务器删除邮件
#server.dele(index)
#关闭连接
server.quit()
#############################结束##################