Python imaplib搜索电子邮件以及日期和时间

时间:2018-08-28 09:13:28

标签: python python-3.x python-2.7 imaplib

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

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

没有时间就可以正常工作。 是否也可以随时间搜索

谢谢

2 个答案:

答案 0 :(得分:0)

不幸的是没有。 RFC 3501 §6.4.4中定义的通用IMAP搜索语言不包含任何按时间搜索的规定。

SINCE被定义为包含<date>的{​​{1}}项,带或不带引号。

IMAP甚至都不了解时区,因此您必须根据date-day "-" date-month "-" date-year项在本地过滤掉不适合您范围的前几条消息。您甚至可能需要多花几天的时间来获取消息。

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

答案 1 :(得分:0)

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

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的电子邮件数量。

此代码段最初由Abdou Rockikz在 thepythoncode 处编写,后来由我自己修改以适合您的要求。

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