いいめものように、メールを受け取ってアレコレするメールアプリケーションを書くことはよくあるかと思います。
メールサーバとして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)
メールサーバのバージョンアップが待ち遠しいなんて、久しく味わっていない感覚です。
すっごいいまさらですけど、もっといい方法を教えていただきました。
エラーを抑制するとか | 眠る開発屋blog
test:”|/var/mailApp/test.rb 1>/dev/null 2>&1″
そういわれて見りゃそうですよね。