You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用imap-tools从Outlook获取指定发件人当日邮件的时间范围问题

解决imap-tools获取Outlook当日指定发件人邮件的时间范围问题

你的问题出在时间范围定义不够精确:仅使用datetime.date.today()作为date_gte参数时,imap-tools会将其解析为「大于等于当日日期」,但Outlook等邮件服务器的时间戳逻辑或时区差异,会导致凌晨到中午的邮件被过滤。此外,仅用date_gte无法严格限定「当日」的完整区间,需同时指定截止边界。

修改方案

直接构造当日00:00:00到次日00:00:00的完整时间范围,用date_gte(大于等于起始)和date_lt(小于截止)组合条件,同时简化查询条件写法:

def get_emails(username, password, sender):
    from imap_tools import MailBox, A
    import datetime

    emails = []
    # 构造当日00:00:00的时间戳
    today_start = datetime.datetime.combine(datetime.date.today(), datetime.time.min)
    # 构造次日00:00:00的时间戳(作为当日的截止边界)
    today_end = datetime.datetime.combine(
        datetime.date.today() + datetime.timedelta(days=1), 
        datetime.time.min
    )

    with MailBox('outlook.office365.com').login(username, password, 'INBOX') as mailbox:
        # 合并发件人、时间范围两个查询条件
        for msg in mailbox.fetch(
                A(from_=sender, date_gte=today_start, date_lt=today_end),
                mark_seen=True
            ):
            if msg.subject == "Subject":
                emails.append(msg.text)
        return emails

时区兼容说明

如果你的本地时区与Outlook服务器时区(通常为UTC)不一致,需要将时间转换为UTC格式:

import pytz

# 转换为UTC时间的起始和截止
today_start = datetime.datetime.combine(
    datetime.date.today(), datetime.time.min
).astimezone(pytz.utc)
today_end = datetime.datetime.combine(
    datetime.date.today() + datetime.timedelta(days=1), datetime.time.min
).astimezone(pytz.utc)

(需提前安装pytz库:pip install pytz)

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:45:49