成功创建文件夹后,为什么会出现FolderNotFoundException?

时间:2013-02-11 02:33:03

标签: java imap javamail

我正在尝试创建一个文件夹(如果它不存在),然后将邮件从另一个文件夹复制到目标文件夹。我发现了一些我无法理解的奇怪行为。鉴于以下摘录:

// messages is an array of Message instances.
// Source is the source folder
// destination is a string of the destination folder.
Folder dest = null;
try {
    dest = store.getFolder(destination);
    if (!dest.exists()) {
        dest.create(Folder.HOLDS_MESSAGES | Folder.HOLDS_FOLDERS);
        // Since folder's are not meant to cache I thought I'd get it again
        // though this does not work either.
        //dest.close(false);
        //dest = store.getFolder(destination);
    }
    dest.open(Folder.READ_WRITE);
    // Fails here
    source.copyMessages(messages, dest);
    source.setFlags(messages, new Flags(Flags.Flag.DELETED), true);
} catch (MessagingException ex) {
    throw new MailProcessorException(ex.getMessage(), ex);
} finally {
    if (dest != null) {
        try {
            dest.close(false);
        } catch (MessagingException ex) {
            System.err.println("Couldn't close destination folder.");
        }
    }
}

检查以下行为:

  • 如果文件夹不存在:
    1. 创建文件夹
    2. source.copyMessages会抛出异常。
  • 如果文件夹存在:
    1. 邮件按预期复制。
    2. 邮件被标记为删除。

我正在使用JavaMail 1.4.6,也尝试使用1.6.5。

1 个答案:

答案 0 :(得分:1)

真的奇怪。查看您的代码并阅读文档,应该不会发生这种情况......

邮件服务器有问题吗?有些数据库使用一致性模型(例如,请参阅http://en.wikipedia.org/wiki/Eventual_consistency),这些模型并不总是以您天真的方式行事。您是否有可能在不同的邮件服务器上尝试代码?或者,尝试在Thread.sleep(...)电话前放置一段很长的时间(30秒?)copyMessages(...),看看是否能解决问题。

如果是这样,发生的事情是您的服务器在一个请求中创建文件夹,但是此创建需要一段时间才能到达处理邮件复制的服务器代码部分。然后,不幸的是,我不确定如果复制失败或人工延迟(这很糟糕),除了重试之外你还能做多少。

旁白:文档似乎说,如果您愿意,可以跳过dest.open(Folder.READ_WRITE);