尝试在JavaMail IMAP中写入标志时出现IllegalWriteException

Phi*_*ald 7 java email swing exception jakarta-mail

目前我正在尝试在IMAP电子邮件上设置看到的标志,如下所示:

messages[EmailNumber].setFlag(Flag.SEEN, true);
messages[EmailNumber].saveChanges();
Run Code Online (Sandbox Code Playgroud)

其中messages []是通过加载文件夹中的所有电子邮件(设置为具有读/写访问权限)填充的Message对象数组,而EmailNumber是由用户选择JTable中的电子邮件计算的数组中的特定电子邮件我正在填写电子邮件本身.

然而,这继续在第二行给我这个:

javax.mail.IllegalWriteException: IMAPMessage is read-only
Run Code Online (Sandbox Code Playgroud)

即使我填充消息数组(在不同的函数中),如下所示:

folder.open(Folder.READ_WRITE);
messages = folder.getMessages();
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

Bil*_*non 10

删除对saveChanges的调用,这里没必要.


sum*_*ani 6

IMAP消息是只读的,就像POP3消息一样.这是协议的限制,而不是JavaMail.您最接近修改邮件的方法是阅读邮件,使用MimeMessage复制构造函数创建本地副本,修改副本,将副本附加到文件夹,然后删除原始邮件.

IMAPMessage的javadoc被意外省略.但是,它没有任何方法可以帮助您解决这个问题.

请参阅:https://forums.oracle.com/thread/1589468


小智 6

考虑使用Folder.setFlags()。它甚至适用于IMAPFolder(无需Message.saveChanges()):

...     
IMAPFolder fInbox = store.getFolder("INBOX");
fInbox.open(Folder.READ_WRITE);

SearchTerm searchTerm = <some searchTerm>
Message[] messages = fInbox.search(searchTerm);
fInbox.setFlags(messages, new Flags(Flags.Flag.SEEN), true);
...
Run Code Online (Sandbox Code Playgroud)