postfixでメールアプリケーションを扱うときの注意事項

いいめものように、メールを受け取ってアレコレするメールアプリケーションを書くことはよくあるかと思います。

メールサーバとしてpostfixを使うと、こんな具合で実現できます。

#cat /etc/aliases
:
test:"|/var/mailApp/test.rb"

test@example.comでメールを受け取ったら/var/mailApp/test.rbを起動する、という具合です。

それはいいのですけど、この状態でtest.rbでエラーが起きると、メール送信者宛にバウンスメッセージというのが送付されます。

This is the Postfix program at host snares.example.com.
:
The Postfix program
>test@example.com< : Command died with
status 1: "/var/MailApp/mailserver/test.rb". Command output:
/usr/lib/ruby/1.8/logger.rb:518:in `initialize': Permission denied -
/var/MailApp/mailserver/../log/MailServer.log (Errno::EACCES)
from /usr/lib/ruby/1.8/logger.rb:518:in `open'  from
/usr/lib/ruby/1.8/logger.rb:518:in `open_logfile'  from
/usr/lib/ruby/1.8/logger.rb:487:in `initialize'  from
/usr/lib/ruby/1.8/logger.rb:263:in `new'  from
/usr/lib/ruby/1.8/logger.rb:263:in `initialize'  from
/var/MailApp/mailserver/../common.rb:42:in `new'  from
/var/MailApp/mailserver/../common.rb:42  from

!!!エンジニアにとっては背筋の凍り付くような内容です。メールアプリケーションのファイル構成から使っているモジュール、自分がどんなミスをしたかまで送信者に筒抜けになってしまいます。

とりあえず、test.rbの内容をこうしましょう。

begin
 元のコード
rescue => e
exit(-1)
end

これで、test.rbがエラーを外にはくことはなくなるので、バウンスメールの内容も、ずいぶん穏当なものになります。

>test@example.com< : Command died with
status 255: "/var/MailApp/mailserver/test.rb"
Action: failed
Status: 5.0.0
Diagnostic-Code: X-Postfix; Command died with status 255:
"/var/MailApp/mailserver/test.rb"

ちなみに、posfix 2.3から、バウンスメールの内容をカスタマイズできるようになるらしいです。

Postfix manual – bounce(8)



メールサーバのバージョンアップが待ち遠しいなんて、久しく味わっていない感覚です。