gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:52:33 24 4
gpt4 key购买 nike

我编写了一个 python 脚本(或从教程复制)来从电子邮件附件中获取值。每天,我都会收到能源提供商发来的一封电子邮件,其中包含我的太阳能发电厂的生产数据。如果我在收到原始电子邮件时运行脚本,我会收到一些乱码(但 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']

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

其中电子邮件 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)

最佳答案

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

您可能想先尝试对其进行解码。为此,您应该首先导入base64,然后执行类似的操作

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

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

关于python - 使用 imap 获取电子邮件附件,但无论电子邮件是从 Outlook 客户端还是通过 Web 发送,都会得到不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59740378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com