作成開始 : 平成21年08月13日(木) 最終更新 : 平成21年09月04日(金)

sendmailでメーリングリストを試す


1.背景

会社でアプリケーションの開発ベンダや社内の関係者に対し、To や CC で複数人にメールを送り開発にあたっての課題管理をすることになった。
会社では、Outlook Express を使ってその都度アドレス帳からチョイスしている。
しかし、これって相手を確認する意味ではいいのかもしれないが、一々面倒だしアドレス帳にメンバが一杯あると間違いやすい。
グループを作って管理すればいいと思うが、Windows標準のアドレス帳はイマイチ使いづらい。
なので、メーリングリストを作ってみることにした。
これ使えば1つのメールアドレスに送信すれば、メンバ全員に遅れるし、新規送信時に「返信先アドレス」をメーリングリストのアドレスにすれば「返信」でもメンバ全員に送ることができる。

2.参考にしたサイト

メーリングリストの設定方法 を参考にしました。

3.設定

メーリングリストを設定する時は aliases に設定内容を書き込みます。alias ファイルはメールの宛先の別名を設定するファイルです。
さらに、sendmail は起動時に設定ファイル sendmail.cf を読み込みます。
その中に aliases を使える記述があるか確認します。次のような記述があったらOKです。
O AliasFile=/etc/mail/aliases
※sendmail.cf とか aliases は /etc か /etc/mail にあります。
aliases には次のように書きます。メールサーバーのFQDNは takaq1.plala.jp と仮定します。
例1 aliases にメンバのメールアドレスを書く方法
mlist1-test: aaa@yahoo.co.jp , bbb@nifty.ne.jp , ccc@biglobe.ne.jp , ddd@hotmail.co.jp
mlist1-test は メーリングリスト用のアカウントです。この場合メールアドレスは mlist1-test@takaq1.plala.jp になります。
つまり、mlist1-test@takaq1.plala.jp にメールを送ると、aaa@yahoo.co.jp , bbb@nifty.ne.jp , ccc@biglobe.ne.jp , ddd@hotmail.co.jp に同じメールが送られます。メンバのメールアドレスは長くなる場合 「\」(バックスラッシュ)を入れて改行します。
例2 メンバ記述用のファイルを用意する方法
mlist2-test: :include:/usr/local/lib/mlist2-testmember-file
mlist2-test は メーリングリスト用のアカウントです。この場合メールアドレスは mlist2-test@takaq1.plala.jp になります。
/usr/local/lib/mlist2-testmember-file はメンバ記述用のファイルです。次のように書きます。

aaa@yahoo.co.jp
bbb@nifty.ne.jp
ccc@biglobe.ne.jp
ddd@hotmail.co.jp

mlist2-test@takaq1.plala.jp にメールを送ると、aaa@yahoo.co.jp , bbb@nifty.ne.jp , ccc@biglobe.ne.jp , ddd@hotmail.co.jp に同じメールが送られます。
どちらの場合も、aliases を編集したら make aliases と make restart が要ります。
ただ、例2の場合メンバに変更があっても make が要らないのでこっちの方がいいと思います。
この実験でも例2の方法でしました。
※その他の例
メーリングリストの設定方法 では、メールを一旦フィルタプログラム(メールの内容を標準入力から読みとり、加工した内容を標準出力から書き出すプログラム)に通して、特定のフィールドを、加工、削除、追加して Subject: に通し番号をつける perl プログラムを使ったのも紹介されています。

4.動作確認

クライアントPCのメーラーで mlist2-test@takaq1.plala.jp にメールを送りメンバ全員にメールが送信されることを確認します。
ただ、前記のままでは受信したメールに対して「返信」するとメールの送信者に返ってしまいます。

さて、一般に、メール読み書きソフトは、受信したメールに対して「返信」というボタンを押すと、受信したメールに Reply-to: aaa@bbb.com というフィールドがある場合、aaa@bbb.com へ返信します。 Reply-to: フィールドがない場合は、From: で指定されたアドレスへ返信します。

・・・とのことです。
ですので、メーリングリストのメールアドレス宛にメールを送る場合「返信先アドレス」にメーリングリストのメールアドレス( 上の場合 mlist2-test@takaq1.plala.jp ですね)を書きます。
送った後は元に戻しておくとよいでしょう。

5.その他

一般のメーリングリストは、管理用のアドレスにコマンドを送ることで加入、脱会できたり、過去のメールを取り寄せることが出来たりします。
これを行うために、メーリングリスト管理用のソフトがあります。 majordomo と呼ばれるソフトが一番メジャーなようです。fml というソフトもあります。fml は日本人が作成し、日本語のドキュメントなども充実しているそうです。
この管理はWeb上からもできたりしますが、そうなると Apache とか PHP とかのインストールが要ります。
わが家のメールサーバーはとーーーっても非力なので Apache とか PHP とかのインストール して動かすことができません。
これは、また別の機会にやってみたいと思います。

6.ちょっとお勉強(メールヘッダについて)

メールのプロパティとかで見た時のものです。(詳しくは RFC822 とか参考ください)
項  目 説      明
Return-Path: エラーなどのときに返るアドレスで、 Envelope fromと同じものがMTAによって挿入されます。
Received: 受信したメールが途中、どういう経路でここまで来たのかが(MTAによって) 書かれています。
From: メールを書いた人の名前とアドレスです。
Sender: メール差出人の名前とアドレスです。 Fromがなんらかの理由(グループの代表アドレスを使ってる、1人で複数のメールアドレスを使い分けてるとか)で実際にメールを出そうとしているアドレスと Fromとが一致しない場合に本当の差出人がここに書かれることになっています。
Message-Id: 受信したメールのIDで、(つけるならば)一意なものをつけなければなりません。
普通は <番号/記号@マシン名> となってます。
To: 送り先アドレスです。
Cc: カーボンコピーと呼ばれます。To 以外に参考までに送ったりするときに使います。
Bcc: ブラインドカーボンコピーで、機能は Cc: と同じようなものですが、この行は受取人に送られないので相手に気づかれずにメールを送ることが出来ます。
Date: メールを出した日付です。
Subject: メールのサブジェクト(件名)です。
Reply-To: メールの返信先アドレスです。
Precedence: メールの配送方法を示します。メーリングリストの場合には bulk にしておくのがいいようです。
"X-" で始まるヘッダは自由に使っていいことになっているようです。よく X-Mailer: うんたらかんたら とか書いてありますね
・・・他にもありますが、まぁこれくらいで。

平成21年08月17日(月) 追記

(注)メーリングリスト名は実際とは違うもので記述しています。
さて、これまでの環境ではメール送信者が意図的に「返信先アドレス」を指定して送らなければなりません。
しかも、通常のメールアドレスへメールする場合、設定した「返信先アドレス」を削除しなければならないことになります。
それはなかなか大変なことですし、間違って「返信先アドレス」をメーリングリストに指定して送ってしまい、それを受け取った人が返信してメーリングレストのメンバにそれが送られてしまった。
なぁーんてことになりかねません。
そんな事が無いように、せめて Reply-To: へ自動的にメーリングリストのアドレスをセットしたいようにしようと思いました。
この前にも書きましたが、超非力なサーバーなので majodomo や fml なんかは使えません。
さりとて、自力で bashやPelスクリプトなんか書けないので、ネット上に例が無いか検索しました。
色々見つかりましたが、こちら( Gabacho-Net )の簡易メーリングリスト用GAWKスクリプト を参考にしました。
4つのスクリプト仕様がありましたが、私は「タイプ2」を使ってみました。
■タイプ2の仕様
返信先をメーリングリストのアドレスにさせるReply-Toヘッダを付加します。ただし、自分だけに返信をほしい場合(会合案内で出欠の返答を求める場合など)に送信者がReply-Toヘッダを付けて送信すれば、それを優先します。
さらに、サブジェクトにメールの連番を記入する機能を加えたものです。
これは、一般的なメーリングリストと同等の仕様を有するものです。
タイプ共通仕様は以下のとおりです。
以下のヘッダを削除します。
Return-Receipt-Toヘッダ:受け取り通知メールを大量発生させないため。
Errors-Toヘッダ:サブメーリングリストに適用した場合にエラー通知を上位メーリングリストの管理者へ行かせないため。
Disposition-Notification-Toヘッダ:開封通知メールを大量発生させないため。

・・・・あぁ、これはいいですね。
■設定
メーリングリスト名 : mlist-sendai (メーリングリスト用のメールアドレス -> mlist-sendai@takaq1.plala.jp) としました。
(1)gawkのインストール
gwakとは -> gawk は GNU プロジェクトが実装した プログラミング言語 AWK の処理系です。
find / -name gawk とかすればサーバー上にあるかどうかサーチできます。
なければパッケージかソースからインストールしましょう。
/usr/local/bin/gawk にインストールされました。
特に設定箇所はありません。
(2)スクリプトの準備
簡易メーリングリスト用GAWKスクリプトを参考に以下のようにしました。
実験した結果を反映しているのでオリジナルと少し違っています。
一番最後の行はメーリングリスト管理者用のアドレスです。(このアドレスを使って /var/mlist/mlist-sendai.list に書いたメンバへ送信します。)
メーリングリスト管理者は、配送エラーが起こった場合の差し戻し先になります。
上記スクリプト( mlist-sendai.sh ) を /var/mlist に置き chmod 755 mlist-sendai.sh で実行権限を与えます。
(3)メンバ用のアドレスリスト作成
メンバーのアドレスを一行に1個ずつ記述したアドレスリストファイル「mlist-sendai.list」を /var/mlist に作成します。
(4)連番保持ファイルの作成
echo 0 > /var/mlist/mlist-sendai.seq でカウンタ 0 の連番保持ファイルを作成します。
そして、chmod 666 /var/mlist/mlist-sendai.seq で書込み権限を与えます。
これで、メールの連番は 1 から始まります。
(5) /etc/mail/aliasesファイル の設定
以下のようにしました。
実験した結果を反映しているのでオリジナルと少し違っています。
mlist-sendai: "|/var/mlist/mlist-sendai.sh"
mlist-sendai-outgoing: :include:/var/mlist/mlist-sendai.list
owner-mlist-sendai: takaq
mlist-sendai-request: owner-mlist-sendai
mlist-sendai-approval: owner-mlist-sendai
編集後は例によって、make aliases、そして make restart です。
■確認テスト
/var/mlist/mlist-sendai.list には、自分のアカウント(ぷらら、Yahooメール、hotmail)を利用しました。
OKを確認したので仲間用に公開・運用したいと思います。
Reply To: は mlist-sendai になります。
Return-Path: は owner-mlist-sendai になります。これ受信した時に /etc/mail/aliases を判定して takaq@takaq1.plala.jp で受け取るのでしょうね。

平成21年09月04日(金) 追記

テストも兼ねて仕事仲間でメーリングリストを利用してみました。
メーリングリストとしての機能は十分に果たせて使いかってはとても良かったのですが、ファイルを添付したら受信メールの添付ファイル名が短く、しかも拡張子は .dat というものになってしまいます。
・・・で調べたら、添付ファイルのファイル名の長さ制限を解除できることがわかりました。
私のところでは、/etc/make.conf に SENDMAIL_MC=/etc/mail/takaq.mc と書いているので vi で /etc/mail/takaq.mc の以下を編集しました。
修正前:define(`confMAX_MIME_HEADER_LENGTH', `256/128')
修正後:dnl define(`confMAX_MIME_HEADER_LENGTH', `256/128')
そして、make し make install し make restart しました。

戻る

サイトトップへ