WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

.courier によるメール転送

皆さん、仲の良いグループや飲み仲間との連絡はどうしていますか。飲み会を開くときなど、全員に電話やメールで連絡を取るのはけっこう面倒な作業ですよね。そんなとき、仲間全員に自動でメールを転送してくれるメーリングリストがあると便利です。Yahoo! グループのようなサービスを利用するのも手なのですが、せっかく自分のメールサーバーを持っているなら、それを使ってやってみましょう。

そんなわけで、本日は久しぶりに Courier メールサーバーの話題です。Courier では受け取ったメールを任意のアドレスに転送するためのとても簡単な方法が用意されています。これを使って、仲間内の同報通知用メールアドレスを作成する方法をご紹介しようと思います。単に転送するだけなのであまり凝った運用はできませんが、仲間内の連絡手段としてはじゅうぶんでしょう。また、メールをスクリプトに渡して処理することもできるので、届いたメールの内容を blog に投稿するなんてことも可能です。いろいろなことに応用できるので、自分のメールサーバーを運用している方はぜひ試してみてください。

なお、ここでは GentooLinux を前提としていますので、Courier の設定ファイルは "/etc/courier" にインストールされているものとします。他のディストリビューションでは別の場所に存在するかもしれません。その際は、適宜読み替えてください。また、メールボックスの形式は maildir に設定されているものとします。mbox 形式なんてもはや使う理由はありませんよね(^^;

.courier について

前述のような設定は、ユーザーのホームディレクトリに ".courier" という名前のファイルを作成することで実現できます。バーチャルドメインで運用している場合は、各バーチャルアカウントのホームディレクトリに配置します。この ".courier" が存在すると、Courier は標準の動作(標準の maildir にメールを保存する)を行う代わりに、そこに記述された処理を先頭から順に実行していきます。".courier" に記述できる処理には以下のものがあります。

記述方法 処理内容
空行または行頭が "#" コメント
行頭が "." または "/" 指定の maildir にメールを保存
行頭が "|" スクリプトの実行
行頭が "||" スクリプトの実行と処理内容の生成
上記以外 メールの転送

それでは、それぞれの処理について詳しくご紹介していこうと思います。

maildir へのメールの保存

"." または "/" で始まる行を見つけると、Courier はその行全体を maildir 形式のディレクトリへのパスとみなし、そこにメールを保存します。行頭が "." の場合はホームディレクトリからの相対パス、"/" なら絶対パスとして扱われます。ここに指定するディレクトリは、maildirmake コマンドであらかじめ作成しておかなければなりません。また、アカウントのユーザー権限で行われますので、該当ユーザーに書き込み権限がないと保存に失敗します。

".courier" ファイルが存在する場合、明示的に指定しなければメールの保存は一切行われないことに注意してください。

スクリプトの実行

"|" で始まる行を見つけると、Courier はそれ以降の行末までをコマンドラインとみなして、シェルに渡して実行します。受信したメールの内容は標準入力を使って受け渡します。また、いくつかの情報が環境変数に設定されていますが、これについては後述します。

コマンドの終了コードによって、以降の処理を継続するかどうか、中断するならエラーの種類などが指定できます。

終了コード 処理
0 スクリプトの実行を継続
99 処理を中断し、受信成功として扱う
64, 65, 67, 68, 69, 70, 76, 77, 78, 112 処理を中断し、恒久的なエラーとして扱う
上記以外 処理を中断し、一時的なエラーとしてメールをキューに戻す

スクリプトの実行と処理内容の生成

"||" で始まる行の処理は "|" の場合とほぼ同じですが、実行したコマンドが標準出力に出力した内容を次の処理内容として挿入する点が異なります。これにより、スクリプトで保存するメールボックスや転送先のメールアドレスを変更することなどが可能になります。

終了コードの意味も "|" とほぼ同じですが、標準出力の内容が実行されるのは終了コードが 0 か 99 のときのみです。

メールの転送

上記以外の文字で始まる行は、その行全体がコンマ区切りのメールアドレスの並びと解釈され、メールがそのアドレスに転送されます。転送先のメールアドレスは任意で、別のメールサーバーのアドレスにも自由に転送できます。今回の目的なら、この機能を使うだけで実現できますね。例えば、foo@example.com と bar@example.com にメールを転送する設定は、".courier" に以下の 1 行を記述するだけです。

foo@example.com, bar@example.com

このようにして、必要なぶんだけメールアドレスを記述すればよいわけです。簡単ですね(^^)

メールアドレスを増やす簡単な方法

新たに転送用のメールアカウントを作成し、上記のように ".courier" を記述すれば今回の目的は一応達成できます。でも、転送のためだけに正式なアカウントを作成するのはちょっと手間ですね。Courier では、簡単にメールアドレスを増やす方法がいくつかありますので、それをご紹介しようと思います。

"<アカウント名>-<任意の文字列>"形式のメールアドレスを作成する

Courier では、正式なアカウント名の後に "-" に続けて任意の文字列を付加したメールアドレスを簡単に作成することができます。例えば、"user@example.com" という正式なアカウントが存在するなら、"user-foo@example.com" などというメールアドレスを簡単に追加できるのです。方法は、"user@example.com" のアカウントのホームディレクトリに ".courier-foo" というファイルを作成するだけです。このファイルに ".courier" と同じ方法で処理内容を記述すれば、"user-foo@example.com" 宛てのメールを受信した際にそれが実行されます。もちろん "foo" の部分は(メールアドレスとして正しいものなら)任意の文字列を指定できるので、ほぼ無限のメールアドレスが作成できることになります。ひとつだけ注意点として、メールアドレス中の "."(ピリオド)は":"(コロン)に置き換える必要があります。

この方法の優れた点は、設定するのに管理者権限を必要としないことです。一般ユーザーの権限で好きなだけメールアドレスを増やせるので、メーリングリストへの投稿用アドレスを作成して、スパムが多くなってきたらどんどん別のアドレスに切り替える、なんてことも簡単にできます。今回の目的も、"user-group@example.com" なんてアドレスを同報通知用にすれば、手間なく実現できますね。

また、この形式の特殊なものとして、".courier-foo-default" のようなファイルを使うこともできます。このファイルが存在すると、すべての "user-foo-*@example.com" 形式のアドレスを受信できます。メールアドレスによってスクリプト内の処理を変更するなどという用途に便利だと思います。ただし、この場合でも "user-foo@example.com" のアドレスは依然として ".courier-foo" で処理されるので注意が必要です。

通常の形式のメールアドレスを作成する

上記の方法ではメールアドレスの最初は必ず正式なアカウントのものでなければなりません。この制限が気になる場合は、"/etc/courier/aliasdir" のディレクトリに ".courier-*" ファイルを作成する方法もあります。例えば、"/etc/courier/aliasdir/.courier-bar" というファイルを作成すれば、"bar@example.com" のメールアドレスに対して適用されます。

この場合、メールの保存やスクリプトの実行は Courier のユーザー権限で行われます。GentooLinux の場合、ユーザー・グループともに "mail" になっているはずです。したがって、保存先ディレクトリなどはこのユーザーの権限で書き込み可能になっていなければなりません。

また、バーチャルドメインで運用している場合は、さらにもうひと工夫必要です。"virtual.com" というバーチャルドメインを運用している場合に、"bar@virtual.com" というメールアドレスを作成するには、".courier-bar@virtual:com" というファイルを使います。後は実際のドメインの場合と同じです。ここでも、バーチャルドメインの場合は "bar@virtual.com" というアドレス全体がアカウント名として扱われているわけですね。

スクリプト実行時の環境変数

先ほど、".courier" でスクリプトを実行する際に環境変数で引き渡される情報についての詳細をご紹介しませんでした。というのも、それらの情報の多くが ".courier-*" による拡張メールアドレスで使用されるものであるため、そちらを先に説明しないと話が繋がらなかったのです(^^ゞ。そんなわけで、準備が整ったところでスクリプトに渡される環境変数の内容をご紹介しましょう。

HOME
正式なアカウントのホームディレクトリのパス。
USER
正式なアカウントのユーザー ID。
SENDER
送信者のメールアドレス。
RECIPIENT
受信者のメールアドレス。
HOST
RECIPIENT が "user@domain" の形式だった場合の domain 部分。
LOCAL
RECIPIENT の "user@domain" の形式だった場合の user 部分。
EXT
LOCAL が "foo-bar" 形式だった場合、bar の部分が格納される。
EXT2
EXT にさらに "-" が含まれていた場合、最初の "-" よりも後の部分が格納される。
EXT3
EXT2 にさらに "-" が含まれていた場合、最初の "-" よりも後の部分が格納される。
EXT4
EXT3 にさらに "-" が含まれていた場合、最初の "-" よりも後の部分が格納される。
DEFAULT
".courier-*-default" によって起動された場合、メールアドレスの "default" に該当する部分が格納される。
UFLINE
From: ヘッダの内容。標準入力から読み込むメールのヘッダに "From:", "Return-Path:", "Delivered-To:" が含まれない場合でも、UFLINE, RPLINE, DTLINE には有効なアドレスが格納されるようです。Courier に付属の preline というプログラムを利用すると、標準入力から読み込むないようにこれらのヘッダを挿入できます。
RPLINE
Return-Path: ヘッダの内容。
DTLINE
Deliverd-To: ヘッダの内容。

これらの環境変数をスクリプトから参照することにより、メールアドレスにさまざまな意味を持たせることができます。携帯電話からメールを使用してさまざまな処理を行いたい場合に便利ですね。

本日は、Courier 標準の機能を利用して転送専用のメールアドレスなどを簡単に実現する方法をご紹介しました。このあたりの機能は安価なレンタルサーバーで提供されることはほとんどありませんので、個人サーバーならではの機能が実現できると思います。あとは工夫次第ですので、皆さんもいろいろと試してみてください。

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles