我正在使用python imaplib下载附件并将其保存在电子邮件中。但是,当有一封带有附件的电子邮件作为另一封电子邮件时,x.get_payload() 属于 Nonetype。我认为这些类型的邮件是使用某些电子邮件客户端发送的。由于缺少文件名,我尝试更改标题中的文件名,后跟"内容处置"。重命名的文件被打开,当我尝试使用
fp.write(part.get_payload(decode=True))
它说字符串或缓冲区预期,但找不到 Nonetype。
>>>x.get_payload()
[<email.message.Message instance at 0x7f834eefa0e0>]
>>>type(part.get_payload())
<type 'list'>
>>>type(part.get_payload(decode=True))
<type 'NoneType'>
我删除了解码=真,我得到了一个对象列表
x.get_payload()[0]
<email.message.Message instance at 0x7f834eefa0e0>
我尝试编辑文件名,以防电子邮件作为附件找到。
if part.get('Content-Disposition'):
attachment = str(part.get_filename()) #get filename
if attachment == 'None':
attachment = 'somename.mail'
attachment = self.autorename(attachment)#append (no: of occurences) to filename eg:filename(1) in case file exists
x.add_header('Content-Disposition', 'attachment', filename=attachment)
attachedmail = 1
if attachedmail == 1:
fp.write(str(x.get_payload()))
else:
fp.write(x.get_payload(decode=True)) #write contents to the opened file
并且该文件包含对象名称文件内容如下
[ < email.message.Message instance at 0x7fe5e09aa248 > ]
如何将这些附加电子邮件的内容写入文件?
0x7fe5e09aa248> ] 是 email.message.Message 实例的列表,每个实例都有 .as_string() 方法。在我的情况下,将.as_string()的内容写入文件有助于我提取整个标题数据,包括文件的嵌入式附件。然后我逐行检查文件并根据编码和文件类型保存内容。
>>>x.get_payload()
[<email.message.Message instance at 0x7f834eefa0e0>]
>>>fp=open('header','wb')
>>>fp.write(x.get_payload()[0].as_string())
>>>fp.close()
>>>file_as_list = []
>>>fp=open('header','rb')
>>>file_as_list = fp.readlines()
>>>fp.close()
然后检查文件中的每一行
for x in file_as_list:
if 'Content-Transfer-Encoding: quoted-printable' in x:
print 'qp encoded data found!'
if 'Content-Transfer-Encoding: base64' in x:
print 'base64 encoded data found!'
表示内联(嵌入式)附件的编码数据可以跳过,因为 imaplib 已经捕获了它。