Postfixからメール送信するとSPFが正しく動作する(SPF=Pass)。しかし、受信メールを外部に転送するとSPF認証に失敗「SPF=SoftFail」する。理由と対策方法をしりたい。
メール送信の時はSPF認証が正しく動作するか、しっかり確認します。しかし、メール受信は送信よりもチェックが甘くなりがちです。私の場合は「受信できたから大丈夫!」って思ってしまいます。
ふと、aliases(エイリアス)を利用したメール転送のメールを確認したら、SPFがSoftfail(認証外送信と判断)している。
原因と対策方法をまとめます。
転送時のメール送信でSPFがSoftfailする理由
メールの仕組み
理由が判れば簡単なのですが概念が難しい。メールヘッダーには多くのパラメーターがありFROM(送信者),TO(受信者)の情報が複数に記載されています。
パラメーターは、用途によって意味が微妙に違います。
メールの送信者・受信者の目線から考えると、メールが届いた経路はどうでもよく、From,Toさえ認識できれば事足ります。
しかし、経路を制御する側(管理者)は、どのように配送されたかを正しく認識することが重要です。From,Toの情報はぶっちゃけ、どうでもよい。
メール転送時 SPF認証の挙動
サーバー管理者の視点だと、どうしても自分が管理しているサーバーからメール送信するので、自ドメインのSPFを利用すると思ってしまいます。
しかし、転送する場合のFromは転送前のドメインです。つまり、自ドメインのSPFは関係ない。
- ① From:gmail To:mydomain でメール送信する
- ② mydomain が gmail のSPF認証を行う
- ③ From:gmail To:yahoo でメール送信する
- ④ yahoo が gmail のSPF認証を行う
関連記事 迷惑メール判定されないSPF設定
転送時にSPFをPassさせる設定|Postfix
Envelope fromを書き換える
メール転送の場合は、Fromは転送前のドメインです。そのためSPF認証を転送するサーバーで制御することはできません。
この問題を解決するためのパラメーターが「Envelope from」です。Envelope fromパラメータを書き換えると、SPF認証の確認先が自ドメインに変わります。
設定ファイル main.cf の変更
Envelope fromの設定変更は簡単です。
# vi /etc/postfix/main.cf
sender_canonical_classes = envelope_sender sender_canonical_maps = hash:/etc/postfix/sender_canonical
これで指定ファイルに記載されたルールに従ってEnvelope Fromを制御します。
# vi /etc/postfix/sender_canonical
/@([a-z0-9_+\-\.]+)$/ @[mydomain.com]
設定ファイルをハッシュ化させます。
# postmap /etc/postfix/sender_canonical
あとは、設定を反映させるだけです。私の利用している環境はCentOSです。環境に合わせてサービスを再読み込みさせてください。
# systemctl reload postfix
あとは、メールヘッダーを確認し通信状況を確認しましょう。