python POP读取邮箱内容

import poplib
import re
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

#获取邮件的字符编码,首先在message中寻找编码,如果没有,就在header的Content-Type中寻找
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

#解析邮件的函数,首先打印收件人、发件人、标题
#然后调用message的walk循环处理邮件中的每一个子对象(包括文本、html、附件一次或多次)
#邮件头属性中的filename存在则该子对象是附件,对附件名称进行编码并将附件下载到指定目录
#由于网络上传输的邮件都是编码以后的格式,需要在get_payload的时候指定decode=True来转换成可输出的编码
#如果邮件是text或者html格式,打印格式并输出转码以后的子对象内容
def print_info(msg):

    for part in msg.walk():
        filename = part.get_filename()
        content_type = part.get_content_type()
        charset = guess_charset(part)
        if filename:
            print('有附件内容')
        else:
            # email_content_type = ''
            # content = ''
            # if content_type == 'text/plain':
            #     email_content_type = 'text'
            # elif content_type == 'text/html':
            #     email_content_type = 'html'
            if charset:
                # content = part.get_payload().decode(charset)
                content = part.get_payload(decode=True).decode(charset)
                verify_code = re.findall(r'您本次导出的验证码为:([d]+)', content)
                print(verify_code)
                return verify_code



def get_sender(msg):
    """
    获取发件人
    :param msg:
    :return:
    """
    # 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(addr)
    #             value = name + ' < ' + addr + ' > '
    #     print(header + ':' + value)
    value = msg.get('From', '')
    hdr, addr = parseaddr(value)
    name = decode_str(addr)
    return name


def run():
    popserver = 'imap.yeah.net'
    emailuser = 邮箱号
    emailpasswd = 授权码
    conn = poplib.POP3_SSL(popserver)
    conn.user(emailuser)
    conn.pass_(emailpasswd)
    resp, mails, octets = conn.list()
    print(mails)
    index = len(mails)
    print(index)
    #取出某一个邮件的全部信息 postgre
    for i in range(index):
        resp, lines, octets = conn.retr(index)
        #邮件取出的信息是bytes,转换成Parser支持的str
        lists = []
        for e in lines:
            lists.append(e.decode())
        msg_content = '
'.join(lists)
        msg = Parser().parsestr(msg_content)
        name = get_sender(msg)
        if name == 'xiaoshuxiong@mama.cn':
            print(type(msg))
            verify_code = print_info(msg)
            if verify_code:
                print(verify_code)
                return verify_code[0]
            else:
                print("获取验证码失败")
            break
        else:
            continue
    #提交操作信息并退出
    conn.quit()


print(run())
原文地址:https://www.cnblogs.com/itBlogToYpl/p/15271465.html