JavaMail 按 ReceivedDate 搜索,不能精确到秒吗?

2023-11-23

在 IMAP 中,邮件编号基于邮件放入文件夹的时间(即文件夹中的第一封邮件为 1,第二封邮件为 2,等等)。但是,此排序不考虑消息的接收日期。我担心的是早于文件夹中的消息号 1 的消息,即由用户手动移入文件夹的消息(而不是在系统接收到消息时)。

我不能只获取收到的每条消息的日期,因为这是非常低效的。

I thought我可以进行 JavaMail 搜索以获取具有接收日期的所有邮件older比第一条消息的接收日期,(同样,然后进行搜索以获取具有接收日期的所有消息newer比第一条消息的接收日期...这会很多,但是虽然我需要处理所有较旧的消息,但我只需要处理一些较新的消息(通过进程,我的意思是下载其标头)。

但是,当我使用搜索时,它似乎无法正常工作。

        Message[] messages = csqFolder.getMessages();           

        if (messages != null && messages.length > 0) {

            Date receivedDate = messages[0].getReceivedDate();
            log.trace("Message 1 receivedDate: <" + receivedDate.toString() + ">");
            SearchTerm msgsOlderThanOETFirst = 
                new ReceivedDateTerm(DateTerm.LT, receivedDate);

            SearchTerm msgsNewerThanFirst = 
                new ReceivedDateTerm(DateTerm.GT, receivedDate);

            Message[] oldMsgs = csqFolder.search(msgsOlderThanOETFirst, messages);
            log.trace("Size of oldMsgs: <" + oldMsgs.length + ">");
            Message[] newMsgs = csqFolder.search(msgsNewerThanFirst, messages);
            log.trace("Size of newMsgs: <" + newMsgs.length + ">");

但是,当我运行这些搜索时,它似乎没有给出正确的结果。

在包含 8 条消息的文件夹中,其中 7 条的接收日期时间为 8 月 5 日中午 12:00 左右,但文件夹中的第一条消息为 8 月 5 日下午 4:00,我们将看到以下内容:

Message 1 receivedDate: <Fri Aug 05 16:46:57 CDT 2011>
Size of oldMsgs: <0>
Size of newMsgs: <7>

但是,其余七条消息都比第一条消息更旧......它们都应该位于 oldMsgs 中。

也就是说,如果我将前一天(8 月 4 日)的邮件放入该文件夹中,那么搜索将直接针对该邮件进行搜索。就好像搜索只能按天进行,不能精确到秒……

我应该注意到,在 msgsOlderThanOETFirst 一词中,我最初使用的是 LE(因此得名),但是,这会翻转上面的结果——所有消息都将在 oldMsgs 中找到。

其他人可以确认这种行为是否属实吗?如果是,这是否表明 Java 中存在错误?

我试图查看搜索的源代码,但我认为我得到的是它的命令行版本,而不是 javamail 包使用的那种......

我使用的是带有 SP1 的 MS Exchange 2007 和 JavaMail 1.4.3。

感谢您的任何建议。

UPDATE:我不认为我对比较器顺序的解读是错误的。查看以下线程中给出的答案:java imap 获取自某个日期以来的消息

假设我们使用该答案,并且我们的边界是从 7/15/2011 到 9/15/2011。然后我们让搜索与给定日期 8/4/2011 的消息进行比较。然后我们会有以下内容:

                                              8/4/2011  <     9/15/2011
SearchTerm olderThen = new ReceivedDateTerm(ComparisonTerm.LT, someFutureDate);
SearchTerm newerThen = new ReceivedDateTerm(ComparisonTerm.GT, somePastDate);
                                              8/4/2011  >     7/15/2011

在这两种情况下,这都会评估为 true,这正是我们所期望的,因为日期在所需的范围内。

同样,我的代码如下:

    SearchTerm msgsOlderThanOETFirst =    8/4/2011  < 8/5/2011
            new ReceivedDateTerm(DateTerm.LT, receivedDate); --> TRUE
    SearchTerm msgsNewerThanFirst =       8/4/2011  > 8/5/2011
            new ReceivedDateTerm(DateTerm.GT, receivedDate); --> FALSE

以上对 TRUE 和 FALSE 的评价是我所期待的,并将收到的。但是,如果我们在 8/5/2011 12:00:00 获取给定消息,我们会得到以下内容:

    SearchTerm msgsOlderThanOETFirst =    8/5/2011 12:00:00  < 8/5/2011 16:46:00
            new ReceivedDateTerm(DateTerm.LT, receivedDate); --> TRUE?
    SearchTerm msgsNewerThanFirst =       8/4/2011 12:00:00  > 8/5/2011 16:46:00
            new ReceivedDateTerm(DateTerm.GT, receivedDate); --> FALSE?

除了,不——我们没有明白这一点——相反,我们得到了相反的结果……此时很容易认为自己陷入了困境,但是……我已经反复检查了好几次了。 JavaMail 有什么问题吗,还是我完全困惑了?如果是后者,请纠正我的困惑!


根据 JM 开发人员 Bill Shannon 的说法,这是 IMAP 协议的限制:

from    Bill Shannon 
to  Jonathan Hanson 
cc  [email protected]
date    Wed, Aug 10, 2011 at 11:55 AM
subject Re: Bug with searching by ReceivedDateTerms
mailed-by   oracle.com
    Important mainly because of your interaction with messages in the conversation.

hide details 11:55 AM (16 minutes ago)

The searching is being done by the IMAP server, and you're running into a limitation of the IMAP protocol.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaMail 按 ReceivedDate 搜索,不能精确到秒吗? 的相关文章

随机推荐

  • 如何使用 Hogan.JS 从外部文件加载模板?

    I use Hogan JS作为 JavaScript 模板库 它应该从外部文件加载 JavaScript 模板 人们或许可以在外部 JavaScript 文件中外包多个模板 有谁知道这是怎么做到的吗 我有以下代码示例
  • 为什么带有“track by”的 Angular ng-options 无法通过 id 选择

    我有一组使用 ng options 显示的对象 并使用 id 设置 ng model 如果我添加track by在上面 该项目无法选择 如果不添加 则工作正常 为什么 以下代码 angular module myApp controller
  • 错误:Access-Control-Allow-Headers 不允许请求标头字段 Content-Type

    我使用vS2012创建了一个mvc4 web api项目 我使用以下教程来解决跨源资源共享 http blogs msdn com b carlosfigueira archive 2012 07 02 cors support in as
  • TCP接收数据

    如果我在 TCP 中发送 1000 字节 是否能保证接收者 一起 收到全部 1000 字节 或者也许他首先只会收到 500 个字节 然后他会收到其他字节 EDIT 问题来自应用程序的角度 如果 1000 字节在到达应用程序之前被重新组装成单
  • 保存可在任何网站上编辑的内容所做的更改

    以下代码允许任何网站暂时完全可编辑 document body contentEditable true 如果我想使用此方法保存对特定网站所做的设置 如何使用 Javascript 和 PHP 如果需要 实现此目的 以便下次访问此 URL
  • 如何更改 VS Code 中的装订线宽度?

    如何使排水沟宽度更大 我想要它是当前宽度的 4 5 倍 请参见下图 宽度是一个生成的动态值 直接在 VScode 中通过多次测量得出 看here了解那里发生了什么 改变这一点并非易事 您必须自己深入研究代码并做好可能产生不良影响的准备 有一
  • 如何制作 Android 应用程序的评论副本?

    有人要求我提供一些我编写的 Android 应用程序的评论副本 这很棒 但我不愿意将完整的应用程序提供给任何人 我想做一个限时版本 可以工作两周左右 然后就放弃了 做到这一点最简单的方法是什么 我自己还没有对此进行测试 但我认为理论上 如果
  • 是否存在遵循本福德定律的随机数分布?

    Python 有多种方法来生成不同分布的随机数 请参阅的文档random module 不幸的是 如果没有适当的数学背景 特别是考虑到所需的参数 它们就不太容易理解 我想知道这些方法是否能够产生服从分布的随机数本福德定律 以及什么参数值是合
  • 在 iPad 上使位于文本框上的图像可点击(为 iOS 创建 HTML5 搜索输入类型)

    我正在尝试模拟 HTML5input type search 使用 JavaScript 我的目标是做这样的事情 首先 我将说明为什么我不直接使用 HTML5 搜索输入类型 对于 iPad 上述输入类型显示圆角文本框 本机搜索输入框所需的所
  • 将绘图保存为封装后记 (.eps) 时,R 丢失信息

    Lyx 和 Latex 可以很好地处理 eps 图像 但是 当我从 Rstudio 导出带有平滑曲线的散点图时 点会丢失 而绘图仅包含曲线 我尝试过的两种保存方法是 在 Rstudio 中 从图像字段的下拉菜单中选择 导出 并另存为 eps
  • 如何在 bash 中转义反引号

    我很长时间以来都在试图逃避 bash 中的反引号 我尝试使用 进行转义 但它不起作用 bash 中是否可以逃避反引号 示例代码 I hello pdf var1 cat lt
  • 在 F# 中实现队列类型

    我正在尝试在 F 中实现一个队列 到目前为止 这就是我所拥有的 但我认为它的行为更像是一个堆栈 type a queue NL Que of a a queue let enque m function NL gt Que m NL Que
  • appsettings.json 中 IncludeScopes 的 JSON 验证失败

    我正在使用 ASP NET Core 2 1 为什么我得到Expression must be of type object for IncludeScopes in my appsettings json file 下面是显示警告所需的
  • window.orientation 在 iOS 和 Android 中返回不同的值

    我正在测试我的网络应用程序iPad Safari 浏览器 and 三星 Tab 2 默认浏览器 The window orientationchange在两个设备中返回不同的值 document ready function window
  • 在“docker exec”命令中执行“bash -c”

    Context 我正在尝试为我的日常使用编写一个快捷方式docker exec命令 由于某些原因 我正在尝试这样的问题 当我在容器内使用 bash 控制台时 我的输出有时会被破坏 历史记录混乱 行在我编写时相互覆盖 I read here您
  • 什么时候不应该关闭 php 文件?

    我遇到过一个教程 如果我可以添加的话 这是一个有信誉的教程 其中关闭 php 标签 gt 被省略了 这让我想起了之前的一个教程 作者说它实际上更好not关闭标签 但没有解释原因 我有点惊讶 我认为关闭标签是更好的做法 为什么最好不要关闭它
  • 如何访问类中的全局环境对象?

    我有一个类需要更新全局环境对象 我可以整天在结构之间传递该环境对象 但是如何允许类对象访问同一变量 import SwiftUI class Global ObservableObject Published var num 10 clas
  • AWS Athena (Presto)如何将映射转置为列

    AWS Athena 查询问题 我的行中有一个嵌套映射 我想将其中的键转置到列 我可以明确地命名这些列 例如items label a 但在这种情况下 键实际上是动态的 从这些行 id 1 items label a foo label b
  • 需要贵金属 API/Web 服务 [已关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 是否有免费的网络服务 AP
  • JavaMail 按 ReceivedDate 搜索,不能精确到秒吗?

    在 IMAP 中 邮件编号基于邮件放入文件夹的时间 即文件夹中的第一封邮件为 1 第二封邮件为 2 等等 但是 此排序不考虑消息的接收日期 我担心的是早于文件夹中的消息号 1 的消息 即由用户手动移入文件夹的消息 而不是在系统接收到消息时