代码之家  ›  专栏  ›  技术社区  ›  James McMahon

在什么情况下,javax.mail中的Folder.create()返回false?

  •  1
  • James McMahon  · 技术社区  · 14 年前

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

    代码段是:

    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)没有显示任何日志条目,除非它找不到新文件夹。在相应的单元测试中,mock email服务器(GreenMail)要么工作要么忽略命令,在任何情况下,测试都会通过。

    2 回复  |  直到 12 年前
        1
  •  3
  •   unbeli    14 年前

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

    具体什么时候 false 是否返回取决于实现。孙氏 Javamail 如果

    1. 创建文件夹的IMAP命令失败,或
    2. IMAP命令成功,但文件夹仍然不存在,如用exists()检查的,或
    3. 如果您要求一个可以容纳子文件夹的文件夹,它还会检查所创建的文件夹是否没有子文件夹 \Noinferiors 旗帜。这是因为某些IMAP服务器不支持同时包含邮件和子文件夹的文件夹。

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

        2
  •  3
  •   Luchostein    11 年前

    当心:

    Folder.HOLDS_MESSAGES == 1

    Folder.HOLDS_FOLDERS == 2

    Folder.HOLDS_FOLDERS & Folder.HOLDS_MESSAGES == 0 (始终)

    您可以尝试: Folder.HOLDS_FOLDERS | Folder.HOLDS_MESSAGES

    推荐文章