我得到了一个电子邮件的多部分消息对象,我想把该邮件中的附件转换成python文件对象。这可能吗?如果可以,我应该在Python中寻找什么方法或类来完成这样的任务?
获取邮件附件到Python文件对象
我不太明白你说的 "电子邮件多部分信息对象 "是什么意思。你是指属于
email.message.Message
类?
如果这是你的意思,那就很简单了。在一个多部分信息中,
get_payload
方法返回一个信息部分的列表(每个部分本身就是一个
Message
对象)。你可以遍历这些部分并检查它们的属性:例如,
get_content_type
方法返回部分的MIME类型,而
get_filename
方法返回部分的文件名(如果消息中指定了任何文件名)。然后,当你找到正确的消息部分时,你可以调用
get_payload(decode=True)
来获得解码后的内容。
>>> import email
>>> msg = email.message_from_file(open('message.txt'))
>>> len(msg.get_payload())
>>> attachment = msg.get_payload()[1]
>>> attachment.get_content_type()
'image/png'
>>> open('attachment.png', 'wb').write(attachment.get_payload(decode=True))
如果你以编程方式从你收到的电子邮件中提取附件,你可能想对病毒和木马采取预防措施。特别是,你可能只应该提取那些你知道是安全的MIME类型的附件,而且你可能想选择自己的文件名,或者至少对get_filename
的输出进行消毒。
jrial
:
HTML邮件的页脚经常有图片,这些图片也会作为附件发送。你可以通过查看Content-Disposition来区分这些图片和 "真正的 "附件:内联图片以 "inline "开始,而真正的附件以 "attachment "开始。没有获取内容处置的方法,但如果你只对实际附件感兴趣,你可以调用part.get('Content-Disposition').startswith('attachment')。
pma_
发布于
2019-01-19
0
人赞同
这里是工作解决方案,信息是由IMAP服务器提供的
self.imap.select()
typ, data = self.imap.uid('SEARCH', 'ALL')
msgs = data[0].split()
print "Found {0} msgs".format(len(msgs))
for uid in msgs:
typ, s = self.imap.uid('FETCH', uid, '(RFC822)')
mail = email.message_from_string(s[0][1])
print "From: {0}, Subject: {1}, Date: {2}\n".format(mail["From"], mail["Subject"], mail["Date"])
if mail.is_multipart():
print 'multipart'
for part in mail.walk():
ctype = part.get_content_type()
if ctype in ['image/jpeg', 'image/png']:
open(part.get_filename(), 'wb').write(part.get_payload(decode=True))
Jakub Pastuszuk
发布于
2019-01-19
0
人赞同
实际上使用现在建议的
email.EmailMessage API
(don't confuse with old
电子邮件.消息API
)它是相当容易的。
遍历所有邮件元素,只选择附件
只对附件进行迭代
让我们假设你把你的信息作为字节内容存储在信封变量中
Solution no.1:
import email
from email.message import EmailMessage
email_message: EmailMessage = email.message_from_bytes(envelope, _class=EmailMessage)
for email_message_part in email_message.walk():
if email_message.is_attachment():
# Do something with your attachment
Solution no.2:(最好是这样,因为你不必走过你的消息对象的其他部分)。
import email
from email.message import EmailMessage
email_message: EmailMessage = email.message_from_bytes(envelope, _class=EmailMessage)
for email_message_attachment in email_message.iter_attachments():
# Do something with your attachment
Couple things to note: