首页 > 解决方案 > 为什么 sentDate 和 receivedDate 有时是相等的?

问题描述

val dates = emailConnector
            .emailsFrom(null, "Sent")
            .parallelStream()
            .map { it.sentDate to it.receivedDate }
            .toList()

        dates
            .map {
                when
                {
                    it.first > it.second -> "SENT"
                    it.first < it.second -> "RECEIVED"
                    it.first == it.second -> "EQUAL"
                    else -> "?"
                }
            }
            .asSequence()
            .fold(mutableMapOf<String, Int>()) { acc, s ->
                if(acc[s] == null) acc[s] = 1
                else acc[s] = acc[s]!!+1

                acc
            }
            .let { println(it) }

EmailConnector.emailsFrom返回List<javax.mail.Message>。null 表示我不想使用任何过滤器。

输出结果为:

{SENT=44, RECEIVED=4473, EQUAL=10}

我已经在我的个人邮箱(更准确地说是文件夹“Sent”)上运行了上面的代码,我想知道为什么:

  1. 我已发送的邮件(并放置在我的“已发送”文件夹中确实设置了接收日期?是我从“已发送”文件夹下载此邮件的日期还是我的收件人收到我的邮件的日期?如果有怎么办?有多个收件人吗?如果我是这些收件人之一怎么办?

  2. 大多数消息的接收日期 > 发送日期,但不是全部。为什么?

  3. 只有少数消息具有相同的 receivedDate 和 sentDate。这是什么意思?是否因为服务器处理此消息的速度太快,并且两个操作之间的时间间隔不到一秒,因此看起来这两个(实际上 - 不同的)日期是相等的?

不幸的是,javadoc 没有描述这两个日期:

https://docs.oracle.com/javaee/6/api/javax/mail/Message.html

标签: emailjakarta-mail

解决方案


发送日期由发件人设置。我们希望它是准确的,但它不值得信赖。它可以设置为任何东西。在某些消息中,它根本不会被设置。

接收日期通常在邮件添加到您的邮箱时设置。接收日期由您的 IMAP 服务器提供。POP3 服务器不提供接收日期。

要回答您关于为什么某些发送和接收日期相同的问题,我需要查看JavaMail 调试输出以了解 IMAP 服务器返回的内容。如果消息是由另一个用户使用相同的邮件服务器发送的,则消息可能会在同一秒内发送和接收,因此时间可能相同。如果发送方和接收方之间存在时间偏差,则时间可能看起来相同。


推荐阅读