Google Groups へのメンバー移行

職場内で利用していた Mailman のメンバー等を Google Groups for Business に移行するためのスクリプトを作成しましたのでご紹介します。(2015/09/08)

一昔前にアーカイブの内容がネット上にダダ漏れになっていると話題になった Google Groups(個人向け)ですが、 今回使用する Google Groups for Business は、このサービスのドメイン対応版(for Work/Education/Government 向け)です。 デフォルトではドメイン外への情報共有が禁止されているなど、 安全側に倒した作りになっているようです。

今回のアプローチでは、 Mailman から取り出したメーリングリストの名前、説明、購読メンバー等の情報を Google スプレッドシート のセルに貼り付け、スプレッドシートに組み込んだ Google Apps Script を使って1グループずつ手作業で移行する方法を取っています。 移行時は既存の Mailman のサービスを停止せずに、 1 ML ずつゆっくりと時間をかけて移行する予定です。 このため一時的には新旧 ML が併存する形になります。 新旧 ML の識別は、内部的にはサブドメイン and/or postfix/transport 等を使うことになると思います。 ちなみに MX は(まだ)職場が建てたものを向いています。

すべての ML を一括で移行したい場合はスクリプトの改造が必要ですが、 Excel VBA and/or JavaScript を触ったことのある方なら改造は容易だと思います。

目次

経緯など

今回のスクリプトは、当初自分が使い慣れている PHP(CLI) で開発することを想定していました。 ただ、いろいろと Google 側で用意されている OAuth 2.0などの実装状況を調べてみると、 ちょっと細かいことをやろうとすると PHP ではベータ版だったりしてちょっと辛いという状況があり、 やっぱり Python か Java を選択するしかなさそうな感じでした。

しかたがないので PHP と Python の文法比較表 なんぞを作りながら Pyhton でやる方向に修正しようとしましたが、 ふと「なんでも一からゴリゴリとコードを書くのは如何か?」という素朴な疑問が。 もう少し調べてみると、Google Apps Script を使えばより簡単にできそうなことがわかったので、 開発期間の制約もあり、こちらのアプローチに方向転換しました。 Google Apps Script は文法的には JavaScript を採用しており、比較的気軽に使えます。

参考:

ちなみに、完全な全自動即時移行にまで対応したものを作ろうとするなら、 Python と サービスアカウント というアプローチがよさそうに思います。

Google スプレッドシートの作成

  1. Gmail にログインした状態で、右上のアプリボタンからスプレッドシートを選択します。
  2. 右下の + から、新しいスプレッドシートを作成します。
  3. スプレッドシートの名前を変更します。ここでは GoogleGroupsMigration としておきます。
  4. 以下のような感じで移行対象のデータを登録します。

Google Apps Script の作成

  1. ツールスクリプトエディタを開きます。
  2. 空のプロジェクトを選択します。
  3. 無題のプロジェクトをクリックして名前を変更します。 ここではシートの名前と同じ、GoogleGroupsMigration として例示しています。
  4. 移行スクリプトを gist に Mailman2Groups.gs として置いていますので、すべてコピーしてコード本体部分に貼り付けます。 元々入っていたテンプレートコードは削除して構いません。

Google Apps Script の権限設定

  1. メニューからリソースDevelopers Consoleプロジェクトを選択します。 これにより、プロジェクトが自動作成されます。
    ここで言うプロジェクトとは、Google Apps のユーザー(今回は開発者/管理者)と、 ユーザーが作成したさまざまなアプリケーションや認証情報、 および Google が提供する API のうちどの機能を有効にしたのか、 等の組合せを管理するための枠組みです。
  2. このスクリプトが現在関連付けられているプロジェクトのリンク先をクリックします。

    プロジェクトダイアログ

    利用規約の更新ダイアログが表示された場合は内容について同意します。

  3. アプリ内で使用する Google API の有効化をクリックし、 以下のAPIを有効にします。
    • Admin SDK
    • Groups Settings API(検索しないと出てきません)
  4. スクリプトに戻り、Developers Consoleプロジェクトのダイアログを閉じます。
  5. メニューからリソースGoogleの拡張サービスを選択し、 以下の API を有効にします。
    • Admin Directory API
    • Group Settings API

    Googleの拡張サービス

スクリプトの実行

  1. メニューから実行mainを選択してスクリプトを実行します。

    「承認が必要です」ダイアログ

    承認が必要ですダイアログが表示された場合は続行します。

  2. 認可リクエストのダイアログが表示されるので、許可します。

    「次の許可をリクエストしています」ダイアログ

  3. 関数を実行中ダイアログが表示され、しばらくすると消えます。
  4. 実行が終わったら、メニューの表示ログで結果を確認します。

    たとえば、筆者が所有する個人ドメインでは、以下のエラーになりました。

    Domain cannot use apis

    これは、使用したドメインが Google Apps の無償版(for Standard)であり、 Admin Directory API が対応していないからではないかと思われます。 職場の Google Apps for Education ではちゃんとうまくいきます。

付録

グループ属性の変更

Google グループにはたくさんの設定項目がありますが、 その多くはスクリプトからも設定可能と思われます。 前述のスクリプトでも、そのうち一部を変更しています。 該当の部分のソースを以下に示します。

function updateGroupSettings(groupEmail) {
  var group = AdminGroupsSettings.Groups.get(groupEmail);
//  Logger.log(JSON.stringify(group, null, 2));
  group.replyTo = "REPLY_TO_LIST";      // 返信はMLへ
  group.allowExternalMembers = "true";  // 組織外メンバーを許可
  group.isArchived = "false";           // メッセージをアーカイブしない
  AdminGroupsSettings.Groups.patch(group, groupEmail);
} // updateGroupSettings()

Google グループの管理画面(日本語対応)と Directory API( リファレンスは英語 )の機能的な対応状況がわかりづらくて困ります。 ある程度調べてまとめたものを、 Groups Settings API にまとめています。

アーカイブの移行

今回は ML のアーカイブの移行は行いません。もしやりたい場合は、Google API 側で Groups Migration APIというのが用意されていますので、対応は可能だと思います。

Mailman からのメンバーの取り出し

本スクリプトは Google Groups へのデータ投入のみであり、 Mailman からのデータの取り出しには対応していません。 Mailman からは以下のようなコマンドで取り出せます。

リスト一覧の取得
mailman:/usr/lib/mailman/bin$ sudo ./list_lists | nkf -w
購読者一覧の取得
mailman:/usr/lib/mailman/bin$ sudo ./list_members リスト名
管理者一覧の取得
mailman:/usr/lib/mailman/bin$ sudo ./list_owners リスト名

Go previous