2006年06月26日
届いたメールの料理の仕方 (1) 〜qmail編〜
qmailではdot-qmailと呼ばれるファイルで届いたメールの処理を制御できます。典型的なdot-qmailファイルは、ユーザのホームディレクトリの下の~/.qmailや~/.qmail-XXXですね。
今回は、dot-qmailを使う上で知っておきたいことをTIPSを交えて紹介したいと思います。
今回は、dot-qmailを使う上で知っておきたいことをTIPSを交えて紹介したいと思います。
dot-qmailのバリエーション
例として、kbora@klab.org宛てのメールが~kbora/.qmailに届く場合を考えます。
qmailにはextension addressというものがあり、ユーザ名に続けて「-XXX」を指定することができます。例えば、kbora-oboko@klab.org宛てのメールは、~kbora/.qmail-obokoに届きます。このextension addressを活用すれば、管理者の手を煩わすことなくメールアドレスを増やすことができますね。
では、~/.qmail-inaが無い状態でkbora-ina@klab.orgに届いたメールはどうなるでしょうか。この場合、~/.qmail-defaultがあればそれに基づいて処理され、~/.qmail-defaultがなければ送信者にバウンスメール(エラーメール)が返されます。~/.qmail-defaultは設定されていないextension addressに届いたメールを処理するためのセーフティーネットのようなものですね。
また、この「-XXX」は複数続けて書くこともでき、kbora-oboko-ina@klab.org宛てのメールは~kbora/.qmail-oboko-inaで処理することができます。
まとめると、kbora-AAA@klab.org宛てのメールは、
- .qmail-AAA
- .qmail-default
の順に存在したdot-qmailに基づいて処理され、kbora-AAA-BBB@klab.org宛てのメールは、
- .qmail-AAA-BBB
- .qmail-AAA-default
- .qmail-default
の順になります。
dot-qmailの設定忘れや無用なバウンスメールの送信を防ぐため、.qmail-defaultは用意しておいて、Maildirに保存するなどの処理を書いておいた方がよいのではないかと思います。
転送したい
届いたメールを転送したい場合は、「&」に続けて転送したいメールアドレスをdot-qmailに書きます。複数のアドレスに転送したい場合は、同じように1行1アドレスで列挙します。先頭の「&」は、メールアドレスがアルファベットか数字で始まっている場合は省略することもできますが、省略せずに「&」をつけておいた方が無難でしょう。
例えば、kbora-nakama@klab.org宛てのメールを転送したい場合は、~kbora/.qmail-nakamaに、
&buri@klab.org
&teri@klab.org
と書きます。
さて、この場合、転送先(buri@klab.org)がバウンスメールを返した場合、そのバウンスメールはだれに届くでしょうか。はい。そのメールを送った人に届きます。
これはこれで正しい動作だと思うのですが、状況によってはちょっとまずいときもあろうかと思います。
例えば、宛先がコンテンツサービスで使っているドメインのメールアドレスで、転送先が案件担当者のメールアドレス、そしてコンテンツのユーザさんがメールを送る人、といった場合です。この場合、案件担当者へのメール配送に失敗した場合、ユーザさんにバウンスメールが返され、そのバウンスメールには『"案件担当者のメールアドレス"への配送に失敗しました』みたいな内容が記載されてしまいます。"案件担当者のメールアドレス"はユーザさんには知らせる必要がない情報なので、こういう状況は避けたいですよね。
こういうときは、qmail-injectを使ってenvelope fromを指定してメールを送るとよいです。先の例だと、~kbora/.qmail-nakamaにこう書きます。
qmail-inject -f umi@klab.org buri@klab.org teri@klab.org
こうすることにより、buri@klab.orgからのバウンスメールは、ユーザさんではなくumi@klab.orgに送られます。ただ、umi@klab.orgがバウンスメールを返すと元も子もないので注意してください。
ファイルに保存したい
届いたメールをファイルに保存したい場合、二つの形式が選べます。mboxとmaildirです。
mbox形式で保存したい場合は、dot-qmailに「/」または「.」で始まり「/」で終わらないパスを書きます。
/home/kbora/mbox
一方、maildir形式で保存したい場合は、「/」または「.」で始まり「/」で終わるパスを書きます。
/home/kbora/Maildir/
パスの末尾が「/」かどうかにより保存形式が変わりますので注意しましょう。
捨てたい
届いたメールを捨てたい場合はどういうdot-qmailにすればよいでしょうか。
dot-qmailに「#」とだけ書くのが一番簡単です。
例えば、kbora-spam@klab.org宛てのメールを捨てたい場合は、
echo '#' > ~kbora/.qmail-spam
とします。
どうして「#」でメールが捨てられるのでしょうか? その理由はこうです。
要はdot-qmailに配送命令を書かなければいいだけなのです。
では、空のファイルでいいのではないかと思うかもしれませんが、ファイルサイズがゼロだとそのdot-qmailファイルはないものとして扱われ他の方法で配送処理されるためダメなのです。じゃあというわけで、サイズがゼロにならないように空行だけを書くと、qmailの仕様でdot-qmailの最初の行は空行ではいけないと決められているので、qmail-localに怒られてしまうのです。
ですので、コメントである「#」を書いて、ファイルサイズがゼロではなく、かつ、最初の行が空行でもないdot-qmailにするわけです。
ちなみに、dot-qmailに「/dev/null」と書くのは絶対に絶対に絶対にやめるべきです。
なぜなら、qmail-localが「Unable_to_write_/dev/null:_invalid_argument._(#4.3.0)」というメッセージと共にエラーになるのですが、このときの終了コードはexit 111、つまりtemporary failureで、エラーになったメールは捨てられず再送キューに入れられて、qmailがあきらめるまで、/dev/nullに配送しようとして失敗、というのを延々と繰り返してしまうからです。
終了コードの意味についてはqmail-command(8)を参照してください。(ここでも次回解説する予定です)
次回予告
今回はdot-qmailファイルの種類と、届いたメールを転送する方法、ファイルに保存する方法、捨てる方法の3つを解説しました。
次回はプログラムで処理する方法を今回と同様TIPSを交えて解説したいと思います。
参考URL
トラックバックURL
この記事へのコメント
2. Posted by John Doe 2012年02月26日 13:39
転送時のバウンスメールの処理に困っておりましたところ、こちらの記事を参考に
所望の動作をさせることが出来ました。
ありがとうございます。
誤植かと思いますが、
dot-qmailからコマンドを実行するには行頭に"|"が必要とおもいますので
qmail-inject ...
ではなく
|qmail-inject ...
ではないですか
所望の動作をさせることが出来ました。
ありがとうございます。
誤植かと思いますが、
dot-qmailからコマンドを実行するには行頭に"|"が必要とおもいますので
qmail-inject ...
ではなく
|qmail-inject ...
ではないですか