2010-07-23 98 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

相關問題