Python学习:用POP3接受邮件
2016-03-24 14:13
656 查看
下面的例子用163邮箱进行测试,因为qq邮箱好像要SSL加密?登陆起来麻烦一些。
pop3接受邮件有两个步骤,首先用poplib模块把原始的文件从邮箱下载到本地.然后对邮件文本进行解析。
[0]:
# 输入邮件地址, 口令和POP3服务器地址: email = input('Email: ') password = input('Password: ') pop3_server = input('POP3 server: ') # 连接到POP3服务器: server = poplib.POP3(pop3_server) # 可以打开或关闭调试信息: server.set_debuglevel(1) # 可选:打印POP3服务器的欢迎文字: print(server.getwelcome().decode('utf-8')) # 身份认证: server.user(email) server.pass_(password) #stat()返回邮件数量和占用空间: print('Messages: %s. Size: %s' % server.stat()) # list()返回所有邮件的编号: resp, mails, octets = server.list() # 可以查看返回的列表类似[b'1 82923', b'2 2184', ...] print(mails) # 获取最新一封邮件, 注意索引号从1开始: 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) # 可以根据邮件索引号直接从服务器删除邮件: # server.dele(index) # 关闭连接: server.quit()
[1]:对原始邮件文本进行解析:
from email.parser import Parser from email.header import decode_header from email.utils import parseaddr import poplib # indent用于缩进显示: def print_info(msg, indent=0): if indent == 0: for header in ['From', 'To', 'Subject']: value = msg.get(header, '')#get方法,如果header存在,就获取相应的值,否则返回'' if value: if header=='Subject': value = decode_str(value) else:#From or To 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('%spart %s' % (' ' * indent, n)) print('%s--------------------' % (' ' * indent)) print_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('%sText: %s' % (' ' * indent, content + '...')) else: print('%sAttachment: %s' % (' ' * indent, content_type)) def decode_str(s): value, charset = decode_header(s)[0]#对s进行解码,如果s没有经过编码,那么charset返回None if charset:#如果经过编码,就返回相应编码后的bytes value = value.decode(charset)#对bytes进行decode return value def guess_charset(msg):#获得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
相关文章推荐
- Python Write array values into file
- Python爬虫
- think python学习心得-(4)有返回函数
- Python 字符串操作
- Python 远程批量修改密码脚本
- python初心
- python基础--列表
- python的requests初步使用
- Python—进程、线程、协程
- 解决python问题:IndentationError :1. notepad++ 显示行号 2.tab自动转化为空格符
- Selenium + Python 搭建自动化测试环境(二)
- 多线程与双端队列结合使用,实现持久化任务(3)
- python打开一个本地目录文件路径
- python with as
- python的lambda表达式
- OMS开发(一):预览
- 多版本Python共存,以及pip对应
- ansible使用注意事项
- 安装完ActivePython后Python的Idle窗口打不开也卸载不掉的解决方法
- Python编码解码问题——常见错误