【问题标题】:What happens if number of messages in mail inbox exceed int range?如果邮件收件箱中的邮件数量超过 int 范围会怎样?
【发布时间】:2017-05-16 01:56:41
【问题描述】:

我必须通过使用 POP3 的 JavaMail 不断阅读新的电子邮件。

我将实施这样的解决方案:

  • 统计所有邮件(一次,在申请开始时)
  • 设置lastRead为邮件号码
  • 定期轮询收件箱,然后:
    • 统计所有邮件并检查其数量是否大于lastRead
    • 如果是这样,请阅读新邮件并更新lastRead

在小样本下它工作正常,但我想知道如果服务器上的邮件数量超过 2147483647 会发生什么。

我看到,如果我删除邮件(从普通客户端),它不会影响服务器返回给 JavaMail 的邮件数量或其数量。但是如果邮箱溢出怎么办?我是否必须停止并重新启动应用程序?

Folder 的方法有ints 作为参数(我想到了getMessages,我使用它)。邮箱可以有这么多消息吗?或者,也许这些 id 只是以某种方式重置?但这也不适合我的应用程序。

【问题讨论】:

  • Max int 远高于 32767。它是 2^31-1。
  • @Eran 谢谢。但问题仍未得到解答;)
  • 这里有multithreading
  • @BurakAkyıldız 你能写更多关于这个的东西吗?

标签: java email jakarta-mail


【解决方案1】:

显然,由于 JavaMail 使用 Java int 来表示消息编号,因此如果有超过 2^31-1 条消息,它将不起作用。任何真正的邮箱似乎都不太可能发生这种情况。如果您开始每秒收到一条新消息,那么您还需要 68 年才能达到这个数字。如果您的应用程序确实有这种可能性,您应该管理邮箱,使其永远不会变得那么大,例如,通过删除邮件或将它们移动到存档邮箱(这将需要使用 IMAP)。

(多线程与此无关;我不知道 Burak 在想什么。)

【讨论】:

  • 好的,但是假设我有 100 条消息(例如),数字从 1 到 100。我可以用我的邮箱做什么来“重置”这个邮箱?如果我删除这些消息,我假设新消息的 id 仍然是 101。所以它不适用于我的问题。如果我可以做任何事情来重置这个 ID 号,我必须首先停止我的应用程序,因为我记得在应用程序中 100 是最后读取的消息,所以应用程序不会处理新消息。
  • 您将消息(序列)编号与 UID 混淆了。消息编号是整数,UID 是长整数,因此 UID 可以增长到 2^63-1。你永远不会用完。
  • 但是如何使用 UID?我应该这样做吗?因为现在我只会使用消息 ID。
  • POP3 有自己的 UID,但它们是字符串而不是数字。有关详细信息,请参阅 com.sun.mail.pop3 包的 javadocs。
  • JavaMail project has moved to GitHub。希望来自 java.net 网站的重定向很快就会到位。
猜你喜欢
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
相关资源
最近更新 更多