昨日の続き。
お題
imap サーバに溜まってた大量のメールを gmail に移動したい。地味にクライアントでドラッグアンドドロップで移動してもいいんだけど、絶対に効率よく出来てる気がしない。というか Thunderbird が固まりまくりで大変です。
gmail には POP で拾ってくれるとか Migration API なるものも用意してあるようですけど、前にも似たようなことがあってちょっとだけ触った imapsync を使いました。
つかいかた
使い方はいたってシンプルで、以下のような感じ。
ichii386@elmo% imapsync \ > --host1 mail.example.net --port1 143 --user1 ichii386 \ > --passfile1 ./aho1 --authmech1 CRAM-MD5 \ > --host2 imap.gmail.com --port2 993 --ssl2 --user2 'ichii386@mail.example.com' \ > --passfile2 ./aho2 --authmech2 LOGIN \ > --folder INBOX.hoge.fuga --dry
この例では --dry ついてますが、実際に動かすときは外します。ミスるとけっこう大変なので、 --dry つきで少しずつ確認したほうがいいように思います。
- aho1, aho2 にはパスワードを生で書いたファイルを用意しておきます
- 移行元の host1 で ssl が必要なら --port1 993 で --ssl1 つける
- --authmech1 は PLAIN とか、まあいろいろ試せばどれか当たるでしょう (--authmech2 はそれで調べた)
- --folder は指定すればそのフォルダだけ、指定なければ全フォルダをコピーします
- 途中の画面で移行元、移行先にどういうフォルダがあるか、 host1 にあって host2 になりフォルダはなにか、が表示されます
- とりあえずフォルダ 1 つ指定してみて、デフォルトでフォルダ名がどういう対応で移動されるか見るとよさそう
- --regextrans2 でフォルダ名を s/hoge/fuga/ することもできます
- --delete2 とかほかにもオプション盛りだくさん
++++ Calculating sizes Host1 folder [INBOX.hoge.fuga] Size: 12170183 Messages: 3162 Total size: 12170183 Total messages: 3162 Time: 3 s ++++ Calculating sizes Host2 folder [hoge/fuga] does not exist yet Total size: 0 Total messages: 0 Time: 0 s ++++ Listing folders Host1 folders list: [INBOX] [INBOX.Archives] ... Host2 folders list: [INBOX] [Notes] ... Folders in host2 not in host1: [[Gmail]/foo/bar] ... ++++ Looping on each folder [INBOX.hoge.fuga] -> [hoge/fuga] Host2 folder hoge/fuga does not exist Creating folder [hoge/fuga] ...
このように INBOX.hoge.fuga は hoge/fuga に移動されるようでした。この場合、 "hoge/fuga" というラベルが付いたメールとして gmail に入ることになります。
もっとも、 gmail ではフォルダはラベルでしかなく、ラベルの張替えはとても早いので、すでにある namespace とかぶらないとこに一旦全部突っ込んで、あとで必要なところに振り分けるのもありかもしれないです。
注意点としては、昨日書いたとおり「同じ message-id をもつメールが 1 つに縮約される」ので、移行元のサーバに同じメールのコピーがたくさん転がっている場合は少しずつ試してからやりましょう。とくに INBOX.Sent に注意。