Добрый день!
Читаю почту с помощью такого скрипта
#! /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==?=
Может быть кто-то подскажет более простой способ чтения почты, решающий проблемы с различными кодировками в письмах?
Заранее благодарен!