IMAP как сохранить ** все ** вложения - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь сохранить вложенные файлы Excel из папки «Входящие» в каталог.Мой код выполняется просто отлично, потому что я вижу распечатки, но вложения не сохраняются в каталоге файлов.Есть ли что-то, чего мне не хватает в моем коде, что мешает сохранению?

 import email, getpass, imaplib, os, sys


detach_dir = r'\directory link'

user = "test"
pwd = "test"
sender_email = "example@example.com"

m = imaplib.IMAP4_SSL("outlook.office365.com")
m.login(user,pwd)


m.select('"INBOX/somestuff"')

print("ok")



resp, items = m.search(None, 'FROM', '"%s"' % sender_email)
items = items[0].split()

print("ok")

for emailid in items:
    resp, data = m.fetch(emailid, "(RFC822)")
    email_body = data[0][1].decode('utf-8')
    mail = email.message_from_string(email_body)

    print("ok")

    if mail.get_content_maintype() != 'multipart':
        continue



    subject = ""

    if mail["subject"] is not None:
        subject = mail["subject"]

    print ("["+mail["From"]+"] :" + subject)

    for part in mail.walk():
        if part.get_content_maintype() == 'multipart':
            continue

        if part.get('Content-Disposition') is None:
            continue

        filename = part.get_filename()
        counter = 1

        if not filename:
            filename = 'part-%03d%s' % (counter, 'bin')
            counter += 1

        att_path = os.path.join(detach_dir, filename)

        if not os.path.isfile(att_path) :
            fp = open(att_path, 'wb')
            fp.write(part.get_payload(decode=True))
            fp.close()

Этот код сохраняет только одно вложение в подпапке, но я ищу, чтобы все вложения были сохранены в каталоге:

detach_dir = r'directory link'
m = imaplib.IMAP4_SSL("outlook.office365.com")
m.login('user','pass')
m.select('"INBOX/subfolder"')

resp, items = m.search(None, 'All')
items = items[0].split()

for emailid in items:
    resp, data = m.fetch(emailid, "(RFC822)") 
    filename = part.get_filename()
    print(filename)
    att_path = os.path.join(detach_dir, filename)
    fp = open(att_path, 'wb')
    fp.write(part.get_payload(decode=True))
    fp.close()

    print('check folder')

1 Ответ

0 голосов
/ 13 октября 2018

Вопрос : Этот код сохраняет только одно вложений ... но я хочу получить все вложения

Реализация iter-attachments ()

resp, items = imap.search(None, "(UNSEEN)")

for n, num in enumerate(items[0].split(), 1):
    resp, data = imap.fetch(num, '(RFC822)')

    data01 = data[0][1]
    msg_obj = email.message_from_string(data01)

    for part in msg_obj.iter_attachments():
        filename = part.get_filename()
        print(filename)

iter_attachments ()

Возврат итератора повсе непосредственные части сообщения, которые не являются потенциальными частями тела.Таким образом, пропустите первое вхождение каждого из текста / обычного, текстового / HTML, многокомпонентного / связанного или многочастного / альтернативного (если они явно не помечены как вложения через Content-Disposition: вложение) и верните все оставшиеся части.

Используемые модули и классы:
класс imaplib.IMAP4 класс email.message.EmailMessage

Вотпример того, как распаковать сообщение MIME, используя email.message.walk (), в каталог файлов:

...