получать вложения электронной почты с помощью imap, но получать разные результаты, независимо от того, отправляется ли электронная почта из клиента Outlook или через Интернет - PullRequest
1 голос
/ 14 января 2020

Я написал скрипт python (или скопировал из учебника), чтобы получить значения из вложения электронной почты. Каждый день я получаю электронное письмо от моего поставщика энергии с данными о производстве моей солнечной электростанции. Если я запускаю скрипт, когда приходит исходное электронное письмо, я получаю обратно gibberi sh (но CSV не поврежден, я могу прочитать его вручную, открыв файл). Когда я снова пересылаю электронное письмо от своего клиента Outlook 2016, это электронное письмо доставляет ожидаемые значения.

Если я запускаю следующий скрипт с исходным электронным письмом от моего поставщика энергии и одним электронным письмом, пересылаемым мне самому, я получаю следующее:

================================ RESTART ================================

Email ID: 3

09.01.2020-13.01.2020_1.csv found and processing
['MDE6MDA7MC4wMDANCjEwLjAxLjIwMjA7MDE6MTU7MC4wMDANCjEwLjAxLjIwMjA7MDE6', 'MzA7MC4wMDANCjEwLjAxLjIwMjA7MDE6NDU7MC4wMDANCjEwLjAxLjIwMjA7MDI6MDA7', 'MC4wMDANCjEwLjAxLjIwMjA7MDI6MTU7MC4wMDANCjEwLjAxLjIwMjA7MDI6MzA7MC4w']

Email ID: 5

09.01.2020-13.01.2020_1.csv found and processing

['09.01.2020;11:15;16.500', '09.01.2020;11:30;16.100', '09.01.2020;11:45;17.700']

=========================================================================

Где идентификатор электронной почты: 3 - исходный адрес электронной почты, а идентификатор электронной почты - 5: переадресованный.

Есть ли какая-то расшифровка, которая происходит в моем Outlook, и поэтому мой сценарий может прочитать это потом?

try:
    mail = imaplib.IMAP4_SSL('imap.gmail.com', '993') #IMAP PORT 993
    mail.login(config.EMAIL, config.PASSWORD)
    mail.select('inbox')

    head, data = mail.search(None, 'ALL')
    mail_ids = data[0]

    id_list = mail_ids.split()
    first_email_id = int(id_list[0])
    latest_email_id = int(id_list[-1])
    longest_csv = 0

    for email_id in range(first_email_id, latest_email_id+1):
        try:
            typ, data = mail.fetch(str(email_id), '(RFC822)') 
            raw_email = data[0][1]

            # converts byte literal to string removing b''
            raw_email_string = raw_email.decode('utf-8')
            msg = email.message_from_string(raw_email_string)

            #download attachments
            for part in msg.walk():
                if part.get_content_maintype() == 'multipart':
                    continue
                if part.get('Content-Disposition') is None:
                    continue
                fileName = part.get_filename()
                if '.csv' in fileName:
                    print('Email ID:',email_id)
                    print(fileName[14:len(fileName)],'found and processing')
                    fileData = part.get_payload().split('\r\n')
                    print(fileData[50:53]) # Show 3 lines out of ~500
                    print()
        except Exception as e:
            print(e)
    mail.close()         
except Exception as e:
    print(e)

1 Ответ

0 голосов
/ 15 января 2020

В большинстве случаев вложения кодируются в формате base64 при отправке по электронной почте. Таким образом, в вашей строке fileData = part.get_payload().split('\r\n') вы просто получаете содержимое вложения, которое закодировано в base64.

Возможно, вы захотите сначала попытаться декодировать его. Для этого вы должны сначала import base64, а затем сделать что-то вроде

fileData = part.get_payload()
fileData = base64.b64decode(fileData)

Теперь вы должны были хранить внутри fileData фактический контент, который затем можно перейти к .split('\r\n')

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