imapsync で gmail へメールを引越し

昨日の続き。

お題

imap サーバに溜まってた大量のメールを gmail に移動したい。地味にクライアントでドラッグアンドドロップで移動してもいいんだけど、絶対に効率よく出来てる気がしない。というか Thunderbird が固まりまくりで大変です。

gmail には POP で拾ってくれるとか Migration API なるものも用意してあるようですけど、前にも似たようなことがあってちょっとだけ触った imapsync を使いました。

debian ならもちろんパッケージあるし、 MacPorts でも入ります。基本は perl スクリプトのようです。

つかいかた

使い方はいたってシンプルで、以下のような感じ。

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 はそれで調べた)
    • mew 使いなら (setq mew-debug t) しておけばわかると思います。
  • --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 に注意。

メモ

ちなみに、前に調べた時と比べると超絶遅かった。これは gmail 側が遅いようです。 gmail 側の負荷が厳しいとはとても思えないので、あるていど大きな folder について並列で走らせてあげるといいかもね。