python 3.5.4 正确 解析邮箱里邮件 示例

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()

	
#############################结束##################




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值