Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
Эксперт Python
 Аватар для АмигоСП
295 / 108 / 57
Регистрация: 07.12.2016
Сообщений: 209

Кодировки в почте

25.05.2017, 14:06. Показов 4938. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, Уважаемые Форумчане. Столкнулся с такой проблемкой. Забираю с почтового ящика письма через скрипт питона. (Тема, От кого, Кому, Тело сообщения и название вложенного файла, если присутствует). Скрипт вроде бы нормально отрабатывает, но периодически в названиях файла проскакивают непонятки. Например вылетает (=?utf-8?B?0KHQu9GD0LbQtdCx0LrQsCDQoNCw0YHRh9C1 0YIg0L3QtdGB0YLQsNC90LTQsNGA0YLQsCDQkNCe 0KQgMzAuMDEuMjAxNyBFZ2dlci5kb2M=?=) - скобки по бокам не нужны. И никак не могу его преобразовать в читаемый вид. На выходе должно получиться (Служебка Расчет нестандарта АОФ 30.01.2017 Egger.doc) - в Mozilla Thunderbird все нормально показывает. Как можно его нормально перекодировать?

Добавлено через 54 минуты
Решил, как показано в этой теме: Imaplib - скачивание файла с именем на кириллице
только немного изменил(на строчные конкретно для моего примера)
Python
1
2
3
4
5
6
7
8
9
10
import base64
 
...
filename = "=?utf8?B?0KHQu9GD0LbQtdCx0LrQsCDQoNCw0YHRh9C10YIg0L3QtdGB0YLQsNC90LTQsNGA0YLQsCDQkNCe0KQgMzAuMDEuMjAxNyBFZ2dlci5kb2M=?="
        
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
Блог
25.05.2017, 14:06
Ответы с готовыми решениями:

Кодировки, класс Encoding. Преобразования текстовых файлов из одной кодировки в другую
Вот сама задача: * Написать программу преобразования текстовых файлов из одной кодировки в другую. * Программа должна...

В чём отличия кодировки ms dos от кодировки ms windows?
Всем привет, подскажите в чём отличия кодировки ms dos от кодировки ms windows?

Кодировки (ошибки кодировки) в логировании
Здравствуйте. Работаю с WINAPI и оттуда нормально приходят наименования на русском. Вот решил логирование организовать и на этом повалился...

4
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
25.05.2017, 14:12
Цитата Сообщение от АмигоСП Посмотреть сообщение
периодически в названиях файла проскакивают непонятки
Потому что декодировать нужно все, что закодировано, а не надеяться, что библиотека сама все сделает.
Каждый заголовок нужно проверять на то какой там Content-Charset\Content-Transfer-Encoding и потом уже писать свою функцию decoder_header, которая обработает все варианты, потому что встроенная:

Python
1
2
3
4
from email.header import decode_header
s = '=?utf-8?B?0KHQu9GD0LbQtdCx0LrQsCDQoNCw0YHRh9C10YIg0L3QtdGB0YLQsNC90LTQsNGA0YLQsCDQkNCe0KQgMzAuMDEuMjAxNyBFZ2dlci5kb2M=?='
header_string,charset = decode_header(s)[0]
print(header_string.decode(charset))
вас не спасет, если charset окажется 'unknown-8bit' или None.
0
Эксперт Python
 Аватар для АмигоСП
295 / 108 / 57
Регистрация: 07.12.2016
Сообщений: 209
25.05.2017, 14:20  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
вас не спасет, если charset окажется 'unknown-8bit' или None.
Garry Galler, а как обрабатывать 'unknown-8bit' или None? Просто действительно не попадались еще, и поэтому даже попробовать не могу
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
25.05.2017, 15:21
Цитата Сообщение от АмигоСП Посмотреть сообщение
как обрабатывать 'unknown-8bit' или None?
Написать что-то вроде этого.
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
import locale
import email
import email.header
 
preferredencoding = locale.getpreferredencoding()
 
 
def decode_header(header,content_charset=None):
    if header is None: return ""
    parts = []
    if content_charset is None:
        content_charset ='utf-8'
    
    def try_decode(decoded_part,charset):
        # пробуем декодировать байты в строку
        try:
            decoded_part = decoded_part.decode(charset)
        except:
            try:
                # если не получилось - пробуем декодировать байты локальной кодировкой системы
                decoded_part = decoded_part.decode(preferredencoding)
            except:
                # если и здесь не получилось, возвращаем как есть - только в виде строки, а не байт
                decoded_part = str(decoded_part) 
        return decoded_part
    
    # декодируем все части заголовка из base64
    for part in email.header.decode_header(header):
        header_string, charset = part
        
        if charset in ['unknown-8bit',None]:
            charset = content_charset # будем использовать либо кодировку из Content-Type, либо utf-8 
        
        decoded_part = try_decode(header_string,charset)
        parts.append(decoded_part)
    
    return "".join(parts)
Где в content_charset должна передаваться кодировка полученная из часть_письма_которую_вы_читаете.get_cont ent_charset()
1
2 / 2 / 0
Регистрация: 09.08.2015
Сообщений: 191
06.04.2019, 11:24
Всем здравствуйте.

Есть скрипт, прилагаю

Есть бяка - ненормально показывается русский текст в названии отправителя, поле From: - см. картинку
При этом нормально показывается английский текст в названии отправителя, поле From:

Пожалуйста, помогите, сделайте так, чтобы нормально показывался русский текст в названии отправителя, поле From:

Спасибо.
Миниатюры
Кодировки в почте  
Вложения
Тип файла: rar plugin.py.rar (39.3 Кб, 4 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.04.2019, 11:24
Помогаю со студенческими работами здесь

Что-то в почте?
Комп стал рассылать на непонятные адреса рекламу(типа-проверь свою фамилию и т.д). Антивирус(Nod32) иногда выдаёт,что некоторые...

Отображение "from" "to" В Почте
Всем доброго дня Подскажите плиз, можно ли поменять отображение полей "from" "to" в письме, допустим на альтернатив нейм? ...

Аватарка в почте
Доброго времени суток! Возник вопрос, на основе чего почтовые сервисы и почтовые программы подставляют аватар отправителя при...

Кракозябры в почте
Доброго времени суток, при отправке почты с сервера на ящик приходят кракозябры, кроме поля mail, оно приходит нормально подскажите как...

поиск по почте
Доброго времени суток. Дали задание, искать в личной почте сотрудников определенные документы. Есть ли возможность сделать поиск по...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
ПЛИС
zxcha1ka_ 27.01.2026
AHDL Разработать программы для синтеза следующих устройств: 1. Параллельного регистра 4-х разрядного с синхронной загрузкой и асинхронным сбросом (обнулением); Пoмoгитe пoжaлyйстa
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
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, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru