前面我们讲到的接收邮件中,接收到的邮件把它打印出来,会发现是一堆很复杂的东西,很难阅读。这就需要我们去解析它

这里以pop3作为接收邮件的协议,并对邮件进行解析。

import poplib
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr

user = 'xxx@xx.xx'
password = 'xxxxx'
pop_server = poplib.POP3_SSL('pop.xxx.xxx', 995)
print(pop_server.getwelcome().decode('utf-8'))
pop_server.user(user)
pop_server.pass_(password)
print('Server stat', pop_server.stat())
#获取所有邮件列表
resp, mails, octets = pop_server.list()
print(mails)
#获取最新的一封邮件(序号最大的)。邮件索引从1开始计数
index= len(mails)
resp, lines, octets = pop_server.retr(index)
msg_content = b'\r\n'.join(lines).decode('utf-8')
#解析出邮件
msg = Parser().parsestr(msg_content)
pop_server.quit()


def decode_email(s):
    if not s:
        return ''
    value, charset = decode_header(s)[0]
    if charset:
        value = value.decode(charset)
        return value

#打印邮件的发件人、收件人和主题
mail_from = msg.get('From', "")
hdr, mail_from_addr = parseaddr(mail_from)
mail_from_name = decode_email(hdr)
print('发件人', mail_from_name, mail_from_addr)

mail_to = msg.get('To', "")
hdr, mail_to_addr = parseaddr(mail_to)
mail_to_name = decode_email(hdr)
print('收件人', mail_to_name, mail_to_addr)

subject = decode_email(msg.get('Subject', ''))
print('主题:', subject)

#递归解析邮件
def decode_mime(msg):
    if msg.is_multipart():
        parts = msg.get_payload()
        for part in parts:
            print(decode_mime(part))
    else:
        content_type = msg.get_content_type()
        if content_type in ('text/plain', 'text/html'):
            content = msg.get_payload(decode=True)
            print(content.decode('utf-8'))
        else:
            print('Attachment', content_type)

decode_mime(msg)

你也可能喜欢

发表评论