2010.12.07

MHonArcによるメールのhtml表示の構成・・・(mail)

メーリングリストを運用していると、投稿されたメールを整理された形でWebからも見られるようにすることが望まれる。その用途にはMHonArcというソフトが存在するが、満足な結果を得るためには、様々な対処が必要になる。
最初に、メールのaliasesに書いている文を下に示しておく。heptaviaと名付けたmlの運用を行っていて、投稿されたメールはMajordmoで会員に配送されるとともに、このメールaliasesにも送られてくる。なお、メール表示ページのディレクトリーは/web/data/heptavia/mlである。

heptaviaml: "| /usr/local/bin/chopper | /usr/local/bin/nkf -me | /usr/local/bin/newmlist /web/data/heptavia/ml Heptavia"

1. htmlメールとbase64/quoted-printableエンコードに対する処理

メーリングリストでは、Plain textメールのみ許し、htmlメールは許さないと宣言している例は多いが、Microsoftの評判の悪いOutlookのdefaultがhtmlメールになっていることが災いしてか、htmlで送信してくるメンバーが後を絶たない。特にPC関連のliteracyに乏しい人が多いメーリングリストでは、htmlメールの根絶は無理である。
さて、outlookから送られてくるhtmlメールを見ると、メール本文は2つのパートからなり、平文のメール内容の後に、同じ内容のhtml文が付いた構造であるのが分かる。
そこで、後半のhtml部分を切り離して、mhonarcに送り込むためのプログラムを書くこととした。合わせてbase64/quoted-printableのエンコードに対する処理とメール送信者にWarningメールを送る機能も持たせた。改めて、プログラムの機能を箇条書きすると、

(1)平文の場合は、base64/quoted-printableで送られてきたときには、デコード処理のみ行い、
  その他の場合はそのままで送り出す。
(2) htmlメールのhtml文部分の切り離し、平文部分のみを取り出したメールを再構築
(3) base64/quoted-printableのデコード
(4) メール送信者にプレーンメールとするよう警告メールを発信

chopperの名前のプログラムで、やっつけ仕事であり、あまり綺麗な作りでなくて恥ずかしいが、ここに上げておく。==> chopper
また、この中で使っている送信者への警告文は下記のようなものです。
————————————————————————–
メーリングシステムの自動発信メールです。

html形式でMLにメール送信されました。
今後は、テキスト形式で投稿されるようお願いします。

 一般的にhtml形式の方がウイルスの混入に脆弱であるため、メーリング
 リストのような、大勢の人に同時に送られる用途では使用しないのが正しいとさ
 れています。
————————————————————————–
chopperを通ったメールは、nkfでEUCコードに変換(nkf -me)され、次の月別分割処理プログラムに送られる。

2. メールの月別分割

mhonarcは月別の分割機能はないので、Nobさん(→リンク先がなくなった)のmlist2htmlを使わせていただいていたが、以下の変更を加えて名前をnewmlistとしている。

(1) 時差の影響の処理

メーリングリストの会員に海外在住者がいると、月の変わり目でメールのやり取り上、今月に分類されるべきメールが前月に入ってしまうことがある。例えば、5月1日の真夜中の0時過ぎに送られたメールに対するレスが4月30日になることが起こり得るのである。大概の国は日本より時刻が遅れているからである。この修正のため、メールの送信された時の日本時刻で、分類するようにした。

(2) ファイルの書き出しの回避

オリジナルのmlist2htmlでは、/tmp/tmp_$$のファイルに処理結果を書き出し、最後に読み出しながらmhonarcにメール文を渡している。これを修正して、ファイル書き出し不要とし、全てメモリー上のデータとして扱うようにした。

ファイルは、ここに上げておく。==> newmlist

3. mhonarcの対処

(1) 文字化け問題

以前に、iso2022jp.plの不備で、文の頭に”(B “のようなものが付くので、その対処を書いた
この対処でも良いのだが、http://www.mhonarc.jp/のページのKnown Problemsで新しいiso2022jp.plが提供されていた。本家にも報告済みのようだが、FreeBSD 8.1のportsでは、まだ直っていない。新ファイルを提供されているページからダウンロードすれば良いのだが、念の為にここにも、置いておく。

iso2022jp.pl (表示されるiso2022jp.plはiso2022jp.txtと名前を変えているので注意)

なお、iso2022jp.plの保存場所は、portsで入れると最近は、
/usr/local/lib/perl5/site_perl/5.10.1になっている。

(2) 長い行への対処

mhonarcでは、メールの本文の文頭と末尾を<pre>と</pre>で挟むので、たまたま1行が長い文を送って来られると、Browserの表示にはなはだ不都合である。
それで、改行コードを使い<pre>と</pre>で挟むのをやめる方法を以前に書いたが、これは、やはり必要である。

#           $$data = '<pre>' . $$data . '</pre>';
            $$data =~ s/\n/<br>\n/g;
            $$data = '<p>' . $$data . '</p>';

 なお、入っている場所は、iso2022jp.plと同じ/usr/local/lib/perl5/site_perl/5.10.1である。

(3) mhonarcの設定ファイル(rcファイル)について

mhonarcでhtml表示する内容の設定ファイルは、どこに設置してもよく、newmlistの中でパスを指定する。ここに掲げたnewmlistでは、/usr/local/lib/MHonArcに置くようになっている。
書き方の詳細はmhonarcのhome pageに詳しく書かれているが、私が使っているものをサンプルとして掲げておく。

Heptavia.rc


2010.12.05

MTのエントリーの編集画面(2)・・・(Movabletype)

以前に、MTのエントリーの編集画面で、編集画面で表示されるタイトルの長さが短すぎるのを修正した。
しかし、MTのバージョンを3.35にしたら編集方法が違っていたので、以下にその方法を書いておく。/mt/lib/MT/Appに移動してCMS.pmを編集する。

# cd ・・・/mt/lib/MT/App
# vi CMS.pm

修正場所はの6343行目あたりで、下記の赤字部である。すなわち、my title_max_lenを32の固定値にする。

    my %blogs;
require MT::Blog;
#    my $title_max_len = const('DISPLAY_LENGTH_EDIT_ENTRY_TITLE');
my $title_max_len = 32;
my $excerpt_max_len = const('DISPLAY_LENGTH_EDIT_ENTRY_T ・・・

ついでに、最近のエントリーのタイトル表示も長くしておく。1906行あたりである。

      $row->{status_text} = MT::Entry::status_text($entry->status);
#      my $max_len = const('DISPLAY_LENGTH_MENU_TITLE');
my $max_len = 32;
if (defined($row->{entry_title}) && ($row->{entry_title}・・・

タイトルが長い場合は2行にわたるようになるが、通常は1行に納まる場合が多く、不都合はない。むしろ、良い感じになった。


2010.12.04

Samba 3.x版について・・・(FreeBSD)

FreeBSD-81.1ではja-samba-3.0.35_1をpackageから入れた。

# cd /usr/local/etc/rc.d
# ./samba start

として、起動しようとすると、/etc/rc.confに下記を入れろとメッセージがでる。

samba_enable="YES"
winbindd_enable="YES"

samba_enable=”YES”は予想通りだが、winbindd_enable=”YES”は初めて出た。
Samba 2.x以降であろうか、ハッキリしないが、Sambaをインストールすると
/usr/local/etcにsmb.confが出来、sambaというディレクトリーが出来ている。この中には、
smbpasswdファイルがあるので、ここでSambaのPasswordを設定する。

# cd /usr/local/etc/samaba
# smbpasswd -a nnnnnnn  (nnnnnnは登録するuser名)
# New Password:  xxxxxxx
# Retype New Password:xxxxxxx

2010.12.03

FreeBSD-8.1のkernel再構築・・・(FreeBSD)

サーバーのHDDのミラー化も済み、各種設定も行い動作も良さそうなので、kernelの再構築(reconfiguration)を行うことにした。

1. 設定ファイルの編集

# cd /usr/src/sys/i386/conf      ← 設定ファイルのディレクトリーに移動
# cp GENERIC MYSERVER
# vi MYSERVER
ここで、下記の赤字部を追加 (4096 x nで100倍にした)
options         AUDIT                   # Security event auditing
options         MSGBUF_SIZE=409600
後は、RAID関連、Wireless LAN関係、PCMCIAカード関係をコメントアウト。
SCSI関連は、USBメモリーを使うので、SCSI peripheralのscbus, device  da, device pass, dev sesを除き、
後は全てコメントアウト。
また、NICで現在使用してしているもの、ならびに他に予備機がある場合はその予備機のNICも残し、他は
コメントアウト。(下記の注参照)
(ハッキリ理解出来ない行は残すのが、鉄則。)

注意:

サーバー内には、HDD2台でミラー構成を取っているが、もしHDD以外の要因(電源等)でサーバーが動作不能になった場合は、HDDを予備機に移し、起動すればデバイス名は、/dev/mirror/gm0で予備機のATAの構成が異なっても(起動ドライブ名がad2からad4に変わっても)起動でき、直ちに運用が継続できる。このためには、kernelに予備機のNICのドライバーも含めておく必要がある。

2. コンパイル作業

# config MYSERVER
以下のメッセージが表示された。
Kernel build directory is ../compile/MYSERVER
Don't forget to do ``make cleandepend; make depend''
作業を続行する
# cd ../compile/MYSERVER
# make clendepend  ← 10秒ぐらいか
# make depend   ← 3分ぐらいかかる
# make       ← 25分ぐらいかかる
# make install    ← 1分ぐらいかかる
# reboot      ← 新kernelを使って再起動

 kernelサイズが、11,783KB → 6,681KB となった。
 測定していないが、起動時間も早くなった感じである。

3. 新カーネルになったことを確認

$ uname -a
FreeBSD uls.fam.cx 8.1-RELEASE FreeBSD 8.1-RELEASE #0:
Fri Dec  3 19:54:02 JST 2010     xxxxxxxx@uls.fam.cx:
/usr/src/sys/i386/compile/MYSERVER  i386

 MYSERVERで作られたkernelとなっている。

4. コンパイルしたkernelに誤りがあり、立ち上がらなかった場合の処理

 下の画面が現れて、カウントダウンしている間にスペースキーを押す。
   なお、/boot/loader.conf でカウントダウン数を、例えば
   autoboot_delay=”3″ (3秒の場合)のように指定できる。← 気の短い人向き (私)
freebsd001.gif

スペースキーで止まったら、6を押して、OKのLoader Promptを出す。
これで、旧kernelで起動するように指定できる。

OK unload     ← 既に読み込まれているモジュールをunload
OK boot kernel.old    ← kernel.oldを使ってbootを指示

再度kernelコンパイルを最初からやり直すことになる。
再度のkernelも起動出来なかった場合、1つ前の起動出来ないkernelがkernel.oldとして保存され、さらにその前の起動出来たオリジナルのkernelは失くなってしまう。
 (1) kernel.old → 喪失   (オリジナルの起動出来たkernel)
 (2) kernel → kernel.old  (構築して起動出来なかったkernel)
 (3) 再コンパイルkernel → kernel(再度のkernelも起動出来ない場合が問題)
これでは、もう起動する手段が無くなってしまうので、再度のコンパイルに先立ち、起動できたkernelをkernel.orgとして保存しておくと良い。

# cd /boot
# mv kernel.old kernel.org

これで、最悪の事態でも、前の図のカウントダウン画面でスペースキーを押し、6を押してOKのPromptを出して、

OK unload
OK boot kernel.org

で、起動できる。


BIND 9.6.2-P2 (DNSサーバ)・・・(FreeBSD)

FreeBSD 8.1を入れたところ、BINDのバージョンが9.6.2-P2になっており、設定方法が変わったので、書いておく。

1. rndc.keyの作成

 BINDをローカル、リモートからコマンドで制御するためのkeyで、これを作成する。
 (使用法は、Netで参照のこと)
以下のコマンドで、rndc.keyが作成される。

# rndc-confgen -a

2. named.confの例

options {
directory       "/etc/namedb";
pid-file        "/var/run/named/pid";
dump-file       "/var/dump/named_dump.db";
statistics-file "/var/stats/named.stats";
listen-on {127.0.0.1; 192.168.1.0/24;};
forwarders {210.188.224.10;};
};
include "/etc/namedb/rndc.key";
controls {
inet 127.0.0.1 allow { 127.0.0.1; } keys { "rndc-key"; };
};
view "internal" {
match-clients {192.168.1.0/24; 127.0.0.0/8; };
recursion yes;
zone "." {type hint; file "/etc/namedb/named.root";};
zone "localhost" {
type master;
file "/etc/namedb/master/localhost-forward.db";
};
zone "127.in-addr.arpa"  {
type master;
file "/etc/namedb/master/localhost-reverse.db";
    };
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/namedb/slave/canal.rev";
allow-update { none; };
};
zone "fam.cx" {
type master;
file "/etc/namedb/slave/canal.zone";
allow-update { none; };
};
//zone "idema-jp.org" {
//        type master;
//        file "slave/idema.zone";
//        };
};
  • masterディレクトリー内
  •  namedbのディレクトリーの中には、masterの名のディレクトリーがあり、
     その中には、
     ・empty.db
     ・localhost-forward.db
     ・localhost-reverse.db
     が入っている。

  • slaveディレクトリー内
  •  slaveディレクトリーは、最初からあるmasterディレクトリー内のファイルと区別するた、新たに作り、その中にゾーンファイルと逆引きのファイルを入れた。

/etc/namedb → named.conf, named.root, rndc.key
    |
    +ー master → empty.db, localhost-forward.db, localhost-reverse.db
    +ー slave → canal.zone, canal.rev

 (1) canal.zone (正引き定義)

$TTL 3600       ; 1 hour
@             IN      SOA   uls.fam.cx.  root.uls.fam.cx.(
2006121601 ; serial
10800      ; refresh (3 hours)
3600       ; retry (1 hour)
3600000    ; expire (5 weeks 6 days 16 hours)
3600       ; minimum (1 hour)
)
IN       NS      uls.fam.cx.
IN       MX      10 uls.fam.cx.
uls            IN       A       192.168.1.5
www        IN       CNAME   uls
ftp            IN       CNAME   uls
uls2          IN       A       192.168.1.6

 (2) canal.rev (逆引き定義)

$TTL 3600       ; 1 hour
@             IN      SOA   uls.fam.cx.  root.uls.fm.cx.(
2006121602 ; serial
10800      ; refresh (3 hours)
900        ; retry (15 minutes)
3600000    ; expire (5 weeks 6 days 16 hours)
3600       ; minimum (1 hour)
)
IN   NS   uls.fam.cx.
5                      IN   PTR  uls.fam.cx.
6                      IN   PTR  uls2.fam.cx.

3. /etc/resolv.conf

nameserver   127.0.0.1

4. /etc/rc.confに次を追加

named_enable="YES"
named_program="/usr/sbin/named"

5. 動作確認例

 googleのIPアドレスを求めてみる。

$ nslookup www.google.com
Server:         127.0.0.1
Address:        127.0.0.1#53
Non-authoritative answer:
www.google.com  canonical name = www.l.google.com.
Name:   www.l.google.com
Address: 66.249.89.104
Name:   www.l.google.com
Address: 66.249.89.99

« Previous | Next »