Java邮件 : Concurrent read-only processing of emails and EXPUNGE issues

标签 java multithreading exchange-server jakarta-mail imap

我目前正在开发一个基于 JavaMail 的解决方案,该解决方案从特定文件夹(收件箱)检索电子邮件,执行一些处理,将它们移动到另一个文件夹(已处理),最后从第一个文件夹中删除它们。

由于某些性能要求,我使用了调度程序/处理器方法,其中一个线程(调度程序)检索一组 UID 并生成许多单独的线程(工作线程),这些线程(工作线程)检索调度程序读取的 UID 的电子邮件。处理邮件后,调度程序线程将它们复制到“已处理”文件夹中,并从“收件箱”文件夹中删除它们。所以基本上的想法是读取是并行完成的。 每个线程使用到邮件服务器的单独连接(单独存储)。目前,文件夹在特定操作/一组操作(例如打开 -> 复制和删除 -> 关闭等)之前打开,并在操作完成后关闭。

最初的测试很成功,但最近我的解决方案遇到了一些问题,因此我想“验证”该方法并看看其他人是否使用过类似的方法。

我上面提到的问题与 EXPUNGE 有关 - 基本上,EXPUNGE 命令有时会失败(从我所看到的情况来看,没有任何模式),并且我无法删除某些消息。

A12 STORE 1:7 +FLAGS(\已删除)
* 1 FETCH (FLAGS (\Seen\Deleted))
* 2 FETCH (FLAGS (\Seen\Deleted))
* 3 FETCH (FLAGS (\Seen\Deleted))
* 4 FETCH (FLAGS (\Seen\Deleted))
* 5 FETCH (FLAGS (\Seen\Deleted))
* 6 FETCH (FLAGS (\Seen\Deleted))
* 7 FETCH (FLAGS (\Seen\Deleted))
A12 OK商店完成。
...
A15 选择收件箱
* 7 存在
* 0 最近
* FLAGS (\已看过\已回答\已标记\已删除\草稿$MDNSent)
* OK [PERMANENTFLAGS (\Seen\Answered\Flagged\Deleted\Draft $MDNSent)] 永久标志
* 确定 [UIDVALIDITY 55702] UIDVALIDITY 值
* OK [UIDNEXT 10557] 下一个唯一标识符值
A15 OK [读写]选择完成。
A16 删除
* 0 存在
A16 NO EXPUNGE 失败。

还尝试使用 UID EXPUNGE 命令仅删除特定消息 - 同样的问题。

A14 UID 删除 10557
* 已存在 6 个
A14 NO EXPUNGE 失败。

有趣的是,有时问题会自行消失 - 例如在一个案例中,几个小时后 EXPUNGE 工作得很好。

如果有什么区别的话,邮件服务器是 MS Exchange。

总结一下 - 如果有人可以分享他对以下方面的看法,我将非常感激:
1.并发从邮箱检索邮件
2. EXPUNGE 可能出现什么问题

谢谢

最佳答案

我没有使用 MS Exchange 的经验。但我发现有些服务器不喜欢在其他客户端访问同一邮箱时进行删除(在并发访问期间进行删除有点棘手)。您可能想测试这是否是问题所在。

或者您可以通过将锁定/测试转移到 \deleted 来回避问题。处理完消息后,请调用 store +flags.silent\deleted ,如果您看到带有 \deleted 标志的消息,请不要处理该消息。然后时不时地发送 expunge 并忽略其结果(如果一个失败,下一个可能会工作)。

关于Java邮件 : Concurrent read-only processing of emails and EXPUNGE issues,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20142697/

相关文章:

java - 替代 DISPLAY.getWidth()

java - c 内的双引号 :set (JSTL)

java - 如何将ObjectDecoder添加到netty服务器

c# - 通过 Exchange Online (Office 365) 使用 System.Net.Mail 发送 SMTP 电子邮件

java - 我应该将 Bean 验证与 EJB 3.1、JSF2.0 和 JPA 一起使用吗?

java - android studio Beta 8.9 错误

Objective-C 卡住 GUI 也带有队列

c++ - 客户端断开连接后处理服务器应用程序中的线程

exchange-server - 能够在 MS Exchange Server 中设置用户忙/闲

c# - Exchange Online (EWS) WebCredentials 是否安全传递?