個人用サーバに立てたPostfixで受信したメールをGmailに転送してGmailで読む(様々な宛先のメールをGmailに集めて読みたい、とか)ようなケースにおいて、転送によって生じるSPFレコードの不一致のために、Gmailが転送メールを受け付けないことがあります。例えば、下記のページで説明されているような場合です。
さくらインターネットのサーバーからGmailへ転送したメールが不達となる場合 https://help.sakura.ad.jp/notification/n-2595/#04
不達になったときのエラーメールは送信者に返るため、送信者から別の手段で不達になったことを教えてもらわなければ、転送が失敗したことにも気づけない可能性があります。
この問題に対する解決策として、下記のサイトで説明されているように、転送をおこなうサーバで ”Envelope from” を書き変えるという方法があり、これまではその方法を採用してきました。
メール転送(エイリアス)SPFのSoftFailへ対応|Postfix https://rin-ka.net/postfix-envelope-from/
その後、Postfixにはpostsrsdという、SRS(Sender Rewriting Scheme https://ja.wikipedia.org/wiki/センダー・リライティング・スキーム)を実装してくれるプログラムがあることを知り、実装してみました。SRSに従えば、アドレス偽装などの問題も解決できます(参考:http://www.open-spf.org/SRS/)。Ubuntuの場合はaptでインストールし、main.cfに設定を追記するだけです(参照:https://github.com/roehling/postsrsd)。
環境:Ubuntu 20.04.5 LTS、Postfix 3.4.13、Postsrsd 1.5-2
% sudo apt install postsrsd
% sudo vi /etc/postfix/main.cf
+ sender_canonical_maps = tcp:localhost:10001
+ sender_canonical_classes = envelope_sender
+ recipient_canonical_maps = tcp:localhost:10002
+ recipient_canonical_classes= envelope_recipient,header_recipient
% sudo systemctl enable postsrsd
% sudo systemctl start postsrsd
% sudo systemctl reload postfix
実際に転送されてきたメールを確認します。
Received-SPF: pass (google.com: domain of srs0=ro3d=2z=[example.com(転送前の宛先ドメイン)]=[user1(ユーザ名)]@[example.net(転送を行うサーバのドメイン)] designates xxx.xxx.xxx.xxx as permitted sender) client-ip=xxx.xxx.xxx.xxx;
上記のように、宛先のメールアドレスのドメイン部分(この例では example.com)が、転送をおこなうサーバのドメイン(example.net)に書き換えられていれば、SPFレコードの不一致がおこらず、SPFがpass判定になります。