JavaMail:电子邮件和EXPUNGE问题的并发只读处理

时间:2013-11-22 10:34:33

标签: java multithreading exchange-server javamail imap

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

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

最初的测试是成功的,但是最近我遇到了解决方案的一些问题,所以我想要“验证”这种方法,看看其他人是否使用过类似的东西。

我上面提到的问题是EXPUNGE - 基本上不时(我看不到模式)EXPUNGE命令只是失败,我无法删除某些消息。

A12 STORE 1:7 + FLAGS(\ Deleted)
* 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 STORE完成。
...
A15 SELECT INBOX
* 7 EXISTS
* 0最近
* FLAGS(\ Seen \已回答\已标记\已删除\草稿$ MDNSent)
* OK [PERMANENTFLAGS(\ Seen \ Answered \ Flagged \ Deleted \ Draft $ MDNSent)]永久标志
*确定[UIDVALIDITY 55702] UIDVALIDITY值
* OK [UIDNEXT 10557]下一个唯一标识符值
A15 OK [READ-WRITE] SELECT完成。
A16 EXPUNGE
* 0 EXISTS
A16 NO EXPUNGE失败。

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

A14 UID EXPUNGE 10557
* 6 EXISTS
A14 NO EXPUNGE失败。

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

如果它有任何区别,邮件服务器就是MS Exchange。

总结一下 - 如果有人可以分享他的意见,我真的很感激: 1.从邮箱中同时检索电子邮件
2. EXPUNGE可能出现问题

由于

1 个答案:

答案 0 :(得分:0)

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

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