Библиотека Python imaplib mail.fetch, почему мы жестко кодируем ответ[0][1]?

Я использую приведенный ниже код для чтения непрочитанного электронного письма.

В методе 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)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
158
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ответ от сервера IMAP представляет собой вложенный кортеж, содержащий сообщение о состоянии, информацию о конверте и фактическое содержимое запрошенного вами электронного письма. Не существует простого способа избежать указания того, какие части кортежа ответа вам нужны, хотя, возможно, вы захотите поискать более высокоуровневую оболочку вокруг низкоуровневого imaplib Python, если вы не хотите смотреть на эти мельчайшие детали. того, как все работает на уровне протокола (или, скорее, как библиотека Python представляет то, что движется по сети).

Кроме того, декодирование байтов как UTF-8 абсолютно неправильно. Если вам умеренно повезло, вы не наносите прямого вреда (то есть сообщение тривиально все ASCII, а любые 8-битные данные скрыты за кодировкой передачи контента), но это все равно неправильно. Вместо этого вы должны вызвать email_message = email.message_from_bytes(raw_email)

Просто чтобы быть точным, если вам чуть меньше повезло, сообщение содержит 8-битный текст, который не является UTF-8, и вы получите трассировку с UnicodeDecodeError. Вы еще не просмотрели сообщение, поэтому совершенно невозможно правильно угадать, содержит ли оно вообще символьные данные, и если да, то какие кодировки оно использует. Возможно, см. также Что такое кодировка символов и зачем мне с ней заморачиваться

Привет @tripleee, спасибо за ответ, все работает отлично!! Я следовал и выполнял инструкции в кодировке символов. Я включил измененный код в вопрос выше. Дайте мне знать, если таковые имеются. На самом деле я загружаю вложение из содержимого электронной почты.

suresh vignesh 28.12.2020 06:13

Я откатил вашу правку; ваш вопрос должен оставаться строго вопросом. Если вы хотите опубликовать свой собственный ответ, не стесняйтесь делать это вместо этого. В любом случае в коде были некоторые очевидные ошибки отступов и некоторая сомнительная обработка заголовка Content-Disposition. Кроме того, нет необходимости удалять существующий файл перед его перезаписью, хотя вы можете проверить наличие ошибок разрешения из open (может произойти сбой, если файл существует, и вам не разрешено перезаписывать его).

tripleee 28.12.2020 07:27

Спасибо Trippleee, я пытаюсь найти вложение в почте. Отсюда используется логика Content-Disposition Header. Есть ли лучший способ сделать это. Я погуглил и получил код.

suresh vignesh 28.12.2020 09:13

Наличие или отсутствие Content-Disposition не гарантируется; каждый тип имеет расположение по умолчанию. Возможно, см. Также stackoverflow.com/questions/48562935/…

tripleee 28.12.2020 09:27

Также на stackoverflow.com/a/64008532/874188 есть примечания, относящиеся к Content-Disposition (поэтому код над ними не совсем правильный).

tripleee 28.12.2020 09:43

Большое спасибо за предложения, будем разбираться :)

suresh vignesh 28.12.2020 13:14

Другие вопросы по теме