python3接收、解析邮件

import poplib
from email.parser import Parser

def get_email(email,password,host="mail.163.com"):
    # connect to pop3 server
    server = poplib.POP3(host)
    # open debug
    server.set_debuglevel(1)

    # 身份验证
    server.user(email)
    server.pass_(password)
    
    # 返回邮件总数目和占用服务器的空间大小(字节数), 通过stat()方法即可
    # print("Mail counts: {0}, Storage Size: {0}".format(server.stat()))

    # 使用list()返回所有邮件的编号,默认为字节类型的串
    resp, mails, octets = server.list()
    # print("响应信息: ", resp)
    # print("所有邮件简要信息: ", mails)
    # print("list方法返回数据大小(字节): ", octets)

    # get the latest, index from 1:
    index = len(mails)
    if index < 1:
        return None
    resp, lines, octets = server.retr(index)

    # 可以获得整个邮件的原始文本:
    msg_content = b'\r\n'.join(lines).decode('utf-8')
    # 解析出邮件:
    msg = Parser().parsestr(msg_content)
    # print(msg)
    # print("解码后的邮件信息:\r\n"+str(msg))

    #close
    server.close()
    return msg

def delete_email(email,password,host="mail.163.com"):
    # connect to pop3 server
    server = poplib.POP3(host)
    # open debug
    # server.set_debuglevel(1)

    # 身份验证
    server.user(email)
    server.pass_(password)

    # 使用list()返回所有邮件的编号,默认为字节类型的串
    # list()返回tuple
    resp, mails, octets = server.list()
    # print("响应信息: ", resp)
    # print("所有邮件简要信息: ", mails)
    # print("list方法返回数据大小(字节): ", octets)

    # get the latest, index from 1:
    index = len(mails)

    # 删除所有邮件
    while index > 0:
        server.dele(index)
        print(index)
        index = index -1 
    
    # commit command and close
    server.quit()

邮件解析


# 解析邮件正文
def get_mail_content(msg):
    if msg == None:
        return None
    for part in msg.walk():
        if not part.is_multipart():
            data = part.get_payload(decode=True)
            # print("emailcontent:\r\n"+data.decode())
    return data.decode()

poplib关键函数解析

  • POP3.dele(which)

    标记消息号 which 以进行删除。在大多数服务器上,删除直到QUIT才被实际执行(主要例外是Eudora QPOP,它通过在任何断开连接上进行未决删除而故意违反RFC)。

  • POP3.quit()

    注销:提交更改,解锁邮箱,删除连接。

email.message关键函数解析

  • walk()

    walk() 方法是一种通用的生成器,可用于以深度优先遍历顺序遍历消息对象树的所有部分和子部分。您通常会在 for 循环中使用 walk() 作为迭代器;每次迭代返回下一个子部分。

  • is_multipart()

    is_multipart()
    如果消息的有效内容是一个子EmailMessage 对象的列表,则返回 True,否则返回 False。当 is_multipart() 返回 False 时,有效负载应为字符串对象(可能是CTE编码的二进制有效负载)。注意,is_multipart() 返回 True 并不一定意味着“msg.get_content_maintype() == ‘multipart’”将返回 True。例如,当 EmailMessage 类型为 message/rfc822 时,is_multipart 将返回 True。

  • get_content_type()

    get_content_type()返回消息的内容类型,强制为表格 maintype/subtype 的小写。如果消息中没有 Content-Type 头,则返回 get_default_type() 返回的值。如果 Content-Type 头无效,则返回 text/plain。
    (根据 RFC 2045,消息总是有一个默认类型,get_content_type() 将总是返回一个值。RFC 2045 定义一个消息的默认类型为 text/plain,除非它出现在一个 multipart/digest 容器中,在这种情况下,它将是 message/rfc822 如果 Content-Type 头有一个无效的类型规范,RFC 2045 强制默认类型为 text/plain。)

email.message API文档

作者:AmyZYX 
出处:http://www.cnblogs.com/amyzhu/ 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2019-03-30 11:23  乖乖楠  阅读(1456)  评论(0编辑  收藏  举报