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

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

10.12.2015, 00:18. Показов 7013. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru