Получить имя файла из вложения электронной почты в Python - PullRequest
1 голос
/ 21 июня 2011

Я захожу на сервер со своими учетными данными и ищу письмо с определенной темой.Это определенное электронное письмо имеет вложение, которое я хочу узнать по его имени и, возможно, расширению позже.

Я делаю это в Python, но каждый раз спрашиваю имя файла, он возвращает NONE, когда на самом деле есть имя файлавложение.

from imaplib import *
import base64
import email
import os
import sys
import errno
import mimetypes




server = IMAP4("SERVER LOCATION");

server.login("USER", "PASS");
server.select("Inbox");

typ, data = server.search(None, '(SUBJECT "Hello World")');

for num in data[0].split():
    typ, data = server.fetch(num, '(RFC822)');
    print (data);
    msg = email.message_from_string(str(data[0][1]));

      counter = 1
for part in msg.walk():
    print (part.as_string() + "\n")
    # multipart/* are just containers
    if part.get_content_maintype() == 'multipart':
        continue
    # Applications should really sanitize the given filename so that an
    # email message can't be used to overwrite important files
    filename = part.get_filename()


    print (filename);

    fn = msg.get_filename()

    print("The Filename was:", (fn));


    if not filename:
        ext = mimetypes.guess_extension(part.get_content_type())


                        if not ext:
            # Use a generic bag-of-bits extension
            ext = '.bin'
            filename = 'part-%03d%s' % (counter, ext)
    counter += 1


server.close()


server.logout();

Я не знаю, почему я получаю НЕТ в качестве ответа, любую помощь?

Ответы [ 4 ]

1 голос
/ 21 июня 2011

Если вы выбросили все в "part", вы действительно видите там файл?

0 голосов
/ 14 сентября 2016

Вам необходимо сначала проверить

for part in msg.walk():

    print (part.get_content_type())

, а затем в главном цикле for -

for part in msg.walk():

, просто продолжить для типов содержимого, которые присутствуют в теле письма, но отсутствуюттребуется вами.

Вы также можете поставить проверку непосредственно для требуемого content_type и затем прочитать имя файла.

ex-я столкнулся с той же проблемой, и мои типы контента были multipart и text / html и application / json

Я не ставил чек для text / html и хотел прочитать вложение, которое было в " application / json ".Я непосредственно читал имя файла и, следовательно, ошибка - имя файла не было.

Когда я ставлю чек - `

if part.get_content_maintype() == 'text/html':
    continue

if part.get('Content-Type')== 'application/json':

    filename = part.get_filename().split('.')

#do the stuff needed 

` Никакой ошибки не будет.

Надеюсь, это поможет

0 голосов
/ 27 января 2016

У меня была такая же проблема, вот что я сделал, чтобы решить ее:

if msg.get_content_maintype() == 'multipart': #multipart messages only
    # loop on the parts of the mail
    for part in msg.walk():
    #find the attachment part - so skip all the other parts
        if part.get_content_maintype() == 'multipart': continue
        if part.get_content_maintype() == 'text': continue
        if part.get('Content-Disposition') == 'inline': continue
        if part.get('Content-Disposition') is None: continue


        #save the attachment in the program directory
        print "part:", part.as_string()
        filename = part.get_filename()
        print "filename :", filename
                        filepath=DIR_SBD+filename
        fp = open(filepath, 'wb')
        fp.write(part.get_payload(decode=True))
        fp.close()
        print '%s saved!' % filepath
0 голосов
/ 08 мая 2015

Я тоже сталкивался с подобной проблемой.Просто удалите, если part.get_content_maintype () == 'multipart': продолжить условие, и оно будет работать нормально.

...