Python imaplib 使用日期和时间搜索电子邮件

Posted

技术标签:

【中文标题】Python imaplib 使用日期和时间搜索电子邮件【英文标题】:Python imaplib search email with date and time 【发布时间】:2019-02-02 20:53:27 【问题描述】:

我正在尝试阅读特定日期和时间的所有电子邮件。

mail = imaplib.IMAP4_SSL(self.url, self.port)
mail.login(user, password)
mail.select(self.folder)
since = datetime.strftime(since, '%d-%b-%Y %H:%M:%S')

result, data = mail.uid('search', '(SINCE "'+since+'")', 'UNSEEN')

它没有时间就可以正常工作。也可以按时间搜索吗?

【问题讨论】:

【参考方案1】:

很遗憾没有。 RFC 3501 §6.4.4 中定义的通用 IMAP 搜索语言不包括任何按时间搜索的规定。

SINCE 被定义为采用 <date> 项目,该项目又被定义为 date-day "-" date-month "-" date-year,带或不带引号。

IMAP 甚至不知道时区,因此您必须根据 INTERNALDATE 项在本地过滤掉不适合您范围的前几条消息。您甚至可能需要多获取几天的消息。

如果您使用的是 Gmail,则可以使用 Gmail 搜索语言,该语言以 extension 的形式提供。

【讨论】:

【参考方案2】:

您无法按日期或时间搜索,但您可以检索指定数量的电子邮件并按日期/时间过滤它们。

import imaplib
import email
from email.header import decode_header

# account credentials
username = "youremailaddress@provider.com"
password = "yourpassword"

# create an IMAP4 class with SSL 
imap = imaplib.IMAP4_SSL("imap.gmail.com")
# authenticate
imap.login(username, password)

status, messages = imap.select("INBOX")
# number of top emails to fetch
N = 3
# total number of emails
messages = int(messages[0])

for i in range(messages, messages-N, -1):
    # fetch the email message by ID
    res, msg = imap.fetch(str(i), "(RFC822)")
    for response in msg:
        if isinstance(response, tuple):
            # parse a bytes email into a message object
            msg = email.message_from_bytes(response[1])
            date = decode_header(msg["Date"])[0][0]
            print(date)

此示例将为您提供收件箱中最后 3 封电子邮件的日期和时间。如果您在指定的提取时间内收到超过 3 封电子邮件,您可以调整提取的电子邮件数量N

此代码 sn-p 最初由 Abdou Rockikz 在 thepythoncode 编写,后来我自己修改以满足您的要求。

对不起,我迟到了 2 年,但我有同样的问题。

【讨论】:

以上是关于Python imaplib 使用日期和时间搜索电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

具有多个条件的python imaplib搜索

使用 Pythons imaplib 搜索之前/之后

使用 Python 和 imaplib 在 GMail 中移动电子邮件

Python 和 imaplib:无需下载完整电子邮件即可获取附件名称或正文

Python/imaplib - 如何获取消息的标签?

如何使用 imaplib 创建电子邮件并将其发送到特定邮箱