python中使用poplib模块接收邮件
2019-01-04 本文已影响2人
bianruifeng
#!/usr/bin/env python3
# -*- encoding=utf-8 -*-
import sys
import locale
import poplib
from email.parser import Parser
import email
from email.header import decode_header
from email.utils import parseaddr
import string
#输出当前环境默认的编码方式
__g_codeset = sys.getdefaultencoding()
print __g_codeset
#设置系统的编码方式
reload(sys)
sys.setdefaultencoding( "utf-8" )
#确定运行环境的encoding
__g_codeset = sys.getdefaultencoding()
print __g_codeset
# 服务器及用户信息
host = 'pop.qq.com'
username = '**73***@qq.com'
password = 'dds****o****b**f'
conn = poplib.POP3_SSL(host)
# 设置调试模式,可以看到与服务器的交互信息
# #### debug sentence #####
conn.set_debuglevel(1)
# 打印欢迎信息
print(conn.getwelcome())
# 身份认证
conn.user(username)
conn.pass_(password)
print '********'
#获取服务器上信件信息,返回一个列表,第一项是一共有多少封邮件,第二项是共有多少字节
mail_total,total_size = conn.stat()
print('message: %s.Size:%s'%(mail_total,total_size))
resp, mails, octets = conn.list()
print resp, mails, octets
mail = conn.retr(len(mails))[1]
print 'lines:',len(mail)
msg = Parser().parsestr('\r\n'.join(mail))
print msg
#编码处理
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 %s'%(header,value,name)
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 '不是文本'
print_info(msg,0)
#退出
conn.quit()