Форум сайта python.su
Гугл меня уже забанит скоро, сколько я его дрючу по этому поводу
Не могу раскодировать сообщение, пришедшее на gmail
search_criterion = '(SENTSINCE 25-Nov-2010)'
gm = imaplib.IMAP4_SSL('imap.gmail.com', 993)
gm.login( bytes('mylogin@gmail.com', 'ASCII'), bytes('mypassword', 'ASCII') )
status, count = gm.select('Inbox', imaplib.IMAP4_SSL.readonly)
typ, data = gm.search(None, search_criterion)
messages = data[0].split()
message_count = len(messages)for k in range(first ,message_count) :
# list the last email found
typ, message_parts = gm.fetch(messages[len(messages)-1], 'RFC822')
message_body = str( message_parts[0][1] )
msg = email.message_from_string( message_body )
print(msg)
for part in msg.walk():
print(part.get_payload())
...
Mime-Version: 1.0
Content-Type: multipart/alternative;
tboundary="----=_Part_22273_1831234854.1290718992094"
urn:schemas:mailheader:content-type: multipart/mixed
------=_Part_22273_1831234854.1290718992094
Content-Type: text/plain; charset=Windows-1251
Content-Transfer-Encoding: binary
\xd3\xe2\xe0\xe6\xe0\xe5\xec\xfb\xe9 \xea\xeb\xe8\xe5\xed\xf2...
Офлайн
Ловкость рук - и никакого мошенничества:
>>> s = "\xd3\xe2\xe0\xe6\xe0\xe5\xec\xfb\xe9 \xea\xeb\xe8\xe5\xed\xf2"
>>> import feedparser
>>> feedparser.parse(s)
{'feed': {}, 'encoding': 'MacCyrillic', 'bozo': 1, 'version': '', 'namespaces': {}, 'entries': [], 'bozo_exception': SAXParseException('Document is empty\n',)}
>>> s.decode('MacCyrillic')
u'\u201d\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442'
>>> print s.decode('MacCyrillic')
”важаемый клиент
>>>
Офлайн
>>> b = b"\xd3\xe2\xe0\xe6\xe0\xe5\xec\xfb\xe9 \xea\xeb\xe8\xe5\xed\xf2"
>>> s = b.decode('cp1251')
>>> s
'Уважаемый клиент'
>>>
>>> s = "\xd3\xe2\xe0\xe6\xe0\xe5\xec\xfb\xe9 \xea\xeb\xe8\xe5\xed\xf2"
>>> s
'Óâàæàåìûé êëèåíò'
>>> d = {'Ó': 'У', 'â': 'в', 'à': 'а', 'æ': 'ж', 'å': 'е', 'ì': 'м', 'û': 'ы', 'é': 'й', 'ê': 'к', 'ë': 'л', 'è': 'и', 'í': 'н', 'ò': 'т' }
>>> s.translate(str.maketrans(d))
'Уважаемый клиент'
>>>
Отредактировано (Ноя. 26, 2010 02:16:00)
Офлайн
Андрей, спасибо, а этот feedparser я правильно понимаю что не стандартный модуль, а нечто специальное возможно с http://feedparser.org/ ?
py.user.next, спасибо за примерчики, мне очень понравился по лаконичности первый, только в нем входная строка с помощью префикса b изначально задается как bytes, что удобно для демонстрации, но затруднительно в практике, поскольку входную строку я получаю именно как str в результате вызова функции part.get_payload()
И если я правильно понял, сконвертировать str в bytes не сложно, но необходимо опять же указывать кодировку
Судьба сжалилась надомной, и мне удалось догадаться использовать ISO-8859-1, и в итоге заработала конструкция
bytes( part.get_payload(), ‘ISO-8859-1’ ).decode( ‘cp1251’ )
Хотя странно все это, ей богу
Офлайн
Да, это feedparser.org
И чем больший текст вы ему скармливаете - тем лучше он угадывает.
Надеюсь, у вас python2?
Честно говоря, email (и imaplib) в python 3.1 практически непригодны к использованию. Именно из-за кодировок.
В не вышедшем еще 3.2 ситуация значительно лучше. Не знаю, полностью ли все исправлено - но изменений очень много.
Если работаете с двойкой - bytes не для вас.
Если с тройкой - для текста письма (но не для для attachment) уже должна быть строка (т.е. уже правильно преобразованный юникод). Что, повторяюсь, безбожно глючит в Python 3.1 для неанглийских текстов.
Офлайн
Андрей СветловПолностью с Вами согласен. Возможно это не понацея от всех бед, но
безбожно глючит в Python 3.1 для неанглийских текстов
msg = email.message_from_string(str(b"\n".join(lines), "ascii", "ignore"))
Отредактировано (Ноя. 27, 2010 08:01:18)
Офлайн
Не умно с моей стороны было не указать про версию.
И не умно было пытаться пробовать сделать это на тройке, как я теперь понимаю.
Спасибо за моральную поддержку, а то я себе весь волосеной покров выдераю, пока что еще только на голове, и никак не пойму почему кодировка в теле письма прописана 1251, а любые попытки узнать об этом через методы get_charset, get_content_type никак не сообщали о кодировке.
Точно глючит. Мрак какойто. Ни как не мог предположить, что это настолько сыро.
pyuser, а в указаном коде “lines” это должно быть типа bytes, верно?
У меня тело письма получается следующим образом
typ, message_parts = gm.fetch(messages[k], 'RFC822')
message_body = str( message_parts[0][1] )
Отредактировано (Ноя. 29, 2010 00:48:17)
Офлайн
Все. перебил заголовок с #!/usr/bin/env python3 на #!/usr/bin/env python и проблем перестало быть!
Правда в pytty сменил кодировку с utf8 на cp1251, но и это уже большое достижение… не вижу никаких теперь \xd3\xe2\…!
Задолбал питон3, как же хорош питон2!
Офлайн