Python 使用imap获取电子邮件附件,但无论电子邮件是从Outlook客户端发送还是通过Web发送,都会得到不同的结果
我编写了一个python脚本(或从教程中复制)来从电子邮件附件中获取值。 每天,我都从我的能源供应商那里收到一封电子邮件,里面有我的太阳能发电厂的生产数据。如果在收到原始电子邮件时运行脚本,我会收到一些乱七八糟的回复(但是CSV没有损坏,我可以通过打开文件手动读取)。当我再次将Outlook 2016客户端的电子邮件转发给我自己时,这封电子邮件传递了预期的值 如果我使用我的能源供应商的原始电子邮件运行以下脚本,并将一封电子邮件转发给我自己,我会得到以下结果:Python 使用imap获取电子邮件附件,但无论电子邮件是从Outlook客户端发送还是通过Web发送,都会得到不同的结果,python,email,outlook,attachment,Python,Email,Outlook,Attachment,我编写了一个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\u payload().split('\r\n')
您只需获取附件的内容,它是base64编码的
您可能想先尝试解码它。为此,您应该首先导入base64,然后执行如下操作
fileData = part.get_payload()
fileData = base64.b64decode(fileData)
现在,您应该已将实际内容存储在
文件数据中,然后可以继续执行.split('\r\n')
在大多数情况下,通过电子邮件发送附件时,附件是base64编码的。
因此,在你的队伍中
fileData=part.get\u payload().split('\r\n')
您只需获取附件的内容,它是base64编码的
您可能想先尝试解码它。为此,您应该首先导入base64,然后执行如下操作
fileData = part.get_payload()
fileData = base64.b64decode(fileData)
现在,您应该已经将实际内容存储在fileData
中,然后可以继续执行.split('\r\n')
您忽略了该身体部位的指定内容传输编码。您看到的乱七八糟的内容只是另一个的base64编码版本。您忽略了该身体部位的指定内容传输编码。你看到的胡言乱语只是另一个版本的base64编码版本。向上投票或标记为解决方案会有帮助:)我做到了,出现了这样一条消息:感谢反馈!声誉低于15的人所投的票将被记录,但不会更改公开显示的帖子分数。将其标记为解决方案(箭头下方的绿色复选标记)应执行trickAn upvote或将其标记为解决方案将有助于:)我做到了,出现了此消息:感谢反馈!声誉低于15的人所投的票会被记录下来,但不会改变公开显示的帖子分数。将其标记为解决方案(箭头下方的绿色复选标记)应该可以做到这一点