【问题标题】:Under what circumstances does Folder.create() from javax.mail return false?javax.mail中的Folder.create()在什么情况下返回false?
【发布时间】:2011-03-20 04:30:24
【问题描述】:

我正在尝试让处理电子邮件的 Java 应用程序将所有已处理的邮件从 IMAP 收件箱移动到子文件夹。如果该子文件夹不存在,它应该创建它。最后一点是行不通的。

代码sn-p是:

private void _backupMessage(Message msg, Folder folder, String sBackupFolderName) throws MessagingException
{
    Folder backupFolder = folder.getFolder(sBackupFolderName);
    if (!backupFolder.exists()) {
        boolean f = backupFolder.create(Folder.HOLDS_FOLDERS & Folder.HOLDS_MESSAGES);
        if (!f) {
            this._triggerFaultEvent(new RuntimeException("Could not create backup folder."));
        }
    }
    backupFolder.open(Folder.READ_WRITE);
    folder.copyMessages(new Message[] { msg }, backupFolder);
    backupFolder.close(true);
}

对应的 Javadoc 是 here,但它实际上什么也没说,只是如果 create() 返回 false,则说明文件夹没有创建(惊喜,惊喜)。

我能够使用同一帐户使用 Thunderbird 创建文件夹。

我的电子邮件服务器 (Postfix) 没有显示任何日志条目,除非它找不到新文件夹。在相应的单元测试中,模拟邮件服务器(GreenMail)要么工作要么忽略命令,无论如何,测试通过。

【问题讨论】:

    标签: java email imap jakarta-mail


    【解决方案1】:

    首先,Postfix 不是 IMAP 服务器。应该有另一个程序为您提供 IMAP,它是检查日志的地方,而不是 Postfix。

    何时准确返回 false 取决于实现。如果

    ,SUN 的 Javamail 实现将返回 false
    1. 创建文件夹的 IMAP 命令失败,或者
    2. IMAP 命令成功,但文件夹仍然不存在,通过exists() 进行检查,或者
    3. 如果您要求一个可以容纳子文件夹的文件夹,它还会检查创建的文件夹是否没有\Noinferiors 标志。这是因为某些 IMAP 服务器不支持同时包含邮件和子文件夹的文件夹。

    我建议您获取实现的源代码并使用调试器逐步完成它。这可能是找出问题所在的最快方法。

    【讨论】:

      【解决方案2】:

      小心:

      Folder.HOLDS_MESSAGES == 1

      Folder.HOLDS_FOLDERS == 2

      Folder.HOLDS_FOLDERS & Folder.HOLDS_MESSAGES == 0(总是)

      你可以试试:Folder.HOLDS_FOLDERS | Folder.HOLDS_MESSAGES 等于 3

      【讨论】:

        猜你喜欢
        • 2015-03-06
        • 1970-01-01
        • 1970-01-01
        • 2016-03-02
        • 2018-04-26
        • 1970-01-01
        • 2017-05-07
        • 1970-01-01
        • 2020-04-21
        相关资源
        最近更新 更多