Python 3.6 Mbox 转 CSV

dnl*_*lde 3 python csv email mbox

我正在尝试编写一个脚本,将.mbox文件的每个电子邮件元素转换为.csv文件。我特别需要以下元素,但如果有一种方法“为每个元素编写”,那就更好了:

收件人、发件人、抄送、密件抄送、日期、主题、正文

我在网上找到了一个脚本,它看起来是我需要的内容的开始,以及有关电子邮件模块的文档,但我找不到任何有关如何

  1. 识别不同的属性选项(tofromcc'd 等)
  2. 如何将它们写为.csv.

这是我找到的示例代码:

import mailbox
import csv

writer = csv.writer(open("clean_mail_B.csv", "wb"))
for message in mailbox.mbox('Saks.mbox'):
    writer.writerow([message['to'], message['from'], message['date']])
Run Code Online (Sandbox Code Playgroud)

Mar*_*ans 6

为此,您首先需要确定所有邮箱项目中存在的可能密钥的完整列表。然后您可以使用它来写入 CSV 标头。

接下来,您需要使用 从每条消息中获取所有键值对.items()。然后可以将其转换回字典并写入 CSV 文件。

不幸的是,该mailbox库没有直接公开消息字典,否则可以直接编写它。

import mailbox
import csv

mbox_file = 'sample.mbox'

with open('clean_mail_B.csv', 'w', newline='', encoding='utf-8') as f_output:
    # Create a column for the first 30 message payload sections
    fieldnames = {f'Part{part:02}' for part in range(1, 31)}

    for message in mailbox.mbox(mbox_file):
        fieldnames.update(message.keys())

    csv_output = csv.DictWriter(f_output, fieldnames=sorted(fieldnames), restval='', extrasaction='ignore')
    csv_output.writeheader()

    for message in mailbox.mbox(mbox_file):
        items = dict(message.items())

        for part, payload in enumerate(message.get_payload(), start=1):
            items[f'Part{part:02}'] = payload

        csv_output.writerow(items)
Run Code Online (Sandbox Code Playgroud)

DictWriter使用A而不是标准 CSV 编写器。当某些消息不包含所有可能的标头值时,这将更好地应对。

消息有效负载可以分为多个部分,这些部分作为单独的列标题添加,例如Part01Part02。通常应该有 1 或 2 个,但您的示例 mbox 中包含一个带有奇怪签名的 25?

如果mbox包含更多消息有效负载条目(即 >30),则使用 忽略这些条目extrasaction='ignore'。另一种方法是将所有有效负载合并到一个列中。