当前位置: 首页 > 知识库问答 >
问题:

JavaMail:并发只读处理电子邮件和删除问题

沈鸿光
2023-03-14

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

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

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

我在上面提到的问题是关于EXPUNGE的——基本上,EXPUNGE命令有时会失败(我看不到任何模式),我无法删除某些消息。

A12 STORE 1:7 FLAGS(\已删除)
*1 FETCH(FLAGS(\已看到\已删除))
*2 FETCH(FLAGS(\已看到\已删除))
*3 FETCH(FLAGS(\已看到\已删除))
*4 FETCH(FLAGS(\已看到\已删除))<*5 FETCH(FLAGS(已看到删除))
*6 FETCH(FLAGS(已看到删除))
*7 FETCH(FLAGS(已看到删除))
A12 OK STORE已完成。BR>*0最近
*FLAGS(\Seen\AnSwered\Flagged\Deleding$MDNSent)
*OK[PERMANENTFLAGS(\Seen\AnSwered\Flagged\Deleding$MDNSent)]永久标志
*OK[UIDVALIDITY 55702]UIDVALIDITY value
*OK[UIDNEXT 10557]下一个唯一标识符值
A15 OK[READ-WRITE]SELECT完成。
A16 EXPUNGE
*0 EXISTS
A16 NO EXPUNGE失败。

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

A14 UID删除10557
*6存在
A14没有删除失败

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

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

总结一下——如果有人能分享他对以下问题的看法,我将非常感激:
1。从邮箱html" target="_blank">并发检索电子邮件
2.EXPUNGE可能出了什么问题

谢谢

共有1个答案

哈扬
2023-03-14

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

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

 类似资料:
  • 我有一个Outlook.com的电子邮件帐户。我希望我的Java应用程序能够使用JavaMail从该电子邮件帐户发送电子邮件。为此,我通过OAuth授予了我的应用程序访问权限。 我已经能够使用msgshow中提供的精彩示例应用程序通过IMAP成功连接.java。但是,我正在尝试通过SMTP通过我的 Outlook.com 电子邮件帐户发送电子邮件,但我没有任何运气。我尝试过同时使用msgsend.

  • 我需要通过我的应用程序发送一封电子邮件,比如使用带有OAuth的javamail API,但我需要如何使用我在下面添加的代码。 我的代码:

  • 我正在使用发送电子邮件,但得到的错误是 我正在做的是,我有一个类作为。 上面的类有一个静态方法,-它将SMTP服务器设置和消息详细信息作为参数。 我把SMTP服务器设置放在我的web.xml文件中,但不知道出了什么问题 我的类 } 这是我的网站。xml文件 这是我的servlet类 我在做正确的事情,但不知道问题是什么 如果我在gmail中启用较少的安全应用程序设置,那么它的工作正常,我不认为这是

  • 在本章中,我们将了解如何使用JavaMail API删除电子邮件。 删除消息涉及使用与消息关联的标志。 不同的状态有不同的标志,一些是系统定义的,一些是用户定义的。 预定义标志在内部类Flags.Flag中定义,如下所示: Flags.Flag.ANSWERED Flags.Flag.DELETED Flags.Flag.DRAFT Flags.Flag.FLAGGED Flags.Flag.RE

  • 在服务器端,我创建一个新的带区客户(如果还没有的话),并使用该客户id创建一个结帐会话。然后使用条带api重定向到签出 在签出页面(带区托管)中,有一个电子邮件字段是预填充的,但是可编辑的。我有客户更改了那个电子邮件地址。有没有一种方法,我可以使电子邮件地址在带区签出只读字段?

  • 我正在使用JavaMail 1.4.1(我已经升级到1.4.5版本,但有同样的问题)从一个电子邮件帐户读取消息,但我在内容编码方面有问题: 一些消息被正确读取,但其他消息由于编码不合适而具有奇怪的字符。我意识到它不适用于特定的内容类型。 如果content entType是以下任何一个,它都能很好地工作: > 文本/普通;charset=ISO-8859-1 charset="iso-8859-1