1. 概要
UNIXの/etc/aliasesファイルによるエイリアス(メールIDの別名)定義だけを使った単
純なメーリングリストでは、返信の宛先をメーリングリストのアドレスにさせるReply-Toヘッダを付けるなどの加工は行われません。また、エラー差し戻しが送信者へ行ってしまうため、アドレス登録誤りなどのトラブルにメーリングリスト管理者が気付きにくいという問題があります。
そこをもう少し便利にしたいとお思いの方のために、テキスト処理用スクリプト言語GAWKを使ってメールヘッダの加工を行う簡易なスクリプトをご紹介します。このスクリプトを使えば、Reply-Toヘッダの付加など、メーリングリストに適した加工がメールヘッダに施されます。また、メーリングリストの責任によるエラー差し戻しをメーリングリスト管理者が受けることができます。
Majordomoなどの本格的なメーリングリストサーバプログラムのような高度な機能(コマンドメールによるアドレス登録、メールアーカイブなど)はありませんが、
- UNIXシステム管理に熟達していなくても設定が簡単
- メールヘッダの加工にきめ細かい工夫を加えるのが容易
という利点があります。
2. スクリプトの仕様
ここで提供しているスクリプトには四つのタイプがあります。
お望みのタイプ名をクリックしてスクリプトのテンプレートをダウンロードしてください(Microsoft Internet Explorerをお使いの方は、右クリックして「対象をファイルに保存」を選んでください)。
|
仕様 |
適した用途 |
|
タイプ1 |
返信先をメーリングリストのアドレスにさせるReply-Toヘッダを付加します。ただし、自分だけに返信をほしい場合(会合案内で出欠の返答を求める場合など)に送信者がReply-Toヘッダを付けて送信すれば、それを優先します。 |
楽に設定したい場合(最も簡易なスクリプトです)。
Reply-Toヘッダを付加する処理を削除すれば、受付窓口用のメーリングリストに使えます。 |
詳細説明 |
タイプ2 |
タイプ1に、サブジェクトにメールの連番を記入する機能を加えたものです。 |
一般的なメーリングリストと同等の仕様を実現したい場合。 |
詳細説明 |
タイプ3 |
返信先をメーリングリストにさせるReply-Toヘッダを付加します。送信者がReply-Toヘッダを付けていたらそれを無効にします。
また、メールの連番を、サブジェクトとともに本文の先頭にも記入します。 |
メールの初心者が多いメーリングリスト。「Reply-Toヘッダを付けないでください」と要請しても初心者には通じないことがあるからです。 |
詳細説明 |
タイプ4 |
Reply-Toヘッダを削除も付加もしません。したがって、通常は返信先は元の送信者になります。
メールの連番は、サブジェクトと本文の先頭の両方に記入します。本文の先頭の方の連番には「(Reply-to-Me-Only)」(返信は私だけに)と付記します。 |
タイプ3と併用して、別のIDで「返信は私だけに」モードを提供する場合。 |
詳細説明 |
なお、いずれのタイプも共通に以下のヘッダを削除します。
- Return-Receipt-Toヘッダ:受け取り通知メールを大量発生させないため。
- Errors-Toヘッダ:サブメーリングリストに適用した場合にエラー通知を上位メーリングリストの管理者へ行かせないため。
- Disposition-Notification-Toヘッダ:開封通知メールを大量発生させないため。(2001/07/15機能追加)
(2001/07/15改訂) Disposition-Notification-Toヘッダを削除する機能追加のほか、タイプ2、3、4で、「Subject:」の直後が継続行になっているケースに対処しました。
3. 設定方法
メーリングリスト名を仮に「friends」とした場合の設定方法を説明します。「friends」を実際のメーリングリスト名に置き換えて読んでください。
以下の設定は、rootになって行ってください。
(1) GAWKをインストールする
もしメーリングリストサーバにまだGAWKが入っていなければ、まずGAWKを入手してください。IIJなどから入手できます。2000年5月時点での最新版のファイルはgawk-3.0.4.tar.gzです。
ダウンロードしたファイルをroot用の作業ディレクトリに置き、そのディレクトリ位置で以下のようにコマンドを打ちます。
tar xvfz gawk-3.0.4.tar.gz
cd gawk-3.0.4
./configure
make
make install
|
これでGAWKがインストールされます。GAWKバイナリファイルのフルパスは
になります。
(2) スクリプトを作成する
前記2.でスクリプトのテンプレートをダウンロードしたら、ファイル名を「friends.sh」のように変更してください。タイプ3とタイプ4を併用する場合には、タイプ4のファイル名を別にしてください(ここではタイプ4を「friends-rmo.sh」とします)。
そして、エディタを使って、スクリプトの中の次の文字列を検索して書き換えてください。
- ML
メーリングリスト名(ここの例では「friends」)に置き換えてください。
- DOMAIN
メーリングリストサーバのアドレス(「@」の右)に置き換えてください。「example.jp」あるいは「host.example.jp」のような形です。
スクリプトファイルができたら、それをサーバに置きます。ディレクトリ位置はどこでもかまいませんが、後記(5)のエイリアス設定では、/var/mlistというディレクトリを作ってその下に置くと仮定しています。別の場所に置く場合は、エイリアス設定をそれに合わせてください。
スクリプトファイルのモードは、以下のようにしてください。
(3) アドレスリストファイルを作る
メンバーのアドレスを一行に1個ずつ記述したアドレスリストファイル「friends.list」を作成します。たとえば以下のような形です。
taro@example1.co.jp
hanako@example2.ne.jp
…
|
(ただし、動作試験の時には自分のアドレスだけにしてください。)
ディレクトリ位置はどこでもかまいませんが、後記(5)のエイリアス設定では、/var/mlistの下と仮定しています。別の場所に置く場合は、エイリアス設定をそれに合わせてください。
アドレスリストファイルは、メーリングリスト管理者がrootにならなくても更新できた方がよいので、その所有者をメーリングリスト管理者にするのがよいでしょう。
(4) 連番保持ファイルを作る(タイプ2、3、4の場合)
連番機能を持つタイプ2、3、4を用いる場合は、以下のようにして連番保持ファイル「friends.seq」を作成します(タイプ1には必要ありません)。
echo 0 > friends.seq
chown root.nobody friends.seq
chmod 664 friends.seq
|
ディレクトリ位置はどこでもかまいませんが、スクリプトでは、/var/mlistの下と仮定しています。別の場所に置く場合は、スクリプトの中の「/var/mlist/ML.seq」の部分を変更してください。
echoコマンドによって連番保持ファイルに文字「0」を入れておくと、メールの連番は1から始まります。メーリングリストを別のサーバから移行した場合は、それまでの最新の連番を入れておけば、その次の番号から始まります。
(5) エイリアスを設定する
/etc/aliasesファイルに以下の行を書き加えます。
〈タイプ1、タイプ2、またはタイプ3単独の場合〉
friends: "|/var/mlist/friends.sh"
friends-outgoing: :include:/var/mlist/friends.list
owner-friends: OWNER
friends-request: owner-friends
friends-approval: owner-friends
|
〈タイプ3とタイプ4を併用する場合〉
friends: "|/var/mlist/friends.sh"
friends-rmo: "|/var/mlist/friends-rmo.sh"
friends-outgoing: :include:/var/mlist/friends.list
owner-friends: OWNER
friends-request: owner-friends
friends-approval: owner-friends
|
ここで、
OWNERはメーリングリスト管理者のメールアドレスに置き換えてください。メーリングリストサーバ上のアカウントならば、「@」以降を省略してもかまいません。複数人ならばコンマで区切って並べます。メーリングリスト管理者は、配送エラーが起こった場合の差し戻し先になります。
/etc/aliasesファイルの編集が終わったら、
を実行してください。
4. 試験方法
最初はアドレスリストファイルに自分のアドレスだけを入れておいて、メーリングリスト宛に試験メールを送信してみて、配送が正しく行われるか、また、タイプ2、3、4の場合には連番が正しく記入されるかを確認してください。
確認が終わったら、
のようにして連番を初期値に戻し、アドレスリストファイルを整えて、運用を開始してください。
5. 運用
メンバーのアドレスを追加・変更・削除するには、アドレスリストファイルを編集します(その都度newaliasesコマンドを実行する必要はありません)。
特定のメンバーへの配送にエラーが起こり、一時的に配送を停止したい場合は、そのアドレスを削除せずに行頭に「#」を付けておくのが便利です。
タイプ3とタイプ4を併用する場合、メーリングリストのIDは二つですが、保守するアドレスリストファイルは一つですみます。
6. 自分だけに返信をもらう方法
人数が多いメーリングリストでは、会合案内に対する出欠の返答や、希望者募集に対する申し込みなどがメンバー全員に流れると、受信者にとってわずらわしいことがあります。
このような場合、送信者は以下のようにします。
- タイプ1またはタイプ2:自分のアドレスを指定したReply-Toヘッダを付けて送信します。
- タイプ3とタイプ4の併用:タイプ4のID(ここの例ではfriends-rmo)に宛てて送信します。
いずれも、受信者が「差出人のみに返信」の操作をすれば、元の送信者だけに返信が行きます。
[補足 1] 連番の仕様
(1) サブジェクトの連番
タイプ2、3、4では、サブジェクトに自動的に連番が記入されます。たとえばサブジェクトを
として送信すると、配信されるメールのサブジェクトは
[friends 1] friendsメーリングリスト開設
|
のようになります。
また、これに対する返信のサブジェクトが
Re: [friends 1] friendsメーリングリスト開設
|
となれば、
[friends 2] Re: friendsメーリングリスト開設
|
のように書き換えられます。「Re:」が「RE:」や「re:」であっても同じ結果になります。
しかし、「Re(1):」のように返信回数が埋め込まれていると、
[friends 2] Re(1): [friends 1] friendsメーリングリスト開設
|
のように連番が連なってしまいます。「Re」とコロンの間によけいな文字を許容する作りになっていないからです。「Re」は「…について」の意味で(Replyの略ではありません)、返信回数を付けるのは本来の手紙文の書き方として正しくありません。
返信回数を付けないようにメーラーを設定してください。
また、
マイクロソフトのメーラーによる返信が配信されると、
[friends 2] RE: [friends 1] friendsメーリングリスト開設
|
のように連番が連なってしまうことがあります。これは、マイクロソフトのメーラーが、サブジェクトに一部でも日本語文字が含まれていると全体をMIME符号化してしまうため、スクリプトが連番の部分を連番と認識できないことによるものです。この問題は、このスクリプトでは手におえません。
この時、連番の部分をASCII符号にする
まともなメーラーで返信すると、
Re: [friends 2] RE: [friends 1] friendsメーリングリスト開設
|
というサブジェクトの連番がいっきに整理されて
[friends 3] Re: friendsメーリングリスト開設
|
のようになります。
(2) 本文先頭の連番
タイプ3では、本文の先頭にも
のように連番が記入されます。タイプ4では
[friends 1] (Reply-to-Me-Only)
|
のように記入されます。これらは、タイプ3、4を併用する場合に、返信先がメーリングリストになるか元の送信者になるかが一目でわかるようにするためです。引用文中にこれを残せば元メールの連番がわかるというメリットもあります。
これが不要な場合は、スクリプトを変更してください。本文先頭の連番を出力するprint文一つを削除するだけです。詳しくは、2.の表のタイプ3または4の「詳細説明」をクリックして参照してください。
(3) 連番が重複する可能性
このスクリプトでは、連番保持ファイルを読み書きする際の排他制御は行っていません。そのため、メーリングリストサーバが複数のメンバーからほぼ同時にメールを受信した時、複数のプロセスがほぼ同時に連番保持ファイルを読み出し、複数のメールに同じ連番が付いてしまう可能性は皆無ではありません。したがって、そういうトラブルが許されないようなメーリングリストサービスには、このスクリプトはお奨めできません。
ただし、私が運用している一日数通程度の流量のメーリングリストでは、1000回以上にわたる配信で、連番の重複が起こったことはありません。
[補足 2] Receivedヘッダの扱い
メーリングリストによっては、送信者からメーリングリストサーバまでの経路で付加されたReceivedヘッダを全部削除していることがあります。かつては、そうしないと受信者までの経路でホップカウントオーバーが起こって届かない場合がありました。しかし、最近では多くのネットワークでメールの中継段数が少なくなっているので、ホップカウントオーバーは起こりにくくなっています。
また、Receivedヘッダを削除することには、
- メールのループが起こった時にホップカウントオーバーによって止めることができない
- 不正なメールが投げられた時に発信元を追跡するのが困難になる
というリスクが伴います。
そこで、このスクリプトではReceivedヘッダを削除しないようにしています。
もしReceivedヘッダを削除したいならば、Return-Receipt-ToヘッダやErrors-Toヘッダの削除を真似て処理を追加してください(gsub関数一つで複数のReceivedヘッダを全部削除できます)。方法は簡単におわかりになると思います。
[付録 A] 改造版 (2001/07/15追記)
タイプ3および4では本文先頭に連番が書き込まれますが、メールがマルチパートメッセージ形式(HTMLテキスト併記メールや添付ファイル付きメール)だった場合、メーラーによっては連番が表示されないことがあります。連番がパートの開始前の位置に書き込まれるからです。そこで、最初のプレーンテキストパートの先頭に連番を書き込むようにした改造版を作りました。
また、メール本文がプレーンテキストであっても、その符号化がBASE64などの特殊なものだった場合、本文先頭に書き込まれた連番が復号化を妨害してしまい、本文がまったく表示されなくなることがあります。そこで、この改造版では、そのような場合には連番を書き込まないようにしています。
動作条件を厳密に説明すれば、「符号化が7bit、8bit、またはquoted-printableであるプレーンテキストという条件を満たす最初のパートの先頭に連番を書き込む(その条件を満たすパートがなければ書き込まない)」ということになります。
プログラムが複雑になっているので、タイプ3または4で特に問題が起きていないならば、あえてお奨めはしません。
Microsoft Internet Explorerでは、右クリックして「対象をファイルに保存」を選んでください。
タイプ3改 ダウンロード
タイプ4改 ダウンロード
謝辞
スクリプトによるメールヘッダ処理のアイデアをくださったWさん、GAWKプログラミングをご指導くださったYさんに感謝します。