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

