【发布时间】:2021-10-12 23:23:42
【问题描述】:
我开发了一个应用程序来监视邮箱并处理某些消息,这些消息通过在消息主题中包含特定关键字来标识。当收到这样的消息时,它会从邮箱中删除并触发本地处理。代码大致是这样的:
public void process() {
// Create properties
Properties properties = new Properties();
properties.put("mail.imap.host", host);
properties.put("mail.imap.port", port);
properties.put("mail.imap.socketFactory.port", port);
properties.put("mail.imap.partialfetch", "false");
properties.put("mail.imap.fetchsize", 36700160);
// Open
Session session = Session.getInstance(properties);
Store store = session.getStore("imap");
store.connect(emailAddress, password);
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
// Count relevant messages
int count = 0;
try {
// List messages
for (Message message : folder.getMessages()) {
String subject = message.getSubject();
if (subject.contains(keyword)) {
count++;
message.setFlag(Flag.DELETED, true);
// Do some local processing
}
}
} catch (MessagingException e) {
// Log and ignore
} finally {
// Expunge and close if a message was marked deleted
try {
if (count > 0) {
folder.close(true);
}
store.close();
} catch (MessagingException e) {
// Log and ignore
}
}
}
问题是一些应该处理的消息从未被处理。激活 Jakarta 邮件(日志 com.sun.mail)上的日志时,我可以看到正在为某些消息设置删除标志,并且在可以通过上面概述的方法读取它们之前将它们删除(我在应用程序日志中看到) )。由于没有其他客户端连接到邮箱,我相信我的代码可能是问题所在。
该问题仅在应用程序运行几个小时时才会不规律地出现,因此我无法提供可用于重现该问题的最小示例。我的问题更笼统:在使用 Jakarte Mail 或任何其他电子邮件 API 或协议通过 IMAP 处理邮箱中的邮件时,是否有人也观察到了这种行为?你有什么暗示潜在的问题可能是什么?您发现上面显示的伪代码有什么问题吗?
非常感谢任何帮助!
【问题讨论】:
-
只是猜测...在您设置已删除标志但在处理完成之前引发异常,也许?
-
是的,我在处理过程中收到了一些异常。然而,这个想法是不要像这次那样继续,并在下次调用接收方法时处理电子邮件(例如,每隔 30 秒)。但是,我不明白这如何导致删除我的编码未处理的消息上的标志
-
看起来您设置了 \Deleted 然后根据您的代码进行本地处理。
-
感谢您的努力。请在下面找到我的答案
标签: java email jakarta-mail imap