Найти - Пользователи
Полная версия: Проблема с кодировками принятой почты(poplib)
Начало » Python для новичков » Проблема с кодировками принятой почты(poplib)
1
notfedor
Всем привет!
Столкнулся со столь распространенной проблемой кодировок. Сразу отмечу, что использую Mac.
При использовании следующего кода на прием почты с mail.ru кирилица выводится вот в таком виде:

либо:
=?utf-8?Q?"=D0=97=D0=BD=D0=B0=D0=BA=D0=BE=D0=BC=D1=81=D1=82=D0=B2=D0=B0

либо:
=?utf-8?b?0JLRiyDQt9Cw0YDQtdCz0LjRgdGC0YDQuNGA0L7QstCw0LvQuNGB0Ywg0L0=?=

import poplib, email

SERVER = "pop.mail.ru "
user = "user"
USERPASSWORD = "pass"

p = poplib.POP3('pop.mail.ru')
print p.getwelcome()

print p.user(user)
print p.pass_(USERPASSWORD)

response, lst, octets = p.list()
print response
for msgnum, msgsize in [i.split() for i in lst]:
print "Number: %(msgnum)s Size: %(msgsize)s" % vars()
print "UIDL =", p.uidl(int(msgnum)).split()[2]
if int(msgsize) > 32000:
(resp, lines, octets) = p.top(msgnum, 0)
else:
(resp, lines, octets) = p.retr(msgnum)
msgtxt = "\n".join(lines)
msg = email.message_from_string(msgtxt)
print "* From: %(from)s\n* For: %(to)s\n* Text: %(subject)s\n" % msg
Ни один из найденых на форуме путей решения проблемы не помогает:((
(хотя вероятно это у меня руки кривоваты)

Заранее СПАСИБО!
pyuser
notfedor
Ни один из найденых на форуме путей решения проблемы не помогает
Скорее всего, Вы просто не пробовали
from email.Header import decode_header

def _decode_header(msg):
header = {"from": None, "to": None, "subject": None}
for h in header:
txt, enc = decode_header(msg[h])[0]
header[h] = txt.decode(enc) if enc else txt
return header
...
msg = email.message_from_string(msgtxt)
# print "* From: %(from)s\n* For: %(to)s\n* Text: %(subject)s\n" % msg
print "* From: %(from)s\n* For: %(to)s\n* Text: %(subject)s\n" % _decode_header(msg)
notfedor
Спасибо Вам огромное!
Все работает, правда не совсем понятно как работает функция(вплане что именно она делает)
в частности:
1)if enc else txt #что происходит.))
2)зачем _ перед именем функции?
Спасибо.
pyuser
notfedor
1)if enc else txt #что происходит.))
это более короткая форма записи чем
if enc:
header[h] = txt.decode(enc)
else:
header[h] = txt
notfedor
зачем _ перед именем функции?
Чтобы не вводить Python в заблуждение :) Имя decode_header уже используется поэтому и подчеркивание перед именем функции
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB