IMAP协议违规:未知消息的EXPUNGE响应?

时间:2017-07-05 14:17:05

标签: javamail imap

我对IMAP协议有疑问(如果我的服务器违反了它或者我误解了某些内容):

我遇到了javax.mail.MessagingException(由com.sun.mail.iap.CommandFailedException引起),因为我正在尝试访问不再存在的消息(实际上连接的客户端从未知道它)。

使用Javamail(几乎是当前版本,行为不会随当前版本而改变)我有两个应用程序[C1和C2]访问一个IMAP邮箱/同一个文件夹[S]。

两个客户端[C1和C2]定期提取新消息(使用javax.mail.Folder.getMessages()方法)。如果有消息可用,则会读取,删除该文件夹并删除该文件夹。

C1已经连接并定期完成这项工作。现在C2还连接并与IMAP服务器进行以下通信:

S: * OK The Microsoft Exchange IMAP4 service is ready.
C2: a001 CAPABILITY
S: * CAPABILITY IMAP4 IMAP4rev1 AUTH=NTLM AUTH=GSSAPI AUTH=PLAIN STARTTLS UIDPLUS CHILDREN IDLE NAMESPACE LITERAL+
S: a001 OK CAPABILITY completed.
C2: a002 AUTHENTICATE PLAIN
S: +
C2: [...]
S: a002 OK AUTHENTICATE completed.
C2: a003 NOOP
S: a003 OK NOOP completed.
C2: a004 NOOP
S: a004 OK NOOP completed.
C2: a005 LIST "" MyFolder
S: * LIST (\HasNoChildren) "/" MyFolder
C2: a005 OK LIST completed.
S: a006 SELECT MyFolder
S: * 0 EXISTS
S: * 0 RECENT
S: * FLAGS (\Seen \Answered \Flagged \Deleted \Draft $MDNSent)
S: * OK [PERMANENTFLAGS (\Seen \Answered \Flagged \Deleted \Draft $MDNSent)] Permanent flags
S: * OK [UIDVALIDITY 11369] UIDVALIDITY value
S: * OK [UIDNEXT 39] The next unique identifier value
S: a006 OK [READ-WRITE] SELECT completed.
C2: a007 NOOP
S: a007 OK NOOP completed.

显然没有消息可用,因此C2将等待几分钟再次检查。同时C1检查并接收一条消息,它将其标记为已删除并清除该文件夹。

下次C2要求新消息时(使用上面提到的Javamail方法),我的IMAP服务器返回:

C2: a008 NOOP
S: * 1 EXPUNGE
S: * 0 EXISTS
S: a008 OK NOOP completed.

现在javax.mail.Folder.getMessages()会返回一条消息(几乎没有填充任何内容),javax.mail.Message.isExpunged()也会返回false

几乎任何消息方法都失败,上面提到了异常 com.sun.mail.iap.CommandFailedException:a010否指定的消息集无效。

我在这里做错了什么?

  • 我的IMAP服务器反应奇怪吗?它违反了IMAP协议吗?它真的应该通知我的客户(C2)有关它永远不知道的一条消息吗?
  • 我是否应该在JavaMail中保持IMAPFolder处于打开状态以便以后使用?
  • 这可能是JavaMail中的一个错误(当然我不知道代码的每一行,但代码似乎已经存在了很长一段时间)?

0 个答案:

没有答案