(2007.7.18 古い文書をまとめ直し、2007.8.1 新規公開。)
Webアプリケーションでは、ユーザの存在確認や、ユーザの投稿の利便性から、メールをプログラムで処理したいことがある。
sendmail, qmail, postfixでは、それぞれやり方が微妙に異なる。簡単にまとめてみた。
まず最初に基本的な配送ルールを解説し、その後で拡張アドレス (extension addresses) についても解説する。
sendmail では、~/.forward ファイルでメールを処理するプログラムを指定する。.forward ファイルには、次のいずれかの形式でプログラム(と引数)を書く。
| program "| program arg" |"program arg"
引数を与える場合は、ダブルクォーテーションで括る必要がある。
1通のメールにつき、プログラムが一つ起動される。複数のメールが並列に処理されるかは不明。
プログラムでは、標準入力から読んでメールデータを得る。
何か処理したとして、配送プログラムは、終了するときに /usr/include/sysexits.h で定義されるエラーコードを返して終了する。
sendmailは、プログラムが終了したのを検知して、メール配送の完了を知る。
qmailは、機能によってプログラムが細分化されている。メールを受信したあとは、qmail-local が配信する。
設定は、~/.qmail ファイルに記述する。
|program arg ...
qmail-localは、sh -c program というコマンドを、ホームディレクトリで実行する。
qmailが起動するプログラムの終了コードは、次のいずれかにする。
次の値でもhard error扱いになる。詳しくは man qmail-command を参照。
EX_USAGE EX_DATAERR EX_SOFTWARE EX_PROTOCOL EX_NOPERM
postfixはsendmail互換の ~/.forward ファイルをサポートする。ダブルクォーテーションは「|」の後ろ。
|"command arg ..."
プログラムが起動されるとき、カレントディレクトリは、ホームディレクトリになる。起動されるプログラムは並列に実行される、らしい。
呼び出されたプログラムの終了コードは、/usr/include/sysexits.h で定義されるものを使う。
Postfix, qmailでは、メールアドレスの後ろに識別子を付けて、識別子ごとに、受信メールを異なるプログラムに配ることができる。
postfixのグローバルな設定ファイル (Fedora 7では /etc/postfix/main.cf) で、アドレス拡張の記号を指定する。例えば、"+" に指定されていると、
recipient_delimiter = +name+foo@hostname という形式のメールアドレスをサポートする。
配送プログラムの指定は、~/.forward+foo ファイル (.forward + recipient_delimiter + 識別子) でする。
qmailでは、アドレス拡張の記号は "-" になっている。username-anything という形式。
設定は、~/.qmail-anything ファイルに記述する。~/.qmail-anything がないときは ~/.qmail が使われる。詳しくは、man dot-qmail を参照。