先日、GoogleWorkspaceのGmailの多数アカウントのメールデータをConoHaのレンタルサーバー『ConoHa WING』に付属するメールサービスへ移行するという作業をしました。
その方法について説明します。
あらまし
今まで個人ユーザに重宝されてきたG Suite無償版が2022年6月を以て有料化しました。
その後、個人利用に関しては引き続き無料利用が可能とのアナウンスがありましたが、営利目的で利用している場合は有料プランへの移行は免れません。
知人の会社も従業員のメール用にGoogle Workspaceを利用していましたが、ユーザー単位の料金が利用度に対して割に合わない(Business Starterで630円/ユーザー)ので、比較的低価格なConoHa WING(36ヶ月契約でユーザー数に関わらず月額換算660円)のメールサービスに移行することにしました。
ConoHa WINGはWebサーバーの方がメインですが、容量は300GB(1アカウント10GBまで)までと他社と比較してかなり大容量です。
imapsyncとは
imapsyncはIMAPのメールを別のメールボックスへ転送できるコマンドラインツールです。
無料で利用でき、Gmailにも対応しています。
個人でメールの転送をする場合は、Thunderbirdのようなメールクライアントで橋渡しをすれば済みますが、組織における大量のユーザを処理するのには手間が掛かりすぎるので、コマンド一発で実行できるimapsyncを使うことにしました。
Dockerイメージも用意されているので、インストール不要の使い捨てで実行できます。
ラベルの扱いをどうするか
Gmailは『ラベル』というものが存在しており、これについて考える必要があります。
対するIMAPにもフォルダという概念がありますが、まったく同じものではありません。
要するに、同一のメールが複数のフォルダに存在する可能性があります。
そこで、IMAPへ転送する際の処理として複数のラベルを持つメールをどう扱うかという判断が必要になってきます。
imapsyncではデフォルトで各ラベル名のフォルダにメールがコピーされるようになっています。
その為、うっかりこのまま転送してしまうと、「Gmailでは5GBだったのに移行したら20GBになってしまった!」なんてこともあり得ます。
それを回避するために —skipcrossduplicates
という重複回避オプションが用意されていて、そのルールも多少融通が利くようになっています。
今回は—skipcrossduplicates
を使うことにしました。こちらは—gmail1
オプションに含まれています。
『安全性の低いアプリのアクセス』をオンにする必要がある
見出しの通りなのですが、GmailにIMAPアクセスするにはこの項目をオンにしなくてはいけません。
ですが、管理者権限でこの部分を操作することができず、各ユーザーに設定してもらわなければなりません。
しかも、2段階認証プロセスを有効にしていると、この項目が設定できませんので、一時的に解除してもらう必要があります。
ここがちょっと厄介なところではありますね。
総実行時間が結構かかる問題
IMAPの送受信速度はそこまで速くありませんので、大量のアカウントを転送する際にシーケンシャルに処理しているだけでは、回線の帯域もPCのリソースもかなり余してしまい、効率が良くありません。
さらに言えば、そんな軽い処理のためにPCの電源を入れっぱなしにするのは電気代の無駄になります。
VPS上でtmuxを使う
今回はimapsyncの実行には普段から使っているVPSを利用することにしました。
これならばもともと立ち上げっぱなしなので電気代は関係なくなります。
また、tmuxを使って並列実行すれば効率が何倍にもなりますし、ターミナルを切断しても処理は継続しますので、見張っている必要はなくなります。
Gmailの帯域制限
重量級のメールボックスは転送するのにただでさえかなり時間がかかりますが、GmailのIMAPダウンロードは1日の転送制限が2500MBとなっており、これにひっかかると切断されてしまう可能性があります。
imapsyncは親切にこれを回避するための転送レート制限オプションを用意してくれていますが、これの調節をうまくやらないと余計に時間がかかってしまうので注意が必要です。
今回 —gmail1
オプションにデフォルトで含まれる下記の設定をそのまま採用しました。
--maxbytespersecond 20_000
--maxbytesafter 1_000_000_000
参照: https://imapsync.lamiral.info/FAQ.d/FAQ.Gmail.txt
また、バッチ処理でしょっぱなから重量級のアカウントから始めてしまうと、後がつかえてしまうので軽いものから優先的に実行するように並べ替えて、重量級はなるべくtmuxの窓を分散させるようにグループ分けするといいかと思います。
バッチスクリプトの作成
いよいよ実行するためのスクリプトを作成します。
一つのメールアドレスに対して実行するコマンドは以下の一つでOKです。
docker run --rm gilleslamiral/imapsync imapsync \
--noemailreport1 --noemailreport2 \
--host1 imap.gmail.com --port1 993 --ssl1 --authmech1 LOGIN \
--user1 "{GMailのメールアドレス}" \
--password1 "{GMailのパスワード}" \
--host2 mail22.conoha.ne.jp --port2 993 --ssl2 --authmech1 LOGIN \
--user2 "{ConoHaのメールアドレス}" \
--password2 "{ConoHaのパスワード}"
今回、ConoHaのIMAPサーバーはmail22.conoha.ne.jp
でしたので、それを入力しています。
このコマンドにCSVファイルからパラメータを読み込めるようにするシェルスクリプトを作ります。
まずは以下のような中身のCSVファイルを作ります。
sync_mails.csv
src-mail1@example.com,src-password1,dst-mail1@example.ne.jp,dst-password1
src-mail2@example.com,src-password2,dst-mail2@example.ne.jp,dst-password2
src-mail3@example.com,src-password3,dst-mail3@example.ne.jp,dst-password3
そしてバッチスクリプトを作ります。
imapsync_batch.sh
#!/bin/bash
while IFS=, read src_mail src_pass dst_mail dst_pass; do
docker run --rm gilleslamiral/imapsync imapsync \
--noemailreport1 --noemailreport2 \
--host1 imap.gmail.com --port1 993 --ssl1 --authmech1 LOGIN \
--user1 "$src_mail" \
--password1 "$src_pass" \
--host2 mail22.conoha.ne.jp --port2 993 --ssl2 --authmech1 LOGIN \
--user2 "$dst_mail" \
--password2 "$dst_pass"
done < $1
エラー時の対応などは面倒なので考慮していません。
使い方は以下のように引数にCSVファイルのパスを渡してやるだけです。
$ bash imapsync_batch.sh sync_mails.csv
また、ダブルクォーテーションなどのエンクロージャがあるCSVファイルの場合は別の方法を検討してください。
転送が完了すると1件ごとに以下のようなレポートが表示されます。
ログファイルに出力して失敗してないかを後で確認するのも良いでしょう。
++++ Statistics
Transfer started on : Friday 17 June 2022-06-17 15:52:14 +0000 UTC
Transfer ended on : Friday 17 June 2022-06-17 15:55:10 +0000 UTC
Transfer time : 176.6 sec
Folders synced : 8/8 synced
Messages transferred : 408
Messages skipped : 458
Messages found duplicate on host1 : 0
Messages found duplicate on host2 : 0
Messages found crossduplicate on host2 : 458
Messages void (noheader) on host1 : 0
Messages void (noheader) on host2 : 0
Messages found in host1 not in host2 : 0 messages
Messages found in host2 not in host1 : 0 messages
Messages deleted on host1 : 0
Messages deleted on host2 : 0
Total bytes transferred : 12616379 (12.032 MiB)
Total bytes skipped : 13214907 (12.603 MiB)
Message rate : 2.3 messages/s
Average bandwidth rate : 69.8 KiB/s
Reconnections to host1 : 0
Reconnections to host2 : 0
Memory consumption at the end : 188.5 MiB (started with 163.8 MiB)
Load end is : 0.29 0.27 0.17 3/986 on 4 cores
CPU time and %cpu : 3.71 sec 2.1 %cpu 0.5 %allcpus
Biggest message transferred : 3482859 bytes (3.322 MiB)
Memory/biggest message ratio : 56.8
Start difference host2 - host1 : -866 messages, -25831286 bytes (-24.635 MiB)
Final difference host2 - host1 : -458 messages, -13214907 bytes (-12.603 MiB)
The sync looks good, all 408 identified messages in host1 are on host2.
There is no unidentified message on host1.
The sync is strict, all 408 identified messages in host2 are on host1.
Detected 0 errors
This imapsync is up to date. ( local 2.200 >= official 2.200 )( Use --noreleasecheck to avoid this release check. )
Homepage: https://imapsync.lamiral.info/
Exiting with return value 0 (EX_OK: successful termination) 0/50 nb_errors/max_errors PID 1
No log file because of option --nolog
ということで、CSVのリストを並行実行したい分だけに分割して、リモートサーバー上のtmux分割したペインや複数セッションでバッチを同時実行してやれば、完全ほったらかしで作業が進みます。
メールの総容量やユーザ数にもよりますが、規模によってはまるまる数日かかったりするので、気長に待ちましょう。
以上!
コメント