本日も乙

ただの自己満足な備忘録。

エイリアスでメール送信するときに気をつけること(エンベロープFromの書き換え)

以前にPostfixで受信したメールを別メールに転送する(エイリアス)エイリアス設定して別メールに送信するということをしました。

しかし、この方法には1つ問題があります。
例えば、下図のようにメール転送を設定した場合、foo_contact@gmail.comのメールヘッダ(一部抜粋)は以下のようになります。
[Postfix]SPFレコードを設定して携帯へメールを送信できるようにするfoo.comに対して101.102.103.104IPアドレスSPFを既に設定しているとします。

postfix_alias

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に気をつけることと、その対処方法を紹介しました。
僕も仕事で同じ現象が起きてメールが送れなくなってしまったので、今後は気をつけたいと思います。