2010-07-23 57 views
0

我试图让电子邮件处理Java应用程序将所有处理后的邮件从IMAP收件箱移动到子文件夹。如果该子文件夹不存在,它应该创建它。最后一点是不起作用的。在什么情况下,javax.mail中的Folder.create()返回false?

的代码片段是:

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,但它确实没有说什么,只是如果创建()返回false,该文件夹没有创建(惊奇,惊奇) 。

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

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

回答

2

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

确切返回false取决于实现。 SUN的Javamail实现将返回false,如果

  1. IMAP命令创建一个文件夹出现故障或
  2. IMAP命令是成功的,但该文件夹仍然不存在,如存在()检查,或
  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

相关问题