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


# -*- 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


    #编码处理


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


原文链接:https://www.cnblogs.com/dengyg200891/p/4945334.html