Уведомления

Группа в Telegram: @pythonsu

#1 Март 24, 2014 23:27:31

PythonRecrut
Зарегистрирован: 2014-03-24
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Метод pop3.retr и запись в файл

Здравствуйте, столкнулся с проблемой записи eml в файл, при использовании библиотеки pop3.

import poplib                   
                                
username = 'MyMail@mail.ru'
password = 'MyPass'            
p = poplib.POP3('pop.mail.ru')  
p.user(username)                
p.pass_(password)               
numMessages = len(p.list()[1])                  
for i in range(numMessages):                    
    for j in p.retr(i+1)[1]:                    
        outf = open('eml/%s.eml' % i, "a")      
        outf.write('\n\r'.join(p.retr(i+1)[1])) 
        outf.close()                            
p.quit()  

Выдает ошибку
outf.write('\n\r'.join(p.retr(i+1)))
TypeError: sequence item 0: expected str instance, bytes found

Пытался в режиме записи двоичных данных “ab”, то в одну строчку все пишет, то опять ошибки.
print(j) выводит eml в консоль, а мне нужно сохранить почту файлами у себя.
Помогите пожалуйста.
Спасибо.

Отредактировано PythonRecrut (Март 26, 2014 21:20:58)

Офлайн

#2 Март 25, 2014 01:15:55

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

Метод pop3.retr и запись в файл

PythonRecrut
print(j) выводит eml в консоль
у print() есть аргумент file

>>> import sys
>>> 
>>> print('test', file=sys.stderr)
test
>>>

PythonRecrut
TypeError: sequence item 0: expected str instance, bytes found

>>> ' '.join((b'abc', b'def'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected str instance, bytes found
>>> 
>>> b' '.join((b'abc', b'def'))
b'abc def'
>>>

PythonRecrut
'\n\r'.
\r\n (0d 0a)



Онлайн

#3 Март 26, 2014 21:20:03

PythonRecrut
Зарегистрирован: 2014-03-24
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Метод pop3.retr и запись в файл

Спасибо за помощь.

В итоге получилось.

numMessages = len(p.list()[1])
for i in range(numMessages):
    outf = open('eml%s.eml' % i, 'wb')
    outf.write(b'\n'.join(p.retr(i + 1)[1]))
    outf.close()

Офлайн

#4 Март 26, 2014 22:46:36

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

Метод pop3.retr и запись в файл

там должно быть CRLF в любой системе в соответствии с rfc5322

   Messages are divided into lines of characters.  A line is a series of
characters that is delimited with the two characters carriage-return
and line-feed; that is, the carriage return (CR) character (ASCII
value 13) followed immediately by the line feed (LF) character (ASCII
value 10). (The carriage return/line feed pair is usually written in
this document as "CRLF".)



Отредактировано py.user.next (Март 26, 2014 22:48:16)

Онлайн

#5 Март 27, 2014 20:51:13

PythonRecrut
Зарегистрирован: 2014-03-24
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Метод pop3.retr и запись в файл

Вы правы

outf.write(b'\r\n'.join(p.retr(i + 1)[1]))

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version