以前にPostfixで受信したメールを別メールに転送する(エイリアス)でエイリアス設定して別メールに送信するということをしました。
しかし、この方法には1つ問題があります。
例えば、下図のようにメール転送を設定した場合、foo_contact@gmail.comのメールヘッダ(一部抜粋)は以下のようになります。
※ [Postfix]SPFレコードを設定して携帯へメールを送信できるようにする でfoo.com
に対して101.102.103.104
のIPアドレスでSPFを既に設定しているとします。
Delivered-To: foo_contact@gmail.com
Received: by 10.220.142.15 with SMTP id o15csp75634vcu;
Sun, 7 Sep 2014 23:55:01 -0700 (PDT)
X-Received: by 10.68.233.68 with SMTP id tu4mr17511906pbc.65.1410159300902;
Sun, 07 Sep 2014 23:55:00 -0700 (PDT)
Return-Path: <sender_hoge@gmail.com>
Received: from mail.foo.com (foo.com. [101.102.103.104])
by mx.google.com with ESMTP id x2si9182086pdj.5.2014.09.07.23.55.00
for <foo_contact@gmail.com>;
Sun, 07 Sep 2014 23:55:00 -0700 (PDT)
Received-SPF: none (google.com: sender_hoge@gmail.com does not designate permitted sender hosts) client-ip=101.102.103.104;
Authentication-Results: mx.google.com;
spf=neutral (google.com: sender_hoge@gmail.com does not designate permitted sender hosts) smtp.mail=sender_hoge@gmail.com
SPF認証がneutralになってしまいました。
なぜこういうことになったのかと、よく考えれば分かることなんですが、SPF(DNSのTXTレコード)で設定したのは 「foo.com
というドメインから送信されたメールのIPアドレスが101.102.103.104
だった場合に有効」 というものでした。
しかし、今回のメールのエンベロープFrom(本当の送信者)は sender_hoge@gmail.com
であり、gmail.com
というドメインから送信されたメールのIPアドレスが101.102.103.104
と一致しなかったのが原因です。
ググると、下記のようなページがありました。
メール転送時にSPF認証が失敗する
sender_canonical
を上手く使って、メール転送する際に、エンベロープFromをfoo.com
に書き換えればうまくいきそうです。
早速やってみました。
$ sudo -e /etc/postfix/main.cf
sender_canonical_classes = envelope_sender
sender_canonical_maps = hash:/etc/postfix/sender_canonical,regexp:/etc/postfix/sender_canonical.regexp
[Postfix]SPFレコードを設定して携帯へメールを送信できるようにする ですでに、sender_canonical
の設定をしているので追記します。
次にsender_canonical.regexp
を作成します。
$ sudo -e /etc/postfix/sender_canonical.regexp
/@([a-z0-9_+\-\.]+)$/ @foo.com
エンベロープFromの@
より後ろのドメイン部分をfoo.com
に置き換えるように設定しました。
postmap
コマンドでデータベースを作成し、Postfixを再起動すれば完了です。
$ sudo postmap /etc/postfix/sender_canonical.regexp
$ sudo service postfix reload
設定後、contact@foo.com
にメール送信すると、メールヘッダ(一部抜粋)は以下のようになりました。
Delivered-To: foo_contact@gmail.com
Received: by 10.220.142.15 with SMTP id o15csp76665vcu;
Mon, 8 Sep 2014 00:06:50 -0700 (PDT)
X-Received: by 10.66.219.100 with SMTP id pn4mr2676130pac.13.1410160010027;
Mon, 08 Sep 2014 00:06:50 -0700 (PDT)
Return-Path: <sender_hoge@foo.com>
Received: from mail.foo.com (foo.com. [101.102.103.104])
by mx.google.com with ESMTP id t9si15990994pdp.223.2014.09.08.00.06.49
for <foo_contact@gmail.com>;
Mon, 08 Sep 2014 00:06:49 -0700 (PDT)
Received-SPF: pass (google.com: domain of sender_hoge@foo.com designates 101.102.103.104 as permitted sender) client-ip=101.102.103.104;
Authentication-Results: mx.google.com;
spf=pass (google.com: domain of sender_hoge@foo.com designates 101.102.103.104 as permitted sender) smtp.mail=sender_hoge@foo.com
SPF認証がpass
になりました。
注目してもらいたいのが、エンベロープFrom(この場合Return-Path
)がsender_hoge@gmail.com
からsender_hoge@foo.com
に置換されていることが分かります。
最後に
Postfixでエイリアスでメール転送する際にエンベロープFromに気をつけることと、その対処方法を紹介しました。
僕も仕事で同じ現象が起きてメールが送れなくなってしまったので、今後は気をつけたいと思います。