おおむね次のようなコードでフォルダの階層構造を調べてみた。
void showFolders() throws MessagingException { Properties props = ... // IMAP接続情報を設定する Session session = Session.getInstance(props); Store store = session.getStore("imap") store.connect() Folder f = store.getDefaultFolder(); showFolder(f) store.close(); } void showFolder(Folder f) throws MessagingException { for(Folder _f: f.list()) { System.out.println(_f.getFullName()); showFolder(_f); } }
特に自前でラベルを定義していない素に近いアカウントで調べた結果、以下のようなフォルダ構造として見えるようである。
(DefaultFolder) ├─INBOX ├─[Gmail] │ ├─すべてのメール │ ├─ゴミ箱 │ ├─下書き │ ├─迷惑メール │ ├─送信済みメール │ └─重要 ├─プライベート ├─仕事 ├─旅行 └─領収書
「送信済みメール」は[Gmail]のサブフォルダになっているが、次のようなパス指定でStoreからの直接取得もできるようである。
Store store = session.getStore("imap") store.connect() Folder f = store.getFolder("[Gmail]/送信済みメール");
それにしてもフォルダ名がローカライズされてしまっているのが扱いに面倒そうである。 試していないがGmailの設定を英語にしている場合は「Sent Mail」や「Drafts」などのフォルダ名になるんだろうと想像がつく。 言語設定に関係なく統一的に扱えるとプログラム側は楽なのに…