Python 3.6 Mbox到CSV

时间:2018-06-05 22:34:19

标签: python csv email mbox

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

To,From,CC'd,BCC'd,Date,Subject,Body

我发现一个在线脚本看起来是我需要的开始,以及关于电子邮件模块的documentation,但我找不到任何有关如何

的细节
  1. 识别不同的属性选项(tofromcc'd等。)
  2. 如何将它们写为.csv中的唯一单元格值。
  3. 以下是我找到的示例代码:

    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']])
    

1 个答案:

答案 0 :(得分:1)

为此,您首先需要确定所有邮箱项目中可能存在的密钥的完整列表。然后,您可以使用它来编写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:
    # First determine the complete list of possible keys
    fieldnames = {'Part{:02}'.format(part) 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='')
    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['Part{:02}'.format(part)] = payload

        csv_output.writerow(items)

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

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