返回发送电子邮件的时间和日期-IMAP



python新手,我一直在尝试创建一个程序来返回收到特定电子邮件的时间,但在任何地方都找不到这样做的函数电子邮件。如果能提供任何帮助以及如何做到这一点,我们将不胜感激。感谢

password = input('Enter your password')
import imapclient
server = imapclient.IMAPClient('imap-mail.outlook.com', ssl=True)
server.login('myemail@msn.com',password)
import pprint
pprint.pprint(server.list_folders())
server.select_folder('Inbox')
rawMessage = server.fetch(40111, ['BODY[]'])
import pyzmail
message = pyzmail.PyzMessage.factory(rawMessage[40111][b'BODY[]'])
messagebodyTEXT = message.text_part.get_payload().decode(message.text_part.charset)
print(messagebodyTEXT)

您使用的库正在谈论IMAP协议。在IMAP中,没有所谓的";接收消息的时间";。有一个时间戳显示该消息是";存储在邮箱(INTERNALDATE(中";,但在一般情况下,这是另一回事。

您还可以尝试解析Received标头,这些标头可能包含(也可能不包含(您要查找的信息。

在之前关于INTERNADATE的评论和答案的基础上,以下是我用来检索交付日期并将其转换为日期时间对象的代码片段,带有imaplib库:

>>> import imaplib
>>> connection = imaplib.IMAP4_SSL('yourimapserver')
>>> response = connection.login('youremailaddress', 'password')
>>> connection.select('INBOX')
>>> status, data = connection.fetch(b'1', '(INTERNALDATE)') # b"1" is your uid

从那里,不同的选项取决于:

  • imap服务器提供的日期时间格式
  • 是否需要具有时区意识的对象

时区初始

>>> import datetime
>>> import time
>>> data[0]
b'1 (INTERNALDATE "12-Aug-2020 16:38:19 +0200")'
>>> timestruct = imaplib.Internaldate2tuple(data[0])
>>> timestruct
time.struct_time(tm_year=2020, tm_mon=8, tm_mday=12,tm_hour=16, tm_min=38, tm_sec=19, tm_wday=2, tm_yday=225, tm_isdst=1)
>>> datetime_delivered = datetime.fromtimestamp(mktime(timestruct))
>>> datetime_delivered
datetime.datetime(2020, 8, 12, 16, 38, 19)

时区感知(Python 3.2+(

>>> import email
>>> str_datetime = data[0].decode().split('"')[1]
>>> str_datetime
"12-Aug-2020 16:38:19 +0200"
>>> timezone_aware = email.utils.parsedate_to_datetime(str_datetime)
>>> timezone_aware
datetime.datetime(2020,8, 12, 16, 38, 19, tzinfo=datetime.timezone(datetime.timedelta(seconds=7200)))

我看到您使用的是pyzmail第三方库,但您知道Python标准库中有一个扩展的email模块吗?

具体来说,我认为解析器是您提取时间戳所需要的:

  • https://docs.python.org/3/library/email.parser.html

最新更新