2015年11月1日日曜日

Androidでメニューが消える

2015年9月27日日曜日

JavaMail IMAPでGmailの「送信済みメール」を読む

「GmailのラベルはIMAPから見るとフォルダに見えるんだからね」というのはいろいろなところでよく語られているが、具体的にどんなフォルダ構造になっているかを調べてみた。調べた元々のきっかけは「送信済みメール」だけをどうやってIMAP経由でJavaMailで読むかというのが発端である。

おおむね次のようなコードでフォルダの階層構造を調べてみた。

  1. void showFolders() throws MessagingException {  
  2.   Properties props = ... // IMAP接続情報を設定する  
  3.   Session session = Session.getInstance(props);  
  4.   Store store = session.getStore("imap")  
  5.   store.connect()  
  6.   Folder f = store.getDefaultFolder();  
  7.   showFolder(f)  
  8.   store.close();  
  9. }  
  10.   
  11. void showFolder(Folder f) throws MessagingException {  
  12.   for(Folder _f: f.list()) {  
  13.     System.out.println(_f.getFullName());  
  14.     showFolder(_f);  
  15.   }  
  16. }  

特に自前でラベルを定義していない素に近いアカウントで調べた結果、以下のようなフォルダ構造として見えるようである。


(DefaultFolder)
├─INBOX
├─[Gmail]
│  ├─すべてのメール
│  ├─ゴミ箱
│  ├─下書き
│  ├─迷惑メール
│  ├─送信済みメール
│  └─重要
├─プライベート
├─仕事
├─旅行
└─領収書

「送信済みメール」は[Gmail]のサブフォルダになっているが、次のようなパス指定でStoreからの直接取得もできるようである。

  1. Store store = session.getStore("imap")  
  2. store.connect()  
  3. Folder f = store.getFolder("[Gmail]/送信済みメール");  

それにしてもフォルダ名がローカライズされてしまっているのが扱いに面倒そうである。 試していないがGmailの設定を英語にしている場合は「Sent Mail」や「Drafts」などのフォルダ名になるんだろうと想像がつく。 言語設定に関係なく統一的に扱えるとプログラム側は楽なのに…