繁体   English   中英

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

[英]How can I get the date recieved / sent from email in python

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

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

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))

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

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

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

可以使用email.utils.parsedate解析所有RFC 5322时间戳。

所以代码应该是这样的:

from email import utils

mail = "..."

sent = mail['date']
print(f"Date header: {sent}")

received = mail['Received'][0]
received = received.split(";")[-1]
print(f"Received: {received}")

sent_ts = utils.parsedate(sent_date)
received_ts = utils.parsedate(received_ts)

time_in_transit = received_ts = sent_ts
print(f"Sent {sent_ts}, received {received_ts}, took {time_in_transit}")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM