python - 使用电子邮件模块(PYTHON)解析来自 poplib 的电子邮件内容

标签 python email python-3.x pop3

Python 版本 == 3.5

代码:

import getpass, poplib, email
Mailbox = poplib.POP3_SSL('pop.googlemail.com', '995')
Mailbox.user("email_here@gmail.com")
Mailbox.pass_('password_here')
numMessages = len(Mailbox.list()[1])
for i in range(numMessages):
    info  = b" ".join(Mailbox.retr(i+1)[1])
    msg = email.message_from_bytes(info)
    print(msg.keys())

输出:

['MIME-Version']
['MIME-Version']
['MIME-Version']
['Delivered-To']
['Delivered-To']
['Delivered-To']
['Delivered-To']
['Delivered-To']
['Delivered-To']
['Delivered-To']
['Delivered-To']

输出不正确,因为应该有更多字段 msg 除了 “MIME-Version”“Delivered-To” 我认为

email.message_from_bytes() 解析字节字符串的内容

msg 不是字节字符串吗?

docs推荐这个:

M = poplib.POP3('localhost')
M.user(getpass.getuser())
M.pass_(getpass.getpass())
numMessages = len(M.list()[1])
for i in range(numMessages):
    for j in M.retr(i+1)[1]:
        print(j)

有没有办法使用电子邮件模块解析返回的消息? 这样我们就可以存储电子邮件详细信息。如发件人、正文、 header 等。

最佳答案

事实证明答案相当简单

import getpass, poplib, email
Mailbox = poplib.POP3_SSL('pop.googlemail.com', '995')
Mailbox.user("email_here@gmail.com")
Mailbox.pass_('password_here')
numMessages = len(Mailbox.list()[1])
for i in range(numMessages):
    raw_email  = b"\n".join(Mailbox.retr(i+1)[1])
    parsed_email = email.message_from_bytes(raw_email)
    print(parsed_email.keys())

不必用空格连接 raw_email,只需用 \n 连接即可,email 模块可以正确解析字段:

使用电子邮件模块也是一件很棒的事情 当您调用 email.message_from_bytes() 时,返回的输出是 一个字典

因此您可以像这样访问字段:

raw_email  = b"\n".join(Mailbox.retr(i+1)[1])
parsed_email = email.message_from_bytes(raw_email)
print(parsed_email["header"])

但是如果该字段不存在怎么办?:

raw_email  = b"\n".join(Mailbox.retr(i+1)[1])
parsed_email = email.message_from_bytes(raw_email)
print(parsed_email["non-existent field"])

上面的代码将返回 None 并且不会抛出 KeyError

关于python - 使用电子邮件模块(PYTHON)解析来自 poplib 的电子邮件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35679338/

相关文章:

python-3.x - 使用 Python 从 Autodesk Inventor 中提取参数

python - 将文本文件中的 0 和 1 转换为二维数组

Python命令行加载栏

python - 在python中生成除特定数字之外的范围内的随机不重复数字

android - 在 Webview 中自动检测电话号码、电子邮件和 URL 链接 - Android sdk

node.js - 在 sailsjs 中实现 smtp,用于屏蔽电子邮件

python - ctypes中的循环结构,python

PHP 检测并存储返回的电子邮件

python-3.x - 为什么numba cuda调用几次后运行速度变慢?

Python 脚本在 IDLE 中工作但不能作为 .desktop 图标