python poplib.POP3接受邮件详解

文章目录

  • 准备工作
  • 查看邮箱信息
  • 获得某封邮件
  • 解读邮件内容

准备工作

# 一些参数,从文件读取更加灵活
from_email = "[email protected]"
from_email_pwd = "xxx"
pop_server = "pop.126.com"
# 连接服务器
server = poplib.POP3(pop_server)
server.set_debuglevel(1)
print(server.getwelcome().decode("utf-8"))
# 登录
server.user(from_email)
server.pass_(from_email_pwd)

## 一些操作可以添加在这

# 退出
server.quit() # 别忘记退出

出现如下信息即成功连接上了126邮箱
python poplib.POP3接受邮件详解_第1张图片

查看邮箱信息

这两行添加到退出之前即可

# 查看邮箱内的邮件情况
print("Messages: %s Size: %s" % (server.stat())) # 请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数
print(server.list())    # 返回邮件数量和每个邮件的大小

stat得到的结果是指总共23封邮件,一共134881octets。
list的结果复杂一点,第一个是总的信息,第二个是每个邮件有的信息
在这里插入图片描述

获得某封邮件

# 获得某一封邮件的内容
resp, mails, octets = server.list() # 返回邮件数量和每个邮件的大小
index = len(mails)  # 获得最后一封的索引
resp, lines, octets = server.retr(index)    # 返回由参数标识的邮件的全部文本
print(lines)

能够成功获取到信息,但打印出来的信息无法直接理解,还需要接着做一些处理。
在这里插入图片描述

解读邮件内容

# 解读处理
msg_content = b"\r\n".join(lines).decode("utf-8") # byte字符串
msg = Parser().parsestr(msg_content)    # 解析为普通字符串
print_msg(msg)

其中用到了一个自定义解读消息的方法,代码如下。

def print_msg(msg, indent=0):
    if indent == 0:
        for header in ["From", "To", "Subject", "Date"]:
            value = msg[header]
            if value:
                value = decode_str(value)
            print("%s%s: %s" % (" " * indent, header, value))
    if msg.is_multipart():
        parts = msg.get_payload()
        for n, part in enumerate(parts):
            print("%spart %s" % (" " * indent, n))
            print_msg(part, indent + 1)
    else:
        content_type = msg.get_content_type()
        if content_type == "text/plain" or content_type == "text/html":
            content = msg.get_payload(decode=True)
            charset = get_charset(msg)
            if charset:
                content = content.decode(charset)
            print("%sText: %s" % (" " * indent, content))
        else:
            print("%sAttachment: %s" % (" " * indent, content_type))

它还依赖另外两个方法,一个获得编码,一个解析编码。

def decode_str(s):
    l = decode_header(s)
    value, charset = l[0]
    if charset:
        value = value.decode(charset)

    if len(l) == 2:
        value_tmp = l[1][0]
        value = value + value_tmp.decode(charset)
    return value


def get_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

最终就能打印出邮件的信息
python poplib.POP3接受邮件详解_第2张图片

你可能感兴趣的:(python poplib.POP3接受邮件详解)