如何用python获取从电子邮件接收/发送的日期

如何用python获取从电子邮件接收/发送的日期,python,email,Python,Email,我有一个程序,需要在继续之前阅读电子邮件并验证它们是否来自本月 我通过以下代码获得电子邮件信息 import email import smtplib import imaplib mail = imaplib.IMAP4_SSL('redacted', 993) mail.login(username, bytes(password).decode('utf-8')) #password is bytes that have been decrypted msg_data2 = [] #My

我有一个程序,需要在继续之前阅读电子邮件并验证它们是否来自本月

我通过以下代码获得电子邮件信息

import email
import smtplib
import imaplib
mail = imaplib.IMAP4_SSL('redacted', 993)
mail.login(username, bytes(password).decode('utf-8')) #password is bytes that have been decrypted
msg_data2 = [] #My template allows for multiple email data to be appended
mailbox_data = mail.list()
mail.select('INBOX', readonly=True)
result, msg_ids = mail.search(None, f'(SEARCH CRITERIA REDACTED)')
lister = msg_ids[0].split()
most_recent = lister[-1]
result2, msg_data = mail.fetch(most_recent, '(RFC822)')
msg_data2.append(msg_data)
raw = email.message_from_bytes(msg_data[0][1])

从这里我可以从我的电子邮件中获得符合搜索条件的附件,以前,供应商会根据他们的作业运行月份正确命名这些文件。现在有些人没有,所以我只是想检查一下电子邮件的发送或接收日期。

您可以从电子邮件的“日期”标题中获取发送日期

from email import utils

...
raw = email.message_from_bytes(msg_data[0][1])

datestring = raw['date']
print(datestring)
# Convert to datetime object
datetime_obj = utils.parsedate_to_datetime(datestring)
print(repr(datetime_obj))

日期:
标题由发件人插入,可能准确,也可能不准确。例如,当我写一封电子邮件并将其放入发件箱时,它会在
日期:
标题中获取我将其放入发件箱的日期和时间。即使我只在几个小时(或可能几天)之后发送电子邮件,邮件头也保持不变

这仍然没有说明什么时候收到的。它可能会在运输途中滞留数天。这取决于您的邮件客户端。例如,Claws在获取邮件时插入一个
X-Received
头,当Claws将邮件从服务器下载到本地计算机时,该头将具有时间戳。这可能是它到达您的收件箱后的几分钟甚至几天

要检查您的电子邮件提供商何时实际收到电子邮件,请查看
received:
标题。顶部标题来自(提供商的)邮件服务器。它应该以时间戳结束,并用分号将时间戳与标头的其余部分分隔开

所有时间戳都可以用解析

所以代码应该是这样的:

从电子邮件导入utils
mail=“…”
已发送=邮件['date']
打印(f“日期标题:{sent}”)
received=邮件['received'][0]
已接收=已接收。拆分(“;”)[-1]
打印(f“已收到:{已收到}”)
发送日期=utils.parsedate(发送日期)
received\u ts=utils.parsedate(received\u ts)
传输中的时间=接收的时间=发送的时间
打印(f“发送{发送},接收{接收},花费{时间}”)

我将在我创建的下一个电子邮件抓取器中运行此代码(通常约为每周1个),如果成功,将为您评分。同时,发送日期也适用于我的目的,因为我基本上使用它来验证符合搜索条件的最新电子邮件是否来自本周或本月,因此应该包含上周或上月的数据文件。