Linux

imapsyncでメールをGoogle WorkspaceのGmailから引っ越しする

先日、GoogleWorkspaceのGmailの多数アカウントのメールデータをConoHaのレンタルサーバー『ConoHa WING』に付属するメールサービスへ移行するという作業をしました。
その方法について説明します。

スポンサーリンク

あらまし

今まで個人ユーザに重宝されてきたG Suite無償版が2022年6月を以て有料化しました。
その後、個人利用に関しては引き続き無料利用が可能とのアナウンスがありましたが、営利目的で利用している場合は有料プランへの移行は免れません。

無償版G Suiteは個人・非営利目的なら継続利用可能に
2022年6月27日をもって廃止されることが決定している無償版G Suiteについて、新たに「個人利用・非営利目的」であれば、今後も継続して利用できることが明らかになりました。すでに有償版Google Workspaceへアップデートした人...

知人の会社も従業員のメール用にGoogle Workspaceを利用していましたが、ユーザー単位の料金が利用度に対して割に合わない(Business Starterで630円/ユーザー)ので、比較的低価格なConoHa WING(36ヶ月契約でユーザー数に関わらず月額換算660円)のメールサービスに移行することにしました。
ConoHa WINGはWebサーバーの方がメインですが、容量は300GB(1アカウント10GBまで)までと他社と比較してかなり大容量です。

imapsyncとは

imapsyncはIMAPのメールを別のメールボックスへ転送できるコマンドラインツールです。
無料で利用でき、Gmailにも対応しています。

Official imapsync migration tool ( release 2.264 )
Imapsync is an IMAP sync tool. It syncs all folders from one mailbox to another, both anywhere on the Internet or in you...

個人でメールの転送をする場合は、Thunderbirdのようなメールクライアントで橋渡しをすれば済みますが、組織における大量のユーザを処理するのには手間が掛かりすぎるので、コマンド一発で実行できるimapsyncを使うことにしました。
Dockerイメージも用意されているので、インストール不要の使い捨てで実行できます。

ラベルの扱いをどうするか

Gmailは『ラベル』というものが存在しており、これについて考える必要があります。
対するIMAPにもフォルダという概念がありますが、まったく同じものではありません。

Gmailにおけるラベルとフォルダの違い
一般的なメールクライアントではフォルダと呼ばれるメールを格納する入れ物を作成してメールを分類整理するのが一般的ですがGmailではフォルダではなくラベルというものを使用してメールを分類整理します。ここではラベルとフォルダの使い方の違いについ...

要するに、同一のメールが複数のフォルダに存在する可能性があります。
そこで、IMAPへ転送する際の処理として複数のラベルを持つメールをどう扱うかという判断が必要になってきます。
imapsyncではデフォルトで各ラベル名のフォルダにメールがコピーされるようになっています。
その為、うっかりこのまま転送してしまうと、「Gmailでは5GBだったのに移行したら20GBになってしまった!」なんてこともあり得ます。

それを回避するために —skipcrossduplicatesという重複回避オプションが用意されていて、そのルールも多少融通が利くようになっています。

https://imapsync.lamiral.info/FAQ.d/FAQ.Gmail.txt

今回は—skipcrossduplicatesを使うことにしました。こちらは—gmail1オプションに含まれています。

『安全性の低いアプリのアクセス』をオンにする必要がある

見出しの通りなのですが、GmailにIMAPアクセスするにはこの項目をオンにしなくてはいけません。

安全性の低いアクセス

↑各自のGoogleアカウントからアクセスする必要がある

ですが、管理者権限でこの部分を操作することができず、各ユーザーに設定してもらわなければなりません。
しかも、2段階認証プロセスを有効にしていると、この項目が設定できませんので、一時的に解除してもらう必要があります。
ここがちょっと厄介なところではありますね。

総実行時間が結構かかる問題

IMAPの送受信速度はそこまで速くありませんので、大量のアカウントを転送する際にシーケンシャルに処理しているだけでは、回線の帯域もPCのリソースもかなり余してしまい、効率が良くありません。
さらに言えば、そんな軽い処理のためにPCの電源を入れっぱなしにするのは電気代の無駄になります。

VPS上でtmuxを使う

今回はimapsyncの実行には普段から使っているVPSを利用することにしました。
これならばもともと立ち上げっぱなしなので電気代は関係なくなります。
また、tmuxを使って並列実行すれば効率が何倍にもなりますし、ターミナルを切断しても処理は継続しますので、見張っている必要はなくなります。

tmuxを必要最低限で入門して使う - Qiita
#はじめに今回は、端末多重化ソフトウェアのtmuxを学習していきます。これにより、ターミナル画面を複数開いたり、ターミナルソフト独自のショートカットキーを覚えてペインを分けたりするみたいな非効率的…

Gmailの帯域制限

重量級のメールボックスは転送するのにただでさえかなり時間がかかりますが、GmailのIMAPダウンロードは1日の転送制限が2500MBとなっており、これにひっかかると切断されてしまう可能性があります。

Gmail の帯域幅制限 - Google Workspace 管理者 ヘルプ
すべての Google Workspace アカウントには、Google のシステムとアカウントの健全性と安全性を確保するための Gmail の帯域幅制限が設定されています。 管理者は、管理コンソールの リストで、Gmail の帯域幅の上限...

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
surface0
管理人
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分割したペインや複数セッションでバッチを同時実行してやれば、完全ほったらかしで作業が進みます。
メールの総容量やユーザ数にもよりますが、規模によってはまるまる数日かかったりするので、気長に待ちましょう。

以上!

スポンサーリンク
管理人

システムえんじにゃー🐈
趣味はエレキギターなど。作曲したい。
WoWs/プリコネ
記事に関する質問はお気軽にどうぞ。

surface0 (さーふぇす)をフォローする
surface0 (さーふぇす)をフォローする
Rain or Shine

コメント

タイトルとURLをコピーしました