码迷,mamicode.com
首页 > 编程语言 > 详细

python之poplib模块下载并解析邮件

时间:2015-11-07 16:05:03      阅读:508      评论:0      收藏:0      [点我收藏+]

标签:

# -*- 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:我就是标题
----------------------------------------
见到我,表示邮件发送成功
‘‘‘

 

python之poplib模块下载并解析邮件

标签:

原文地址:http://www.cnblogs.com/dengyg200891/p/4945334.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!