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

如何用javax.mail API读取Outlook今日邮件?代码无返回结果

解决javax.mail无法搜索今日邮件的问题

嘿,我一眼就瞅出你的代码问题在哪啦!咱们一步步拆解来看:

核心错误点

你写的new Date(Calendar.DAY_OF_MONTH)完全是个误用——Calendar.DAY_OF_MONTH只是个代表“日期字段”的常量(值是5),用它创建的Date其实是1970年1月1日 00:00:00.005,这和今日日期差了十万八千里,自然搜不到任何今日邮件啦!

另外还有个逻辑问题:用ComparisonTerm.EQ(精确等于)匹配邮件接收时间几乎不可能命中,因为邮件的ReceivedDate是精确到毫秒的,你很难刚好和某个毫秒值完全匹配,必须用时间范围来筛选。

修正后的代码

我们需要获取今日的零点整作为起始时间,再获取明日零点整作为结束时间,然后筛选接收时间在这个区间内的邮件:

Folder emailFolder = store.getFolder("INBOX");
emailFolder.open(Folder.READ_ONLY);

// 初始化日历对象,获取当前时间
Calendar calendar = Calendar.getInstance();
// 设置为今日0点0分0秒0毫秒
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date startOfToday = calendar.getTime();

// 日历加一天,得到明日零点(作为今日的结束边界)
calendar.add(Calendar.DAY_OF_MONTH, 1);
Date startOfTomorrow = calendar.getTime();

// 构建搜索条件:接收时间 >= 今日零点 且 < 明日零点
ReceivedDateTerm startTerm = new ReceivedDateTerm(ComparisonTerm.GE, startOfToday);
ReceivedDateTerm endTerm = new ReceivedDateTerm(ComparisonTerm.LT, startOfTomorrow);
SearchTerm todaySearchTerm = new AndTerm(startTerm, endTerm);

// 执行搜索
Message[] messages = emailFolder.search(todaySearchTerm);

简化写法(可选)

你也可以直接用BETWEEN条件来替代AndTerm,代码会更简洁:

SearchTerm todaySearchTerm = new ReceivedDateTerm(ComparisonTerm.BETWEEN, startOfToday, startOfTomorrow);

不过要注意:部分邮件服务器对BETWEEN的处理可能会包含结束边界(也就是明日零点的邮件也会被匹配),所以用GE + LT的组合会更稳妥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:22:59