我最近一直在玩 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() 将消息上传到电子邮件帐户。我使用随机生成的二进制数据作为有效载荷。