Найти - Пользователи
Полная версия: Как скачать электронное письмо через POP?
Начало » Python для новичков » Как скачать электронное письмо через POP?
1
8toni8
Более менее разобрался как подключатся к POP серверу и взаимодействовать с ним:
 # -*- coding: koi8-r -*-
import poplib
import base64
import quopri
import re
 
 
def decode_subject(inp):
    found = re.findall(r'=\?([a-zA-Z0-9-]+)\?([bqBQ])\?([a-zA-Z0-9/+=]{4,})={0,2}\?', inp.decode('utf8', 'ignore'))
    try:
        found = list(filter(bool, found[0]))
    except IndexError:
        return inp  # 
    if found[1].upper() == 'B':
        text = base64.b64decode(found[2]).decode(found[0], 'replace')
    else:
        text = quopri.decodestring(found[2]).decode(found[0], 'replace')
    return 'Subject: {}'.format(text)
 
 
server = "pop.mail.ru"
port = "995"
user = "здесь логин"
pasw= 'здесь пароль'
 
 
mServer = poplib.POP3_SSL(server,port)
mServer.user(user)
mServer.pass_(pasw)
print(mServer.stat())
messages = []
senders = []
numMessages = len(mServer.list()[1])
for i in range(numMessages):
    for msg in mServer.top(i+1,0)[1]:
        if msg.startswith(b'Subject'):
            messages.append(msg)
        if msg.startswith(b'Return-path'):
            senders.append(msg)
print (mServer.retr(2)) # 
# mServer.dele(3) #
for i in messages:
    print(decode_subject(i))
 
print('\n')
 
for i in senders:
    print(i)
print (mServer.quit()) # 

Используя функцию POP3.retr(which) получаю письмо, только оно появляется в какой то не понятной для мене кодировке.
Вот отрывок:
“ b'O3ZhbHVlIFBST0M9IklOUyImZ3Q7LTQuOTMmbHQ7L3ZhbHVlJmd0Ozxicj4KJmx0Oy9wYXJhbWV0', b'ZXImZ3Q7PGJyPgombHQ7cGFyYW1ldGVyIFZBUj0iVEVMRU0iIFNFTlNUWVBFPSJIZWF0ZXIiIFNF', b'TlNJRD0iMiIgdW5pdD0iYyImZ3Q7PGJyPgombHQ7dmFsdWUgUFJPQz0iSU5TIiZndDstMS44NyZs', ”

Я так понимаю, это какой то байт код? Должен быть в кодировке Base64 ?
Пробовал его декодировать с помощью функции base64.b64decode(), питон ругается, говорит давай ASCII:

“ TypeError: argument should be a bytes-like object or ASCII string, not ‘tuple’ ”

Ну по крайней мере я так понимаю, что необходимо его с начало кодировать в ASCII, а уже после этого в Base64, ну или как то из b' байт кода переиначить в строку?

А может быть я вообще не той функцией пользуюсь? Ну в смысле POP3.retr(which), хотя вроде другой подходящей в модуле poplib нету: https://docs.python.org/2/library/poplib.html#module-poplib
Или не туда смотрю?

Вообщем вопросов много, натолкните на путь истинный



helm2004
https://github.com/VadymRud/email_downloader
Єто я писал недавно
Rodegast
> Пробовал его декодировать с помощью функции base64.b64decode(), питон ругается, говорит давай ASCII:

У меня всё работает:
 >>> import base64
>>> s = "O3ZhbHVlIFBST0M9IklOUyImZ3Q7LTQuOTMmbHQ7L3ZhbHVlJmd0Ozxicj4KJmx0Oy9wYXJhbWV0"
>>> base64.b64decode(s)
';value PROC="INS"&gt;-4.93&lt;/value&gt;<br>\n&lt;/paramet'
8toni8
helm2004
https://github.com/VadymRud/email_downloaderЄто я писал недавно
Что то для новичка совсем сложно для понимания Комментариев минимум
Я так понимаю это вы под Linux писали, судя по директориям?

Rodegast
У меня всё работает:
Видимо не очень хороший обрывок кода, я для примера показал. По этому для понимания, прикрепил полную версию программы.
Ошибку кстати после применения функции base64.b64decode, такую выдает:
TypeError: argument should be a bytes-like object or ASCII string, not ‘tuple’
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