Ошибка при получении почты с python 3 «элемент последовательности 0: ожидаемый экземпляр str, найдены байты» - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь получать письма на python с помощью poplib, когда я запускаю код, я получаю следующий вывод sequence item 0: expected str instance, bytes found. Вот весь код, если кто-нибудь знает гораздо более простой способ печати получаемой почты, я был бы признателен, если бы вы прокомментировали его. Я также хотел бы иметь возможность печатать только электронные письма определенного почтового ящика. Спасибо.

import poplib
from email import parser
pop_conn = poplib.POP3_SSL('pop.gmail.com')
pop_conn.user('mail@gmail.com')
pop_conn.pass_('password')

messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)]
# Concat message pieces:
messages = ["\n".join(mssg[1]) for mssg in messages]
#Parse message intom an email object:
messages = [parser.Parser().parsestr(mssg) for mssg in messages]
print(message.keys())
for message in messages:
    print(message['subject'])
    print(message.get_payload())
pop_conn.quit()

1 Ответ

0 голосов
/ 02 февраля 2020

Проблема возникает в вашей строке

messages = ["\n".join(mssg[1]) for mssg in messages]

Здесь вы пытаетесь присоединиться к "\n", который является строкой, с mssg[1], который технически является списком, и это содержит байтовые строки. Чтобы заставить эту указанную c строку работать, вы можете сделать messages = [b"\n".join(mssg[1]) for mssg in messages] (обратите внимание на b), чтобы она заработала. Однако вы снова столкнетесь с проблемами при вызове parsestr() из Parser, потому что вы снова анализируете его mssg[1], который не является строкой. Посмотрите документацию email.Parser, она должна иметь функцию, которая принимает байты вместо строк в качестве входных данных.

Также я бы лично использовал IMAP вместо POP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...