我最近一直在玩Python的imaplib和电子邮件模块。我尝试使用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])
我已经分别对代码的每个部分进行了计时。 mailacct.search和mailacct.fetch在大约30-40秒内完成16 MB的电子邮件。 email.message_from_string(resp [1])的行大约需要280-300秒。
我是一个蟒蛇菜鸟。我在上面的代码中做了一些非常低效的事情吗?或者问题在于email.message_from_string()方法,也许是效率低下的实现?或者可能是电子邮件正文从未打算包含大量数据,因此表现不佳?
*编辑* : 附加信息:我使用imaplib.IMAP4_SSL创建IMAP连接。我首先使用imaplib.append()将消息上传到电子邮件帐户。我使用随机生成的二进制数据作为有效载荷。
答案 0 :(得分:1)
好的,我通过检查电子邮件模块的源代码自行完成了一些工作。 email / parser.py中的解析函数(parse())是在调用email.message_from_string()时实际处理电子邮件的函数。它似乎以8192字节的块来解析字符串,这就是为什么大数据需要这么长时间的原因。我更改了代码,以便它立即读取和处理整个字符串,并且处理大型电子邮件消息所花费的时间有了很大的改进。
我假设它最初设置为处理8192块中的字符串来处理非常大的字符串?有没有更好的方法来实现这一点,而不是更改电子邮件模块源代码?