Postfix でメールアドレスのドメイン名を変更した話
ふと、メールアドレスのドメイン名を変更しようかと考えた。具体的に言うと、「mail.magic-object.mydns.jp」から「magic-object.com」へと変更しようかと考えたのだ。
だが、dovecot と連携している関係上、そう簡単な話ではなかった。
dovecot はメールをドメイン名で管理している
dovecot には、基本的にはドメイン名を指定する設定は無い。例外的に SSL の公開キーと秘密キーを指定しているくらいだ。
だが調査してみると、メールの格納場所がドメイン名「mail.magic-object.mydns.jp」で格納されていた。勿論、ディレクトリ名を変更すれば問題無い気もするが、全てのメーラー(Thunderbird や Geary など)の設定を変更するのは面倒臭い。 そこで、Postfix のエイリアス機能とリライト機能を利用して、見せかけのメールアドレスを変更する事にした。
認証系を確認
「main.cf」では「dovecot」認証になっていた。つまり、imap などの認証と同じという事だ。
ここはイジる必要はなさそうだ。
smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
メールの転送方式を確認
「main.cf」では、「dovecot-lmtp」になっていた。LMTP は同じマシン内での転送なので、チェックは非常に緩い。しかも UNIX ドメインソケットである。
mailbox_transport = lmtp:unix:private/dovecot-lmtp
ドメイン名を変更
shortdomain = magic-object.com
myhostname = $shortdomain
mydomain = $shortdomain
myorigin = $myhostname
受取人指定
local_recipient_maps = mysql:/etc/postfix/mysql-recipients.cf
参考:http://www.postfix-jp.info/trans-2.2/jhtml/mysql_table.5.html
SQL接続ファイル(今回は「/etc/postfix/mysql-recipients.cf」)内容は大体、次の様になる。
hosts=unix:/var/lib/mysql/mysql.sock
user=接続ユーザー
password=パスワード
dbname=データベース名
query= SELECT ... FROM ... WHERE email = '%s'
こんな感じなので、SQL 文は結構自由にかけるし、必要があれば UNION なんかを使ってもOKだ。
因みに「%s」に入ってくる文字列は、今回はメールアドレスが入って来る。
ここで返却する値なのだが、条件に一致した場合は「ACCEPT」とか「OK」とかメールアドレスとか色々だが、一致しない場合は何も返却しないのがポイント。
今回は受取人なので、「ユーザー名@mail.magic-object.mydns.jp」か「ユーザー名@magic-object.com」のメールアドレスを返却する事にした。
エイリアス名の指定
virtual_alias_maps = mysql:/etc/postfix/mysql-aliases.cf
ここでのポイントは「ユーザー名@magic-object.com」を受けとると「ユーザー名@mail.magic-object.mydns.jp」を返す事だ。つまり、「ユーザー名@magic-object.com」宛のメールを「ユーザー名@mail.magic-object.mydns.jp」宛に強制的に送り付ける事が出来る。
※ この場合、メールの「From:」は変更されない。
メールの流れ
今回の指定で、メールには2つの流れが出来た。
- 「ユーザー名@mail.magic-object.mydns.jp」に来たメールを dovecot に送信。
- 「ユーザー名@magic-object.com」に来たメールを「ユーザー名@mail.magic-object.mydns.jp」宛として強制的に dovecot に送信。
送信側の設定
「main.cf」の送信元のリライトを行う。
※ この場合、メールの「From:」は変更される。
local_header_rewrite_clients = permit_mynetworks
sender_canonical_maps = mysql:/etc/postfix/mysql-canonical_maps.cf
この場合、「/etc/postfix/mysql-canonical_maps.cf」に「ユーザー名@mail.magic-object.mydns.jp」が来るので、「ユーザー名@magic-object.com」を返す様にする。
※ sender_canonical_maps の説明ではドメイン名だけが来るかと思ったが、実際はメールアドレスだった。
何なら SQL 文は次の様に書いても良い。(必要なのはユーザー名だけなので)因みに「%u」に入ってくる文字列はユーザー名である。
query= SELECT CONCAT( '%u', '@magic-object.com' )
これで送信されるメールは「ユーザー名@magic-object.com」になった。
結論
内部的なドメインは「mail.magic-object.mydns.jp」のままだが、外部的には「magic-object.com」に見える。 これは一種のドメイン偽装なのではなかろうか?
参考:カノニカルアドレスマッピング、Postfix設定パラメータ