使用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
相关产品推荐
相关产品推荐

