Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/34: Рейтинг темы: голосов - 34, средняя оценка - 4.74
6 / 7 / 0
Регистрация: 13.10.2010
Сообщений: 159

Imaplib - скачивание файла с именем на кириллице

10.12.2015, 00:18. Показов 7067. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте

Есть такой скрипт, который скачивает все вложенные файлы во всех подходящих письмах.
Он отлично работает, если имя вложенного файла не содержит кириллических символов.

Но, если имя файла, например "Проверка.txt", то возникает такая ошибка:
OSError: [Errno 22] Invalid argument: 'C:\\folder\\=?UTF-8?B?0YDRg9GB0YHQutC40Lkg0YLQtdC60YHRgi50 eHQ=?='
т.е. параметр filename (который мы получаем в строке filename = part.get_filename()) в MIME-структуре письма хранится в таком виде.

Вопрос: как его перевести в исходный вариант?


Полная версия скрипта

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import getpass, imaplib, email, os, zipfile, sys
 
#директория, куда будем загрузать файлы
detach_dir = 'C:\\folder'
 
if os.path.isdir(detach_dir) == False:
    os.mkdir(detach_dir);
 
M = imaplib.IMAP4_SSL('imap.yandex.com')
M.login('username', 'password')
M.select()
typ, data = M.search(None, 'FROM', '"username@server.domain"')
 
id_list = data[0].split() # ids is a space separated string
 
#Цикл по всем письмам
for num in id_list:
    typ, data = M.fetch(num, '(RFC822)')
    email_body = data[0][1] # getting the mail content
    mail = email.message_from_bytes(email_body) # parsing the mail content to get a mail object
 
    #Check if any attachments at all
    if mail.get_content_maintype() != 'multipart':
        sys.exit()
 
    # we use walk to create a generator so we can iterate on the parts and forget about the recursive headache
    for part in mail.walk():
        # multipart are just containers, so we skip them
        if part.get_content_maintype() == 'multipart':
            continue
 
        # is this part an attachment ?
        if part.get('Content-Disposition') is None:
            continue
 
        filename = part.get_filename()
        counter = 1
 
        # if there is no filename, we create one with a counter to avoid duplicates
        if not filename:
            filename = 'part-%03d%s' % (counter, 'bin')
            counter += 1
 
        att_path = os.path.join(detach_dir, filename)
 
        #Check if its already there
        if not os.path.isfile(att_path) :
            # finally write the stuff
            fp = open(att_path, 'wb')
            fp.write(part.get_payload(decode=True))
            fp.close()
 
 
M.close()
M.logout()
Заранее большое спасибо за помощь

Добавлено через 1 час 7 минут
Решил

Python
1
2
3
4
5
6
7
8
9
10
import base64
 
...
filename = part.get_filename()
        
if filename[:11] == '=?KOI8-R?B?': 
    filename = base64.b64decode(filename[11:]).decode('KOI8-R').decode("utf-8")  
if filename[:10] == '=?UTF-8?B?': 
    filename = base64.b64decode(filename[10:]).decode("utf-8")  
...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.12.2015, 00:18
Ответы с готовыми решениями:

Скачивание файла с изменяющимся именем
Доброго времени суток! Столкнулся с такой вот проблемой: В папку каждый день выгружается архив, соответственно имя у него...

Скачивание файла из интернета с неполным именем файла
Необходимо скачать файл часть имени которого неизвестна. Например: сервер может создать файл с именем от bn170924349_v01.fit до...

проблема с именем пользователя на кириллице
У меня Windows 10. При покупке ввели имя пользователя на кириллице как Любовь. Столкнулась с проблемами правильной установки программ....

2
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
10.12.2015, 03:28
Python
1
2
3
4
5
6
7
8
9
10
import locale
CHARSET = locale.getpreferredencoding(do_setlocale=False)
del locale
 
filename = part.get_filename()
filename, charset = email.header.decode_header(filename)
if charset:
    filename = filename.decode(charset)
else:
    filename = filename.decode(CHARSET)
0
6 / 7 / 0
Регистрация: 13.10.2010
Сообщений: 159
14.12.2015, 00:30  [ТС]
Попробовал.

Выдает:
filename, charset = email.header.decode_header(filename)
ValueError: not enough values to unpack (expected 2, got 1)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.12.2015, 00:30
Помогаю со студенческими работами здесь

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

npp++ portable плагин Tidy2 не работает если npp++ лежит в папке с именем на кириллице
Не могу разобраться почему npp++ portable а конкретно сам плагин Tidy2 вообще не работает если npp++ лежит в папке с именем на кириллице,...

Если S является допустимым именем файла, то создать пустой файл с именем и вывести True
Дана строка S. Если S является допустимым именем файла, то создать пустой файл с этим именем и вывести True. Если файл с именем S создать...

Если строка является допустимым именем файла, то создать пустой файл с этим именем
Помогите решить Дана строка S. Если S является допустимым именем файла, то создать пустой файл с этим именем и вывести TRUE. Если файл...

Если S является допустимым именем файла, то создать пустой файл с именем и вывести True
помогите решить. срочно надо сегодня сдавать. Дана строка S. Если S является допустимым именем файла, то создать пустой файл с этим...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru