Gmailからの転送でメールループのエラーで転送できない、という問い合わせがあって、MTAだけで完結しないメールループというのを初めて経験したのでメモ。
Gmailのアカウントから自メールアドレスへ転送設定をすると、転送先サーバからメールループのエラーメールが返って来るという状況でした。
確かに、Gmailから転送しようとされてきたメールに対しては「mail forwarding loop」でbounceしているというログが残っていました。
しかし、設定やログ見てもGmailには転送している記録はないため、メールループにはならないはず、と思えました。
postfixはどうやってループを検出しているんだろう?と思ってぐぐったところ「Deliverd-To」フィールドの内容と送付先が同じ場合にループ判定しているということがわかりました。
[postfix-jp: 783] mail forwarding loop
local(8)デーモンは、配送先のアドレスがすでにDelivered-To:にあるメッセージを"mail forwarding loop"としてbounceします。
ということは、どこかで「Deliverd-To」フィールドを追加してしまっている?と思って、エラーメールの内容を良く確認したところ、確かにDeliverd-Toフィールドに転送先のアドレスが書かれていました。
これがなぜついてるかはすぐにわかりました。Deliverd-Toのすぐ上に「X-Gmail-Fetch-Info」フィールドが付いていたので。
Gmailでは、他のメールサーバからPOP等でメールを取ってくるという設定が出来るのですが、これで取得したメールについては「X-Gmail-Fetch-Info」と「Deliverd-To」フィールドが追加されるようです。
つまり、あるメールサーバからGmailでPOPで取得している上に、そこ宛に転送もしようとしているので、だからループになるからエラーになった、というわけです。
これだと、MTAだけでループは完結せず、途中にPOP3サーバなどのMRAが介在してループが完成します。
なので、メールサーバのログを眺めただけでは、なぜループが発生していると言われるのかわからない、という状況になります。