使用 mobox Python 模块解码和访问 mbox 文件

Posted

技术标签:

【中文标题】使用 mobox Python 模块解码和访问 mbox 文件【英文标题】:Decode and access mbox file with mbox Python mdule 【发布时间】:2020-11-14 02:09:46 【问题描述】:

我需要将电子邮件数据库迁移到 CRM 并遇到 2 个问题:

我可以访问 mbox 文件,但内容未正确解码。

我想用以下列创建一个类似数据框的结构:“日期、从、到、主题、正文”

我尝试了以下方法:

for i, message in enumerate(mbox):
    print("from   :",message['from'])
    print("subject:",message['subject'])
    if message.is_multipart():
        content = (part.get_payload(decode=True) for part in message.get_payload())
    else:
        content = message.get_payload(decode=True)
    print("content:",content)
    print("**************************************")

    if i == 10:
        break

并得到以下输出:

from   : =?UTF-8?Q?Gonzalo_Gasset_Yba=C3=B1ez?= <gonzalo.gasset@baud.es>
subject: =?UTF-8?Q?Marqu=C3=A9s_de_Vargas_=26_Baud?=
content: <generator object <genexpr> at 0x7fe025f3a350>
**************************************
from   : Mailtrack Reminder <reminders@mailtrack.io>
subject: Re: Presupuesto de Logotipo y =?utf-8?Q?Dise=C3=B1o?= Corporativo
 para nuevo proyecto
content: b'<!DOCTYPE html>\r\n<html>\r\n<head>\r\n    <meta charset="utf-8">\r\n    <meta name="viewport" content="width=device-width">\r\n    <title>Reminder</title>\r\n</head>\r\n<style media="screen">\r\n    body \r\n        font-family: Helvetica;\r\n    \r\n</style>\r\n<body style="background-color: #f6f6f6; -webkit-font-smoothing: antialiased; font-size: 14px; line-height: 1.4; margin: 0; padding: 0; .....

【问题讨论】:

【参考方案1】:

mailbox.Mailbox 的具体实现接受可用于构建消息的factory 参数。通过传递使用default policy 初始化的BytesParser 的parse 方法,我们可以生成EmailMessages,它将自动解码标题和正文。

选择实际的身体比较棘手,可能取决于您的特定要求。在下面的代码示例中,任何“文本”类型的部分都被连接在一起,而非文本部分被拒绝。您可能希望应用自己的选择标准。

from email.parser import BytesParser
from email.policy import default
import mailbox

mbox = mailbox.mbox(path_to_mailbox, factory=BytesParser(policy=default).parse)

for _, message in enumerate(mbox):
    print("date:  :", message['date'])
    print("to:    :", message['to'])
    print("from   :", message['from'])
    print("subject:", message['subject'])
    if message.is_multipart():
        contents = []
        for part in message.walk():
            maintype = part.get_content_maintype()
            if maintype == 'multipart' or maintype != 'text':
                # Reject containers and non-text types
                continue
            contents.append(part.get_content())
        content = '\n\n'.join(contents)
    else:
        content = message.get_content()
    print("content:", content)
    print("**************************************")

【讨论】:

我设法读取了大部分“.mbox”文件,但在 31Gb 大小的文件上出现错误。给我以下错误: LookupError: 未知编码: 我建议暂时使用try/except 跳过此类消息。如果您可以将此类消息的字节转储到文件中,您可以提出一个新问题,包括作为证据的字节。 如果编码实际上是有效的 IANA 编码,但 Python 将其称为其他编码(有几种情况),您可能不得不以不明显的方式破解电子邮件字符集别名。 IIRC 对此有重复,或者 Python 错误跟踪器中的错误。

以上是关于使用 mobox Python 模块解码和访问 mbox 文件的主要内容,如果未能解决你的问题,请参考以下文章

mobox5的模块化方法,自动导入模块化;

Python数据对象的编码和解码,json和pickle模块,base64模块的简单使用

加密模块 hashlib | Python

Mobox企业网盘支持对象存储帮助用户推进私有云

python: json模块 --JSON编码和解码

python工具模块介绍-time 时间访问和转换