Cloudflare Email Routing から Forward Email に移行する

転送用メールアドレスを Cloudflare Email Routing によって運用してきましたが、1年強利用してきた中で問題が出てきてしまい、Forward Email に移行することにしました。
ちなみに過去の Cloudflare Email Routing を設定した記事は以下です。

Cloudflare Email Routing の問題

移行するに至った Cloudflare Email Routing で起きた問題とは、メールエイリアスの設定できる数の上限です。

明記はされていないのですが、サブドメインを含む同一ドメインで設定できるのが200個程度までのようで、それ以上は Limit Exceeded (Code: 2018) というエラーとなり登録できませんでした。
私の場合は201個まで登録できて202個目にエラーとなっていますが、調べた感じでは210個くらい登録してエラーになった方などもいて決まった数ではなさそうでした。

全てのアカウントを受け付ける “Catch-all" を使うか複数ドメインで運用すれば回避は可能なのですが、ポリシー上やりたくなかったので、有料の Forward Email に移行することとしました。

Forward Email を選定した理由

Forward Email は無料だと転送先のメールアドレスを DNS に登録(公開)しないといけないので、今回は月額3ドルのサービスを利用しました。

メール転送なら日本国内のレンタルサーバなどでも可能なのですが、金額的にそこまで大きく変わらないのと、API が用意されておりまとめて登録が簡単に実現できたので選定しました。
他にも、以下のような理由があります。

  • 有料ならエイリアスの登録数が無制限であることを公表している
  • 転送遅延を公開していて信頼できる
  • サブドメインの登録が可能(Cloudflare も最近対応しました)
  • (元々別のドメインで利用実績があった)

Cloudflare Email Routing のエイリアス一覧を取得する

Cloudflare API のドキュメントに従い、現在登録しているエイリアスの一覧を取得します。

Cloudflare の管理画面で当該ドメインを開き、右側にある API 欄の Zone ID をコピーしておきます。
また、プロフィールページの API Tokens の項目にある Global API Key もコピーしておきます。
ちなみに Global API Key はとても強い権限なので常用するには不向きなのですが、今回は単発でリストを取得するだけなのでこちらを利用しました。

以下のスクリプトにコピーした文字列を入力して実行すると、maillist.txtファイルができあがります。

#!/bin/sh

ZONE_ID="(Zone ID)"
API_KEY="(Global API Key)"
EMAIL="(Cloudflare account mail address)"
OUTPUT="maillist.txt"

for NUM in 1 2 3 4 5
do
        curl --request GET \
          --url "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/email/routing/rules?per_page=50&page=${NUM}" \
          --header 'Content-Type: application/json' \
          --header "X-Auth-Email: ${EMAIL}" \
          --header "X-Auth-Key: ${API_KEY}" \
          | jq '.result[].matchers[].value' >> ${OUTPUT}
done

Forward Email にエイリアスを一括登録する

こちらも API を利用してまとめて登録します。
ちなみに認証情報(-uオプションで渡す情報)はログインしている状態で API ドキュメントページを見ると、例のところに既に埋まっていますのでそのまま利用できます。

以下のスクリプトの(ドメイン名)(転送先のメールアドレス)(認証情報)を書き換えて実行するとまとめて登録されます。
(ドメイン名)は対象エイリアスのドメイン名です。

#!/bin/sh

# maillist.txt の @ より後のドメイン名部分を削除します
MAILLIST="`cat maillist.txt | sed -e 's/"//g; s/@(ドメイン名)//'`"

for MAILADDR in ${MAILLIST}
do
        curl -X POST https://api.forwardemail.net/v1/domains/(ドメイン名)/aliases \
                -d "name=${MAILADDR}" \
                -d 'recipients=(転送先のメールアドレス)' \
                -u (認証情報、最後のコロンまで)
done

DNS の登録を変更する

Cloudflare を向いている MX レコードを削除して Forward Email の MX レコードを追加します。
また TXT レコード(SPF)の変更もお忘れなく。
これであっさりと移行が完了しました。

まとめ

どちらも API が提供されているので、移行が非常にスムースでした。
エイリアス数を200個も作らないよという方や Catch-all で問題ないよという方なら、Cloudflare は無料で使えるのでおすすめです。

画像は AI が考える、メールサービスの移行です。

technical

Posted by yokky