受信メールをプログラムに渡すには

(2007.7.18 古い文書をまとめ直し、2007.8.1 新規公開。)

Webアプリケーションでは、ユーザの存在確認や、ユーザの投稿の利便性から、メールをプログラムで処理したいことがある。

sendmail, qmail, postfixでは、それぞれやり方が微妙に異なる。簡単にまとめてみた。

まず最初に基本的な配送ルールを解説し、その後で拡張アドレス (extension addresses) についても解説する。

sendmail

sendmail では、~/.forward ファイルでメールを処理するプログラムを指定する。.forward ファイルには、次のいずれかの形式でプログラム(と引数)を書く。

| program
"| program arg"
|"program arg"

引数を与える場合は、ダブルクォーテーションで括る必要がある。

1通のメールにつき、プログラムが一つ起動される。複数のメールが並列に処理されるかは不明。

プログラムでは、標準入力から読んでメールデータを得る。

何か処理したとして、配送プログラムは、終了するときに /usr/include/sysexits.h で定義されるエラーコードを返して終了する。

sendmailは、プログラムが終了したのを検知して、メール配送の完了を知る。

qmail

qmailは、機能によってプログラムが細分化されている。メールを受信したあとは、qmail-local が配信する。

設定は、~/.qmail ファイルに記述する。

|program arg ...

qmail-localは、sh -c program というコマンドを、ホームディレクトリで実行する。

qmailが起動するプログラムの終了コードは、次のいずれかにする。

  • 0 成功
  • 99 成功、ただし以降のメールは無視すべき。
  • 100 配送に失敗。(hard error)
  • 111 配送に失敗。ただし、しばらく経って再試行すべき。(soft error)

次の値でもhard error扱いになる。詳しくは man qmail-command を参照。

  EX_USAGE EX_DATAERR EX_SOFTWARE EX_PROTOCOL EX_NOPERM

postfix

postfixはsendmail互換の ~/.forward ファイルをサポートする。ダブルクォーテーションは「|」の後ろ。

|"command arg ..."

プログラムが起動されるとき、カレントディレクトリは、ホームディレクトリになる。起動されるプログラムは並列に実行される、らしい。

呼び出されたプログラムの終了コードは、/usr/include/sysexits.h で定義されるものを使う。

  • 67 (EX_NOUSER) => user (address) unknown
  • 0 (EX_OK) => 成功

アドレス拡張

Postfix, qmailでは、メールアドレスの後ろに識別子を付けて、識別子ごとに、受信メールを異なるプログラムに配ることができる。

postfix

postfixのグローバルな設定ファイル (Fedora 7では /etc/postfix/main.cf) で、アドレス拡張の記号を指定する。例えば、"+" に指定されていると、

recipient_delimiter = +
name+foo@hostname という形式のメールアドレスをサポートする。

配送プログラムの指定は、~/.forward+foo ファイル (.forward + recipient_delimiter + 識別子) でする。

qmail

qmailでは、アドレス拡張の記号は "-" になっている。username-anything という形式。

設定は、~/.qmail-anything ファイルに記述する。~/.qmail-anything がないときは ~/.qmail が使われる。詳しくは、man dot-qmail を参照。

外部リンク

Postfixのぺーじ−ホーム
Postfixのドキュメントの邦訳、設定方法など。
qmailの動作
qmailの内部での各プログラムのつながりなど。
qmailを用いたメールサーバの構築
メール配送の仕組み、sendmail、qmailについて