@Roqvie

Как выгрузить файлы с вложений почты?

Код:
from imap_tools import MailBox
import email

mailbox = MailBox(host = 'imap.yandex.com', port = '993', ssl=True)
mailbox.login('TEST@yandex.ru', 'PASSWORD')

for message in mailbox.fetch():
    print(message.from_values['full'])
    mail = message.obj
    if mail.is_multipart():
        for part in mail.walk():
            content_type = part.get_content_type()
            filename = part.get_filename()
            if filename:
                with open(part.get_filename(), 'wb') as new_file:
                    new_file.write(part.get_payload(decode = True))


Сейчас программа может скачивать только изображения
Хотелось бы что бы она могла скачивать еще и docx, pdf

Но на них пока что выдает ошибку:

Traceback (most recent call last):
File "C:\Users\Admin\Desktop\yandexmailapi-master\mai-bot\index.py", line 18, in
with open(part.get_filename(), 'wb') as new_file:
OSError: [Errno 22] Invalid argument: '=?UTF-8?B?0LTQvtC60LvQsNC00JjRgdGC0L7RgNC40Y8=?=\r\n\t=?UTF-8?B?LmRvY3g=?='
  • Вопрос задан
  • 908 просмотров
Решения вопроса 1
Lamroy95
@Lamroy95
Всё-таки пришлось зарегаться))

Я сделал это так:
h=email.header.make_header(email.header.decode_header(filename))
with open(str(h), 'wb') as new_file:
				new_file.write(part.get_payload(decode=True))

pdf загружается нормально, но в doc (не docx) кракозябра. Если найдёшь как решить, то ответь здесь.

upd: docx тоже скачивается и открывается нормально
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
dimonchik2013
@dimonchik2013
non progredi est regredi
получилось исправить? понятно что ошибка в fs а не в почте?
Ответ написан
Комментировать
@uasha
for part in msg.walk():
                content_type = part.get_content_type()
                filename = part.get_filename()
                if filename:
                    # Нам плохого не надо, в письме может быть всякое барахло
                    with open(part.get_filename(), 'w') as new_file:
                        f.write(str(part.get_payload(decode=True), encoding='utf-8'))
            f.close
<b></b>
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы