使用imap获取电子邮件附件,但是无论是从Outlook Client还是通过Web发送电子邮件,都会得到不同的结果

我编写了python脚本(或从教程中复制了脚本)以从电子邮件附件中获取值。 每天,我都会收到来自能源供应商的电子邮件,其中包含太阳能发电厂的生产数据。如果我在收到原始电子邮件时运行该脚本,则会得到一些乱码(但是CSV并未损坏,我可以通过打开文件来手动读取它)。当我再次将Outlook 2016 Client中的电子邮件转发给我自己时,该电子邮件将传递预期的值。

如果我运行以下脚本,并附上我的能源供应商发送的原始电子邮件,然后转发给自己的一封电子邮件,我会得到:

================================ 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']

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

其中电子邮件ID:3是原始电子邮件,电子邮件ID 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)
maxiao258 回答:使用imap获取电子邮件附件,但是无论是从Outlook Client还是通过Web发送电子邮件,都会得到不同的结果

在大多数情况下,通过电子邮件发送附件时,附件均采用base64编码。 因此,在您的行中 fileData = part.get_payload().split('\r\n')只是在获取附件的内容,该内容是base64编码的。

您可能想先尝试对其进行解码。为此,您应该首先import base64,然后做类似的事情

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

现在您应该已经在fileData中存储了实际内容,然后可以继续进行.split('\r\n')

本文链接:https://www.f2er.com/2769299.html

大家都在问