我最近一直在玩Python的Imaplib和电子邮件模块。我尝试使用iMaplib/电子邮件模块发送和接收大型电子邮件(带有电子邮件正文而不是附件的大多数数据)。

但是,当我从电子邮件服务器下载大型电子邮件(大于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])

我分别对代码的每个部分进行计时。 MailAcct.Search和MailAcct.fetch两者在大约30-40秒内完成16 MB的电子邮件。 email.message_from_string(resp [1])的行约为280-300秒。

我是Python Noob。因此,我在上述代码中确实做一些效率低下的事情吗?还是问题在于email.message_from_string()方法,也许是一种效率低下的实现?或者,电子邮件机构从来没有打算包含大量数据,因此性能不佳?

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

有帮助吗?

解决方案

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

我假设它最初是设置为8192块中的字符串来处理真正大的字符串吗?有没有更好的方法来执行此操作,而不是更改电子邮件模块源代码?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top