Форум сайта python.su
0
Добрый день. Пытаюсь считать почту с pop.mail.ru через poplib:
# -*- coding: utf-8 -*-
import email, poplib
import quopri
server = "pop.mail.ru"
port = "995"
user = "user"
pasw= "pass"
mServer = poplib.POP3_SSL(server,port)
mServer.user(user)
mServer.pass_(pasw)
#Get the number of mail messages
numMessages = len(mServer.list()[1])
print ("You have %d messages." % (numMessages))
print ("Message List:")
#List the subject line of each message
messages = []
for mList in range(numMessages) :
for msg in mServer.retr(mList+1)[1]:
if msg.startswith(b'Subject'):
# msg=str(msg)
msg=email.message_from_bytes(msg)
# msg=quopri.decodestring(msg.encode('utf-8')).decode('utf-8')
messages.append(msg)
break
mServer.quit()
for i in messages:
print (i)
Офлайн
857
Заголовки раскодируются через email.header.decode_header().
Кодировка берётся из сообщения через msg.get_charsets().
Там много нюансов, они бывают повреждены и так далее, поэтому нужно сделать умный обработчик (и расширяемый), который всё это учитывает.
Это из своей программы. Чисто обработчик заголовков.
class HeadersHandler: def __init__(self, headers, select): #дано : заголовки и список заголовков для выбора #получить: заголовки и список заголовков для выбора # сохранёны; # создано сообщение из заголовков, получена # кодировка сообщения, и сохранены self._headers = headers self._select = select self._msg = email.message_from_bytes( b'\n'.join(self._headers) ) self._charset = self._msg.get_charsets()[0] def start(self): #дано : #получить: pass def filter(self): #дано : сообщение и список заголовков для выбора #получить: ответ = список выбранных раскодированных # заголовков return tuple(self._decode_header(self._msg.get(header)) for header in self._select) def _decode_header(self, header): #дано : заголовок и кодировка сообщения #получить: ответ = раскодированный заголовок # (если раскодирование невозможно, # ответ = первоначальный заголовок) res = '' for i in email.header.decode_header(header): if i[1]: if i[1] != 'unknown-8bit': s = i[0].decode(i[1]) else: s = i[0].decode(self._charset) else: try: s = i[0].decode('latin1') except AttributeError: s = i[0] res += s return res def end(self): #дано : #получить: pass
Отредактировано py.user.next (Июнь 12, 2014 22:33:08)
Офлайн
0
py.user.nextА как быть, если я буду считывать через pop3.top() а не через retr. Питон говорит что это уже не заголовки.
Заголовки раскодируются через email.header.decode_header().Кодировка берётся из сообщения через msg.get_charsets()
Офлайн
857
Snuff4ukТочно так же.
А как быть, если я буду считывать через pop3.top() а не через retr.
Snuff4ukЗначит, что-то не то делаешь.
Питон говорит что это уже не заголовки.
conn.top(n, 0)
Офлайн
0
py.user.nextПробую
Точно так же.
For i in range(numMessages):
for msg in mServer.top(i+1,0)[1]:
enc=msg.get_charsets()
Отредактировано Snuff4uk (Июнь 15, 2014 19:46:09)
Офлайн
857
Ну, неправильно это. Сначала нужно сформировать сообщение, а потом из него вытаскивать кодировку.
Офлайн