~あらすじ~


設定内容と事象を確認できた為、擬似環境を構築して検証を行うこととなった。



第1節 検証 -Verification-


擬似環境の構築の結果、事象は見事に再現した。

つまり、この問題は論理的な切り崩しが可能になったというわけだ。



第2節 原因 -Cause-


検証の結果、原因はProcmailの動作によるものだということが分かった。


以下は前回記したprocmailrcの一行である。


! "$ACCOUNT"@"$EXCHANGE"


!(エクスクラメーションマーク)はこの後に指定される全てのメールアドレスにメールを転送するという意味を持つ。
(これはManpage of PROCMAILRC に記載されている。)


しかし、この一行を突き詰めていくとその実際の動作は以下のようになる。


| /usr/sbin/sendmail -oi "$ACCOUNT"@"$EXCHANGE"


つまりProcmail自身は送信機能を持たず、レシピに従ってsendmailコマンドを再発行しているのだ。


これが為にメールの送信元はtyuukei.bou-kaisha.co.jpになり、配達不能通知(NDR)はSendmailサーバのrootに向けて送信されることになっていたわけだ。



最終節 解決 -Solution-


原因さえ分かってしまえば解決はそう難しいことではない。


要はsendmailコマンドが再発行される際に送信元のアドレスをオリジナルと同じになるように指定しなおしてやればいい。


そこで設定ファイルの内容を以下のように修正した。


が修正した部分、が追記した部分


・procmailrcの内容(修正後)
----------------------------------------------------------
FROM=$1
# 送信元アドレスを変数に格納する。


TO=$2
# 宛先アドレスを変数に格納する。


ACCOUNT=`echo $TO | sed 's/@.*//g' `
# 宛先アドレスからアカウント部だけを取り出して変数に格納する。


EXCHANGE=[172.16.1.1]
# Exchange ServerのIPアドレスを変数に格納する。


:0
* ^From.*@tokutei.com
| /usr/sbin/sendmail -i -f $FROM $ACCOUNT@$EXCHANGE , dareka@$EXCHANGE
# 特定のドメイン部を持つメールをExchangeの本来の宛先アカウントとdarekaに送信する。


:0
| /usr/sbin/sendmail -i -f $FROM $ACCOUNT@$EXCHANGE
# 上記の条件にあてはまらないメールはExchangeの本来の宛先アカウントにだけ送信する。
----------------------------------------------------------


まず、引数として渡された送信元アドレスである$1を「FROM=$1」によって変数に格納する。


次に、「!」を使う代わりに「| /usr/sbin/sendmail」を直に実行し、-fパラメータを使用して送信元アドレスをオリジナルと同じになるように指定しなおす

(ちなみに-i -fは短縮して-ifにしてもいい)


これでReturn-Path:オリジナルの送り元のままExchangeサーバに届くようになり、配達不能通知(NDR)は正常に返信されるようになった。


またひとつ世界の平和が保たれたのだ。



あとがき


このNDR返信不能事件はホントはもうちょっと推理小説風味にしたかったんだが、まぁ結果は見てもらえばわかるとおりだよキミィ。


しかも3編に分けたかったが為にムリヤリ分割したのもまた裏目に出てるワケだよキミィ。


でも、この一件であるプログラムの動作を見たときの仕組みの部分の大切さを再認識することができたので、関われて非常に良かったと思う。


原因が分かるまでは気が気じゃなかったんだけどな。