2005.01.15
またまた、Majordomoです。
メーリングリストでタイトルにシーケンスナンバーを付けるのが一般化しています。
このため、Majordomoではresendの変わりにsequencerを使うが改造が必要なのは既に書いた。
ところが、これでもOutlook ExpressではMIME decodeのルールに違反しているため、シーケンスナンバーの重なり防止が出来ない。
そこで、mime-decodeして改めてmime-encodeして正しいMIMEに直してやる必要がある。
このためにはmimer.plとmimew.plを取ってきて、sequencerの67行目あたりに次のように使用を宣言する。
require "shlock.pl";
+require "mimer.pl";
+require "mimew.pl";
そして、158行あたりを以下のように改造する。
&open_temp(IN, "/tmp/sequencer.$$.in") ||
&abort("sequencer: Can't open /tmp/sequencer.$$.in: $!");
while (<STDIN>) {
+ # by nob & tamotsu
+ if (/^Subject:/) {
+ $_ = &mimedecode($_);
+ $_ = &mimeencode($_);
+ s/[rR][eE]:.*[([].*d+[)]]/Re:/;
+ s/[rR][eE]:s*[rR][eE]:/Re:/g;
+ }
print IN $_;
}
さて、これで終わりだと思ったら、sequencerを使うとtaboo headerやtaboo bodyの「禁句」の指定が有効にならない。
taboo headerは添付ファイルの禁止する場合など、便利に使え是非欲しい機能である。
しかし、幸いにもsequencerはsequencerそのものに指定できる場所がある。
275行目あたりに下の赤字部分を挿入して添付ファイル(multipart/mixed)を禁止する。
/^subject:s*Failed mailb/ ||
/^subject:s.*bchangeb.*baddressb/ ||
/^subject:s*requestb.*badditionb/i ||
/^Content-Type:s*multipart/mixed/i )) {
&bounce("Admin request");
}
次にtaboo bodyであるが、私の運営しているMLで最近、出張に際して自動不在メール設定をした人がいて、メールがループする事故が起こった。
元来、長期にメールが受け取れないときは一時的にMLから退会して戻ったら入り直すべきとは思うがMLの運営側でも対策を考えることにした。
そこで、前述のシーケンス重なり防止の後ろに以下を挿入した。
自動応答不在メールの本文のどこかに必ずout-of-the-officeの語句を入れてもらい、これを引っ掛けてBounce mailにして逃げようというものである。
s/[rR][eE]:s*[rR][eE]:/Re:/g;
s/[rR][eE]:s*[rR][eE]:/Re:/g;
}
#############################################
if(/out-of-the-office/i){$taboo = 1;}
############################################
print IN $_;
}
さらに、taboo headerで追加した前述の後ろに以下のようにBounce mailを発行させる行を追加する。
/^subject:s*requestb.*badditionb/i ||
/^Content-Type:s*multipart/i )) {
&bounce("Admin request");
}
#############################
if($taboo == 1){&bounce("Auto reply mail");}
############################
管理者には誰かMLに投稿する度にBounce mailが届くが、これは良しとした。
やれやれ、これで目的は達したか???
2005.01.09
サーバでMLなどを運用すると、namazuを入れて記事の検索をするようにすることが良くある。
それで、真夜中の適当な時間にIndexファイルを更新するようcronを設定することとなるが、実行結果はrootのメールとなり一般的には管理者に伝えられる。
ところが、namazuの実行結果の出力文字コードはEUCにしていることが多く、メールでは日本語文字が化けてしまう。
メーラーでEUCコードを指定して変換して読むこととなるが、大したことでないとは言いながら、毎日となると案外めんどうです。
そこで、crontab に以下のようにjis変換を付けておくと便利である。
0 2 * * * /usr/local/bin/namazuindex | /usr/local/bin/nkf -j
ちなみに、namazuindexは
#!/bin/sh
export LANG=ja
/usr/local/bin/mknmz -O /hogehoge/index/abcd /MLdirectory/abcd
/usr/local/bin/mknmz -O /hogehoge/xyz /Mldirectory/xyz
などとしておく。 特にLANG=Jaを入れておかないと日本語のindexファイルが作られないので要注意です。
2005.01.08
Movabletypeのカレンダーはデザイン上の意味はあっても、あまり利用価値はあるように思えません。
そこで、Netで調べたら横書きのカレンダーにしていらっしゃる方がおり、これなら、じゃまにならないで良い感じです。
しかし、オリジナルのものは単純に日にちの数字が横に並ぶだけで、月の初めでまだ記事を書き込んでいないときなどは、カレンダーの感じがしません。
せめて、日曜日ぐらいは色を付けたいと思い少し改造しました。
1.Main Indexの改造
横書きカレンダーの場合はBannerの下にくっ付けて表示するのが普通と思われますので、以下にbanner部分からの内容を書きます。
<div id="banner">
<h1><a href="<$MTBlogURL$>" accesskey="1">
<$MTBlogName encode_html="1"$></a></h1>
<h2><$MTBlogDescription$></h2>
</div>
<div id="calendar" class="calendar-head">
<table border="0" cellpadding="0" cellspacing="0" bgcolor="#9cbe8c"
summary="カレンダー">
<tr>
<td align="right" width="70">
<div class="calendar-month"><b><$MTDate format="%Y %B :"$>
</b></div></td>
<td>
<MTCalendar>
<span class="calendar-date">
<MTCalendarWeekHeader><font color=#FF0000>
</MTCalendarWeekHeader>
<MTCalendarIfEntries>
<MTEntries lastn="1">
<a href="<$MTEntryLink archive_type="Daily"$>">
<$MTCalendarDay$></a></MTEntries>
</MTCalendarIfEntries>
<MTCalendarIfNoEntries><$MTCalendarDay$>
</MTCalendarIfNoEntries>
<MTCalendarWeekHeader></font>
</MTCalendarWeekHeader>
</span>
</MTCalendar>
</td>
</tr>
</table>
</div>
2. 次にStylesheetの変更です
#calendar {
padding-left: 50px;
background: #9cbe8c;
}
.calendar-head {
font-family:"MS Pゴシック", "Osaka";
color:#FFF;
ont-size: small;
font-weight:bold;
padding-left:2px;
text-align:left;
}
.calendar-date {
font-family:"MS Pゴシック", "Osaka";
color:#FF0;
font-size: small;
font-weight: normal;
background: #9cbe8c;
line-height: 100%;
padding-left: 2px;
text-align: left;
}
2004.12.29
メーリングリストを開設すると、MLの総合ホームページなどから加入、脱退などが出来る方が便利でかっこ良く、一般の読者にも簡便で好まれる。
このためには、登録希望者に名前とメールアドレスを入れさせて、majordomoにsubscribeメールを出すようにすれば良いので比較的簡単に作ることができる。
ところが、自前で作らなくてもMajordomoにはそのツールも同梱されているので、これを利用する。
packageで入れるとツールは無いが、portsを入れていると
/usr/ports/mail/majordomo/work/majordomo-1.94.5/md-sub/ にあるmd-sub.cgiを使う。
(1) md-sub.cgiの設定
このmd-sub.cgiを/web/cgi-binにコピーする。
また、cgi-lib.plがシステムにない場合は/usr/local/lib/perl5/site_perl/5.8.5/machにコピーしていれておく。
そして、md-sub.cgiを修正。
# cd /web/cgi-bin/
# vi md-sub.cgi
#!/usr/local/gnu/bin/perl を #!/usr/local/bin/perl に
$cgiloc = "http://hogehoge/cgi-bin/md-sub.cgi";
運用するサーバmd-sub.cgiの場所(URL)を指定します。
$listsdb = "/usr/local/mail/.md-subrc";
md-subが使用するdatabaseの位置
$logfile = "/usr/local/mail/md-sub.log";
md-subのlogの位置
#$sendmail = "|/usr/lib/sendmail -t";
$sendmail = "|/bin/cat - > /tmp/test.out";
最初は/tmp/test.outに結果を書き出させます。
(2) データーベスを作る
# mkdir /usr/local/mail
# cd /usr/local/mail
ここで .md-subrcファイルを以下を参考に作る。
musicml majordomo@greatcircle.com
info musicml http://greatcircle.com/musicml/info.html
help webmaster@greatcircle.com
default musicml
test majordomo@greatcircle.com
pcmlist majordomo@greatcircle.com
info pcmlist http://greatcircle.com/pcmlist/info.html
そして、
# /web/cgi-bin/md-sub.cgi -C /usr/local/mail/.md-subrc
とすれば、.md-subrc.dbが作られる。
あとは、Browserで http://hogehoge/cgi-bin/md-sub.cgiでアクセスすると、入力画面が現れる。 入力してボタンを押し /tmp/test.outに期待通りの出力が得られれば、
$sendmail = "|/bin/cat - > /tmp/test.out"; を
$sendmail = "|/usr/lib/sendmail -t"; に変える。
(3) 日本語化
<
blockquote>
日本語化パッチは無いので自分で訳す。
参考までに、私が作ったファイルを下に載せておく。
日本語化md-sub.cgi
日本国内でMLを開くときに、メッセージなどが日本語になっている方が便利である。
Majordomoはperlで書かれているのでmajordomoの中のメッセージ部分を自分で日本語訳しながら書き換えられるが、世の中には親切な人達がいらっしゃって、高知大学の菊地さんが作られたのを「Nobさん」が改良して日本語化パッチを公開されている。→ 遂にリンク先がなくなりました。
ダウンロード:1.94.5用パッチ → 遂にリンク先がなくなりました。
これを使って、majordomoにpatchを当てます。
$ su
# su - majordom
$ ls (majordomoのあるディレクトリーであることを確認)
$ zcat majordomo-1.94.5-jp.patch.gz | patch
これで、メッセージ文は日本語化されたが、EUCコードであるためメールすると文字が読めないので、sendmailに送り込む前にjis(ISO-2022)にする。
このために、jsendmailの名前で以下の内容のスクリプトファイルを作る。
#! /bin/sh
/usr/local/bin/nkf -j | /usr/sbin/sendmail $*
そして、chmod +x jsendmailでjsendmailに実行権限を与えて、majordomo.cfの
$sendmail_commandを以下のように書き換えます。
$sendmail_command = "/usr/sbin/sendmail"; を
$sendmail_command = "/usr/local/majordomo/jsendmail"; とします。
これで、目出度し目出度し。 応答が日本文になります。