Mailman Tips 5Mailman Tips 6Mailman Tips 7
2009-06-02 (火) 10:37:31
こんどは、あるメーリングリストの過去ログをアクセスの.mdbで検索・閲覧出来るようにしているCD-ROMからのデータの取り出しと書庫へのマージである。
今回の.mdb のメールデータは、csv形式でエクスポートしたが、このとき、セパレータは、メールデータには含まれない文字にしておくとよい。今回は"{"を使用した。
あらかじめスキャンして含まれない文字を指定したが、それでも、いくつか文字化けが発生した。原因は、特定の文字配列で、文字コードにデリミネータが含まれるため、cut コマンドが、予期しないところでファイル分割してしまったための様だ。結局はデリミネータ前後の文字を含めて対処した。
データは4つのパートで、通し番号5桁、タイトル、日時、本文である。つまり、殆どヘッダー情報がない、とも言える^^;
リファレンスヘッダがないので、スレッド表示は不可能だな、こりゃ・・・
何のことかと言えば、とあるMLの過去ログのCD-ROMを、現在運用中のMLの書庫にマージしようという試みであります。配布された過去ログCD-ROMは、eml形式の一メール一ファイル。文字コードはJIS。で、問題のSubject:は、JISのまま・・・・。
一方のMailman で扱うメールデータはmbox形式で、CD-ROMのSubject:がそのままだと、当然?保存書庫上では文字化けとなり読めません。
そこで、必要な作業が、
これは、ちょっと姑息?ながら、Windowsで稼働するBecky!2をつかって、emlをインポートして、mbox形式でエクスポートした。
因みに、Becky!2上ではSubject:がJISであっても問題なく読める。
これにはシェルスクリプトで対応してみた。元のメールヘッダが、
From foo@example.com Thu Mar 16 12:58:53 2000 From:ABC <foo@example.com> To:foo@example.net Subject:T00576:日本語のメールタイトル Date:Thu, 16 Mar 2000 12:58:53 +0900 X-Priority:3 Status:R
のようになっていて、Subject:の後にすぐ文字列がある。このままだと、nkf -M したときに、「Subject:」そのものまでエンコードされたので、Subject:のあとに半角スペースを入れて対処した。
また、2009年2月21日以後、nkf が2.0.9になり、
piano:root {699} % nkf -V Summary of my nkf 2.0.9 (2009-02-21) configuration: Compile-time options: Compiled at: May 28 2009 12:06:22 Default output encoding: LOCALE (EUC-JP) Default output end of line: LF Decode MIME encoded string: ON Convert JIS X 0201 Katakana: ON --help, --version output: STDOUT
ということで、config.hでデフォルトのエンコーディングを変更されたみたいで、nkf -Mj とした。 SubjectMIME_Encode7.sh
#!/bin/sh #MIME_Encodeされていないメールヘッダを修正する #行の中にSubject:という文字列があればその行をMIME Encode 変換するが、それ以外はそのままファイルへ出力する #/usr/local/mailman/archives/private/M_Linst_Name ./SubjectMIME_Encode7.sh #cd /usr/local/mailman/archives/private/Mlist_Name.mbox time #time ./SubjectMIME_Encode7.sh cp FL.temp FL.temp.back cp FL1.temp FL1.temp.back cp Mlist_Name.mbox.temp Mlist_Name.mbox.temp.back sleep 3 rm -f Mlist_Name.mbox.temp Mlist_Name.mbox.temp0 Mlist_Name.mbox.temp1 FL.temp FL1.temp LINo.txt log.txt Mlist_Name.mbox.temp2 Mlist_Name.mbox.temp3 sleep 3 cp Mlist_Name.mbox.test Mlist_Name.mbox.temp touch Mlist_Name.mbox.temp_sp touch FL.temp touch FL1.temp touch LINo.txt touch Mlist_Name.mbox.temp touch Mlist_Name.mbox.temp0 touch Mlist_Name.mbox.encoded sleep 3 echo "読み込むファイル名 Mlist_Name.mbox.test" sed -e "s/ /┼/" -e "s/Subject:/Subject: /" Mlist_Name.mbox.test > Mlist_Name.mbox.temp_sp # 行数カウンタを初期化 line_no=1 # read コマンドで読み取れなくなるまでループ while read -r LINE do # sleep 1 count=`echo "$LINE" | wc -c` echo "$line_no行目: $count文字 : $LINE" line_no=`expr $line_no + 1` case "$LINE" in *=?ISO-2022-JP?B?*) echo "$LINE" >> Mlist_Name.mbox.temp0 ;; Subject:*) echo "$LINE" > FL.temp | sed -e "s/┼/ /" FL.temp > FL1.temp && nkf -Mj FL1.temp >> Mlist_Name.mbox.temp0;; *) echo "$LINE" >> Mlist_Name.mbox.temp0;; esac #sed -e '$LNNo s/$before/$after/' Mlist_Name.mbox.temp #変数を使用するときは「$」を打ち消さないように「"」を使用する #変数は値に展開されてから sed コマンドに渡される必要があるため、 #「'」(シングルクォーテーション)で囲んで「$」をエスケープしてはいけない。 done < Mlist_Name.mbox.temp_sp sed -e "s/┼/ /" Mlist_Name.mbox.temp0 > Mlist_Name.mbox.encoded echo "処理は終了しました" exit 0 #diff Mlist_Name.mbox.test Mlist_Name.mbox.temp1 > Mlist_Name.mbox.temp_1.diff #time ./SubjectMIME_Encode7.sh
cat Mlist_Name.mbox.encoded >> Mlist_Name.mbox
/usr/local/mailman/bin/arch --wipe Mlist_Name