我对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否指定的消息集无效。
我在这里做错了什么?