2013-06-27 1 views
1

Как получить список файлов из архива (rar или zip), прикрепленных к E-mail, используя Python? То есть, у меня есть EML-файл. Мне не нужно разархивировать файлы, чтобы получить список. Теоретически возможная опция при прикреплении очень большого файла и обработки извлеченных вложений может занять много времени и ресурсов.Как получить список файлов из архива (rar или zip), прикрепленный к E-mail с помощью Python?

+0

С помощью инструментов stdlib нет выбора, кроме [разбора всего MIME-конверта] (http://docs.python.org/2/library/email.parser.html#parser-class-api), [extract вложение] (http://docs.python.org/2/library/email.message.html#email.message.Message.get_payload), [открыть его как почтовый] (http://docs.python.org /2/library/zipfile.html#zipfile.ZipFile) и [прочитать каталог] (http://docs.python.org/2/library/zipfile.html#zipfile.ZipFile.infolist). Конечно, вам не нужно будет читать фактические записи в почтовом индексе. Вы пробовали это и обнаружили, что это слишком медленно, или вас просто беспокоит «теоретически возможно»? – abarnert

ответ

1

Вот как сделать это с STDLIB, получая первое вложение в простом из нескольких частей сообщения, хранящееся в message.eml:

import email.parser 
import StringIO 
import zipfile 

with open('message.eml') as f: 
    msg = email.parser.Parser().parse(f) 
attachment = msg.get_payload(1) 
zipf = StringIO.StringIO(attachment.get_payload()) 
zip = zipfile.ZipFile(zipf) 
filenames = zip.namelist() 

Это будет проанализировать весь конверт MIME, декодировать все вложение и прочитать каталог ZIP этого вложения ... но по крайней мере он не будет распаковывать какие-либо файлы в ZIP-архиве, поэтому я подозреваю, что на самом деле у вас не будет проблемы с производительностью беспокоюсь о.

0

This answer рассказывает вам, как получить файл-объект (для архива zip используйте ZipFile constructor, чтобы открыть файл, а не обычную функцию open()). Затем вы можете использовать zipfile.namelist(), чтобы получить имена членов архива