Найти - Пользователи
Полная версия: как правильно декодировать имейл?
Начало » Network » как правильно декодировать имейл?
1
Игнат
подключаюсь к ящику по pop3:

self.pop = poplib.POP3(serv)
self.pop.user(login)
self.pop.pass_(password)

#получаю список писем -- вот как бы тут получить только непрочитанные? такое возможно по pop3?
resp, ids, octets = self.pop.list()
total = len(ids)

# беру последнее письмо:
msg = self.pop.retr(total)

# склеиваю, т.к. почему-то все пришло кусками. тут кстати join никак не использовать? он требует строку, а не байты
# а msg состоит из кусков байтов
body = b''
for part in msg[1]:
body += part

# наконец декодирую:
import quopri
t = quopri.decodestring(body)
print(t.decode('utf-8', 'ignore'))
помимо указанных в коде, остается ещё проблема: если письмо в кириллице, то не все символы декодируются:

Это сообщ=B5ние было отпр=B0влено на адре=81  посредством= ввода данного= e-mail на сайте
что я делаю не так?
usmix
Попробуй так:

import poplib

def getMailMessages():
pop3 = poplib.POP3('pop.yandex.ru', 110)
pop3.user('login')
pop3.pass_('password')

for msg in pop3.list()[1]:
for line in pop3.retr(msg.split()[0])[1]:
print unicode(line, 'koi8-r').encode('cp1251')

if __name__ == '__main__':
getMailMessages()
в моем случае Яндекс высылает кириллицу в кодировке KOI8-R.
o7412369815963
Кодировка указывается в самом письме, у каждого письма может быть своя.
Вот рабочий пример:
pop3,
imap
py.user.next
subj = 'Re: [Ticket#201011129004763] =?UTF-8?Q?=D0=A3=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20?==?UTF-8?Q?=D0=BF=D0=BB=D0=B5=D0=B9=D0=BB=D0=B8=D1=81=D1=82=D0=BE=D0=BC?=.'
вот такую тему получил однажды
сама тема ещё может быть представлена в виде koi8-r (без MIME)
при этом скрипт падает, потому что пытается раскодировать её в строку черeз utf-8

o7412369815963
msg = h[0][0].decode(h[0][1]) if h[0][1] else h[0][0]
это вообще в третьем питоне не подходит
она может при кодировке None выдать байтовый объект
и самое главное, тема может состоять из нескольких кусков
[(b'Re: [Ticket#201011129004763]', None), (b'\xd0\xa3\xd0\xbf\xd1\x80\xd0\xb0\xd0\xb2\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xbf\xd0\xbb\xd0\xb5\xd0\xb9\xd0\xbb\xd0\xb8\xd1\x81\xd1\x82\xd0\xbe\xd0\xbc', 'utf-8'), (b'.', None)]
а ещё было такое, что там был не байтовый объект
[('Re: [Ticket#201011129004763] =?UTF-8?Q?=D0=A3=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20?==?UTF-8?Q?=D0=BF=D0=BB=D0=B5=D0=B9=D0=BB=D0=B8=D1=81=D1=82=D0=BE=D0=BC?=.', None)]
там много чего
если занимаешься, почитай http://tools.ietf.org/html/rfc2047

а ещё я сравнивал с тем, как раскодирует thunderbird
и питон съедает пробел вот в этом месте 004763] =?UTF-, а thunderbird - оставляет
а ещё я сравнивал с тем, как раскодирует web-интерфейс это дело - то же самое, он оставляет пробел
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