【问题标题】:IMAP / Jakarta Mail / Unexpected delete flagIMAP / Jakarta Mail / 意外删除标志
【发布时间】: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


【解决方案1】:

我找到了解决问题的解决方案: 在接收周期后,我没有在所有情况下关闭文件夹和存储对象: 如果确实收到了消息,则该文件夹始终以folder.close(true) 关闭。

此外,我现在确保在所有情况下(也有例外)调用方法 close(),其中包含:

    if (folder != null && folder.isOpen()) {
        folder.close(false);
    }
    
    if (store != null && store.isConnected()) {
        store.close();
    } 

到目前为止,该问题没有再次出现

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2015-10-03
    相关资源
    最近更新 更多