@CrazyEnimal
Кратко не получится.

Автоматическое декодирование темы письма в Python?

Добрый день!
Читаю почту с помощью такого скрипта

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import datetime
import imaplib
import email
import quopri
import os, sys
import re
import json
import hashlib
import dateutil.parser as dp
import config as cfg

# print 'Number of arguments:', len(sys.argv), 'arguments.'
# print 'Argument List:', str(sys.argv)

# Берем первый аргумент, и использкем его как указание директории
dirToParse = sys.argv[1]

# Инициализируем коннект до майлсервера
mail = imaplib.IMAP4_SSL(cfg.emailHost)
mail.login(cfg.emailUser, cfg.emailPassword)
mail.list()
mail.select(dirToParse)

# Ищем все письма, которые датированы вчерашним днем.
dateSearch = (datetime.date.today() - datetime.timedelta(30)).strftime("%d-%b-%Y")

result, data = mail.search(None, '(SINCE {date})'.format(date=dateSearch))

# Получаем все ID найденных писем
id_list = data[0].split()
dictTakes = {}

# Перебираем все найденные письма
for id in id_list:

    # Дешифровка письма
    result, data = mail.fetch(id, "(RFC822)")
    raw_email = data[0][1]
    try:
        email_message = email.message_from_string(raw_email)
    except TypeError:
        email_message = email.message_from_bytes(raw_email)
    
    # Парсим и преобразем все что хотим вытянуть
    messageFrom = email.utils.parseaddr(email_message['From'])[1]
    messageTo = email.utils.parseaddr(email_message['To'])[1]
    messageSubject = email_message['Subject']
    messageDateFP = email_message['Date']
    messageDate = dp.parse(messageDateFP).strftime("%d-%b-%Y")
    messageSec = dp.parse(messageDate).strftime('%s')
    messageDecodedSubject = quopri.decodestring(messageSubject).replace('=?UTF-8?q?','').replace('=?UTF-8?B?','').replace('=?utf-8?b?','').replace('=?utf-8?q?','').replace('?','').replace('_',' ')
    hashSubject = hashlib.md5(messageDecodedSubject).hexdigest()
    
    # Добавляем в массив все выбранные данные
    dictTakes[hashSubject] = dictTakes.get(hashSubject,{'Subject':'','Touches':{}})
    dictTakes[hashSubject]['Subject'] = messageDecodedSubject
    # Создаем пустые ячейки
    tmp = dictTakes[hashSubject]['Touches'].get(str(messageSec),{'Touch':0,'Date':messageDate})
    dictTakes[hashSubject]['Touches'][str(messageSec)] = tmp
    dictTakes[hashSubject]['Touches'][str(messageSec)]['Touch'] = dictTakes[hashSubject]['Touches'][str(messageSec)]['Touch'] + 1
    dictTakes[hashSubject]['Touches'][str(messageSec)]['Date'] = messageDate

# После перебора выдаем массив в виде дампа JSON
print json.dumps(dictTakes)


Суть в том, часто неверно декодируется Тема письма в строке:
messageDecodedSubject = quopri.decodestring(messageSubject).replace('=?UTF-8?q?','').replace('=?UTF-8?B?','').replace('=?utf-8?b?','').replace('=?utf-8?q?','').replace('?','').replace('_',' ')

Если я правильно понимаю, то нужно как-то определять что это такое конкретно base64 или quopri но как это сделать атоматически не могу понять...
Помогите прописать нормальное декодирование темы а то получается то нормальный текст а то что-то типа этого:
=?UTF-8?B?0KHQsdC10YDQsdCw0L3QuiDQntC90LvQsNC50L0uINCe0LTQvdC+0YDQsNC3?=
=?UTF-8?B?0L7QstGL0Lkg0L/QsNGA0L7Qu9GMINC00LvRjyDQstGF0L7QtNCwIDE2Mzg=?=
=?UTF-8?B?Nw==?=


Может быть кто-то подскажет более простой способ чтения почты, решающий проблемы с различными кодировками в письмах?
Заранее благодарен!
  • Вопрос задан
  • 33 просмотра
Решения вопроса 1
Zarom
@Zarom
Мастер на все руки из жопы
Попробуйте вариант из этого ответа
https://stackoverflow.com/a/21715870
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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