Я использую приведенный ниже код для чтения непрочитанного электронного письма.
В методе mail.fetch
мы получаем type,data в качестве возвращаемых параметров, и мы получаем доступ к необработанному письму с помощью raw_email = data[0][1]
. Может ли кто-нибудь объяснить, почему мы жестко кодируем индекс как [0][1]
для получения сообщения? Это какой-то правильный способ получить сообщение без жесткого кода?
Код Python ниже:
import imaplib
mail = imaplib.IMAP4_SSL('imap.gmail.com')
try:
mail.login(email_user, email_pass)
status, messages = mail.select("INBOX")
(retcode, emailnums) = mail.search(None,'(UNSEEN)')
if retcode == 'OK':
for emailnum in emailnums[0].split():
typ,data = mail.fetch(emailnum,'(RFC822)')
raw_email = data[0][1]
#converts byte literal to string removing b''
raw_email_string = raw_email.decode('utf-8')
email_message = email.message_from_string(raw_email_string)
Ответ от сервера IMAP представляет собой вложенный кортеж, содержащий сообщение о состоянии, информацию о конверте и фактическое содержимое запрошенного вами электронного письма. Не существует простого способа избежать указания того, какие части кортежа ответа вам нужны, хотя, возможно, вы захотите поискать более высокоуровневую оболочку вокруг низкоуровневого imaplib
Python, если вы не хотите смотреть на эти мельчайшие детали. того, как все работает на уровне протокола (или, скорее, как библиотека Python представляет то, что движется по сети).
Кроме того, декодирование байтов как UTF-8 абсолютно неправильно. Если вам умеренно повезло, вы не наносите прямого вреда (то есть сообщение тривиально все ASCII, а любые 8-битные данные скрыты за кодировкой передачи контента), но это все равно неправильно. Вместо этого вы должны вызвать email_message = email.message_from_bytes(raw_email)
Просто чтобы быть точным, если вам чуть меньше повезло, сообщение содержит 8-битный текст, который не является UTF-8, и вы получите трассировку с UnicodeDecodeError
. Вы еще не просмотрели сообщение, поэтому совершенно невозможно правильно угадать, содержит ли оно вообще символьные данные, и если да, то какие кодировки оно использует. Возможно, см. также Что такое кодировка символов и зачем мне с ней заморачиваться
Я откатил вашу правку; ваш вопрос должен оставаться строго вопросом. Если вы хотите опубликовать свой собственный ответ, не стесняйтесь делать это вместо этого. В любом случае в коде были некоторые очевидные ошибки отступов и некоторая сомнительная обработка заголовка Content-Disposition. Кроме того, нет необходимости удалять существующий файл перед его перезаписью, хотя вы можете проверить наличие ошибок разрешения из open
(может произойти сбой, если файл существует, и вам не разрешено перезаписывать его).
Спасибо Trippleee, я пытаюсь найти вложение в почте. Отсюда используется логика Content-Disposition Header. Есть ли лучший способ сделать это. Я погуглил и получил код.
Наличие или отсутствие Content-Disposition не гарантируется; каждый тип имеет расположение по умолчанию. Возможно, см. Также stackoverflow.com/questions/48562935/…
Также на stackoverflow.com/a/64008532/874188 есть примечания, относящиеся к Content-Disposition (поэтому код над ними не совсем правильный).
Большое спасибо за предложения, будем разбираться :)
Привет @tripleee, спасибо за ответ, все работает отлично!! Я следовал и выполнял инструкции в кодировке символов. Я включил измененный код в вопрос выше. Дайте мне знать, если таковые имеются. На самом деле я загружаю вложение из содержимого электронной почты.