0

我最近一直在玩 Python 的 imaplib 和 email 模块。我尝试使用 imaplib/email 模块发送和接收大型电子邮件(大部分数据在电子邮件正文中,而不是附件中)。

但是,当我从电子邮件服务器下载大型电子邮件(大小大于 8MB 左右)并使用“email.message_from_string()”方法对其进行格式化时,我注意到了一个问题。该方法所花费的时间似乎很长(对于 16 MB 的电子邮件,平均大约需要 300-310 秒)。注意:发送这么大的电子邮件不需要太多时间,大约 40 秒左右。同样,所有数据都在电子邮件的正文中,而不是在附件中。如果我下载同一封电子邮件并将所有数据作为附件,则整个操作将在 30-40 秒内完成。这就是我正在做的事情:

buf = []
t, d = mailacct.search(None, 'SUBJECT', subj)
for num in d:
    t, msg = mailacct.fetch(num, '(RFC822)')

    for resp in msg:
        if isinstance(resp, tuple):
            buf.append(email.message_from_string(resp[1])

我已经分别为代码的每个部分计时。对于 16 MB 的电子邮件,mailacct.search 和 mailacct.fetch 都在大约 30-40 秒内完成。email.message_from_string(resp[1]) 的行大约需要 280-300 秒。

我是蟒蛇菜鸟。那么我在上面的代码中做了什么效率低下的事情吗?还是问题出在 email.message_from_string() 方法上,也许是一个低效的实现?或者可能是电子邮件正文从不包含大量数据,因此性能不佳?

* 编辑 * : 附加信息:我使用 imaplib.IMAP4_SSL 创建 IMAP 连接。我首先使用 imaplib.append() 将消息上传到电子邮件帐户。我使用随机生成的二进制数据作为有效载荷。

4

1 回答 1

1

好的,我通过检查电子邮件模块的源代码自己进行了一些挖掘。email/parser.py 中的解析函数 (parse()) 是调用 email.message_from_string() 时实际处理电子邮件的函数。它似乎解析了 8192 字节块中的字符串,这就是为什么需要这么长时间来处理大数据。我更改了代码,使其一次读取和处理整个字符串,处理大型电子邮件所需的时间有了巨大的改进。

我假设它最初设置为处理 8192 块中的字符串以处理非常大的字符串?有没有比更改电子邮件模块源代码更好的方法来做到这一点?

于 2010-08-23T04:32:57.473 回答