#!/usr/bin/perl # # メルマガのメンバー一覧をメールで送るための簡易なスクリプト # # ご自由にお使いくださいなものですが、責任はとりかねます。 # 使い方などは、以下をご覧ください。 # # http://www.usupi.org/sysad/043.html # use strict; ### 定数 # 管理者メールアドレス(変更してください) my $ADMINISTRATOR = "root\@usupi.org"; # 引数にメーリングリスト名が必ず来るよ。絶対。信じてるから。 my $MLNAME = shift; # /var/spool/ml/メーリングリスト にメンバーが。 my $MLLIST = "/var/spool/ml/$MLNAME"; # デバッグ用 (1 にすると /tmp/ML名-プロセスID にデバッグ出力) my $DEBUG = 0; ### サブルーチン: メンバーなら一覧をメールします。 sub check_and_send { my ($from) = @_; # 引数 my @members; # メーリングリストのメンバーを格納 my $found = 0; # メンバーなら 1 にする # メーリングリストの中を見るよ if(open(ML, "$MLLIST")) { while() { chop; push(@members, $_); $found = 1 if $_ eq $from; } close ML; # メンバーだったら一覧をメールする if($found) { if(open(MAIL, "|/usr/sbin/sendmail -oi $from")) { my $i; # ↓好きな感じに書き換えてください print MAIL "From: $ADMINISTRATOR\n"; print MAIL "To: $from\n"; print MAIL "Subject: $MLNAME members\n\n"; for($i=0; $i<=$#members; $i++) { print MAIL "$members[$i]\n"; } print MAIL "-- \n $ADMINISTRATOR\n"; close MAIL; } else { # メール出せなかったとき、ここに処理を。 if($DEBUG) { print TMP "Cannot send mail: $from\n"; } } } else { # メンバーじゃなかったとき何かするなら、ここに。 if($DEBUG) { print TMP "Not member: $from\n"; } } } else { # ファイルがなかったとき、ここに対処を。 if($DEBUG) { print TMP "Cannot open: $MLLIST (name=$MLNAME from=$from)\n"; } } } ### メインはここから # デバッグ開始 if($DEBUG) { open(TMP, ">/tmp/$MLNAME-$$"); } # メールのヘッダをひたすら読む while(<>) { chop; # ヘッダが終わったら終了 last if ! $_; # From: を見つけたら if(/^From:\s*(\S+.*\S+)\s*$/) { my $from = $1; # 括弧で囲まれた部分を除外 while($from =~ /^(.*)\([^\)]*\)(.*)$/) { $from = "$1$2"; } # " で囲まれた部分を除外 while($from =~ /^(.*)\"[^\"]*\"(.*)$/) { $from = "$1$2"; } # 前後のホワイトスペースを除外 if($from =~ /^\s*(\S+)\s*$/) { $from = $1; } # <> で区切られていたらそれはアドレス if($from =~ /<(\S+\@\S+)>/) { &check_and_send($1); # アドレスっぽかったらまあアドレスでしょう(手抜き) } elsif($from =~ /^\S+\@\S+$/) { &check_and_send($from); } else { # From: がおかしいようだったときの処理はこちら if($DEBUG) { print TMP "Invalid from: $from\n"; } } } } # デバッグ終了 if($DEBUG) { close TMP; } 0;