【Postfix / Dovecot】ドメイン変更時に旧アドレスを殺さず新ドメインへメール移行する実践ガイド

この記事は約6分で読めます。
この記事が役立ったらブックマーク! あとで読み返したり、環境構築時のリファレンスに活用できます
B! はてなブックマークに追加

Webサイトのドメイン変更やリブランディングを行う際、避けて通れないのが「メールアドレスの移行」です。
旧ドメイン宛ての重要連絡を取りこぼさないよう一定期間残しつつ、新ドメインでの送受信をメインに切り替える「新旧並行運用」を Postfix と Dovecot の環境で構築しました。
実際に構築した際の設定手順と、現場で引っかかりやすい落とし穴をまとめます。

構成の前提条件

  • OS: Linux VPS (Ubuntu / Debian 系)
  • MTA / MDA: Postfix, Dovecot
  • 旧ドメイン: old-domain.com(移行期間中も送受信を維持)
  • 新ドメイン: example.com(今後メインで使用)
  • 要件:
    • 旧ドメイン宛てのメールはこれまで通り受信する
    • 新ドメイン宛てのメールは、旧ドメインと混ざらないよう独立したメールボックスで管理する
    • SPF / DKIM / DMARC / SSL(TLS) を新旧両方で正常に通す

1. Postfix: 新旧両ドメインの受信許可

まずは Postfix に「新旧どちらのドメイン宛てメールも受け取る」よう指示します。

/etc/postfix/main.cf の mydestination を確認し、両方のドメインを含めます。

Plaintext
mydestination = $myhostname, example.com, old-domain.com, localhost.localdomain, localhost

反映:

Bash
sudo systemctl reload postfix

2. メールボックスの分離(virtual_alias_maps)

info@旧ドメイン と info@新ドメイン のようにユーザー名部分が同一のアドレスを運用する場合、何も設定しないと Linux の同じローカルユーザー(info)に配送され、メールが混ざってしまいます。
独立したメールボックスを持たせるため、新ドメイン専用の Linux ユーザーを作成し、仮想エイリアスで宛先を振り分けます。

(1) 新ドメイン用の Linux ユーザー作成

Bash
sudo adduser infoexample

※対話プロンプトでパスワードを設定します(これがメールソフトのログインパスワードになります)。

(2) 配送マップ(virtual)の作成

/etc/postfix/virtual を編集します。

Plaintext
# 旧ドメイン宛ては既存の info ユーザーへ
info@old-domain.com    info

# 新ドメイン宛ては新設した infoexample ユーザーへ
info@example.com       infoexample

(3) マップの反映

Bash
sudo postmap /etc/postfix/virtual
sudo postconf -e "virtual_alias_maps = hash:/etc/postfix/virtual"
sudo systemctl reload postfix

3. Dovecot: 複数ドメインの SSL 証明書振り分け(SNI)

新旧2つのドメインが存在する場合、メールクライアント(Thunderbirdなど)が接続するドメインと SSL 証明書の名前(CN/SAN)が一致しないとセキュリティ警告が出ます。
Dovecot の SNI(Server Name Indication) 機能を使い、接続先ホスト名に応じて証明書を出し分けます。

/etc/dovecot/conf.d/10-ssl.conf に以下のような local_name ブロックを追加します。

Plaintext
# デフォルト証明書(旧ドメイン)
ssl_cert = </etc/letsencrypt/live/old-domain.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/old-domain.com/privkey.pem

# 新ドメイン接続時用の証明書
local_name example.com {
  ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem
  ssl_key = </etc/letsencrypt/live/example.com/privkey.pem
}

反映:

Bash
sudo systemctl reload dovecot

ハマりどころ:Linux の予約 UID による認証拒否

mail@example.com のようなアドレスを作ろうとして、Linux に初期から存在するシステムユーザー mail(UID: 8)にパスワードを設定して Dovecot で認証しようとすると、認証エラーで弾かれます。

Dovecot はセキュリティ保護のため、初期設定で UID 1000(または 500)未満のシステム予約アカウントでのログインを拒否する仕様(first_valid_uid)になっているためです。

  • 解決策: システムアカウントを直接使わず、一般ユーザー(例: mailuser)を作成した上で、/etc/aliases または /etc/postfix/virtual で mail: mailuser とエイリアスを張って配送するのが安全で確実です。

クライアント側(Thunderbird)での設定例

  • メールアドレス: info@example.com
  • 受信サーバー(IMAP):
    • ホスト名: example.com(証明書に含まれるドメイン名に合わせる)
    • ポート: 993 / SSL/TLS
    • ユーザー名: infoexample(作成した一般ユーザー名)
  • 送信サーバー(SMTP):
    • ホスト名: example.com
    • ポート: 587 / STARTTLS
    • ユーザー名: infoexample

まとめ

  1. mydestination で両ドメインの受信を許可
  2. アカウント名が被る場合は virtual_alias_maps で Linux ユーザー単位に振り分け
  3. 証明書エラーは Dovecot の SNI で接続ドメインごとに解決
  4. mail などの予約ユーザー名は一般ユーザー+エイリアスで安全に運用

このステップを踏むことで、ダウンタイムを一切発生させず、送受信ボックスも綺麗に分けた状態でスムーズに新ドメインへ移行できます。

コメント

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