Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 24, 2011 13:27:46

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

как правильно декодировать имейл?

подключаюсь к ящику по 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 на сайте
что я делаю не так?



Офлайн

#2 Авг. 25, 2011 15:51:31

usmix
От:
Зарегистрирован: 2011-07-08
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

как правильно декодировать имейл?

Попробуй так:

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.



Офлайн

#3 Авг. 25, 2011 20:53:25

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

как правильно декодировать имейл?

Кодировка указывается в самом письме, у каждого письма может быть своя.
Вот рабочий пример:
pop3,
imap

Отредактировано (Авг. 25, 2011 20:53:50)

Офлайн

#4 Авг. 31, 2011 02:44:13

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

как правильно декодировать имейл?

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-интерфейс это дело - то же самое, он оставляет пробел



Отредактировано (Авг. 31, 2011 02:50:37)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version