Mailman Tips 5Mailman Tips 6Mailman Tips 7

2009-06-02 (火) 10:37:31

Mailman Tips 8

Mailheaderの復元

こんどは、あるメーリングリストの過去ログをアクセスの.mdbで検索・閲覧出来るようにしているCD-ROMからのデータの取り出しと書庫へのマージである。

今回の.mdb のメールデータは、csv形式でエクスポートしたが、このとき、セパレータは、メールデータには含まれない文字にしておくとよい。今回は"{"を使用した。

あらかじめスキャンして含まれない文字を指定したが、それでも、いくつか文字化けが発生した。原因は、特定の文字配列で、文字コードにデリミネータが含まれるため、cut コマンドが、予期しないところでファイル分割してしまったための様だ。結局はデリミネータ前後の文字を含めて対処した。

データは4つのパートで、通し番号5桁、タイトル、日時、本文である。つまり、殆どヘッダー情報がない、とも言える^^;

リファレンスヘッダがないので、スレッド表示は不可能だな、こりゃ・・・

/usr/local/mailman/Mailman/Archiver/pipermail.py

# The Article class encapsulates a single posting.  The attributes
# are:
#
# sequence   : Sequence number, unique for each article in a set of archives
# subject    : Subject
# datestr    : The posting date, in human-readable format
# date       : The posting date, in purely numeric format
# headers    : Any other headers of interest
# author     : The author's name (and possibly organization)
# email      : The author's e-mail address
# msgid      : A unique message ID
# in_reply_to: If != "", this is the msgid of the article being replied to
# references : A (possibly empty) list of msgid's of earlier articles
#              in the thread
# body       : A list of strings making up the message body

Mailman Subject: のMIMEエンコード

何のことかと言えば、とあるMLの過去ログのCD-ROMを、現在運用中のMLの書庫にマージしようという試みであります。配布された過去ログCD-ROMは、eml形式の一メール一ファイル。文字コードはJIS。で、問題のSubject:は、JISのまま・・・・。

一方のMailman で扱うメールデータはmbox形式で、CD-ROMのSubject:がそのままだと、当然?保存書庫上では文字化けとなり読めません。

そこで、必要な作業が、

  1. eml形式をmbox形式へ変換する
  2. Subject:をMIMEエンコードする
  3. 変換後のmboxを既存のmboxへマージする
  4. 保存書庫の再構築
  5. ついでにNamazuのデータベースも再構築

eml形式をmbox形式へ変換する

これは、ちょっと姑息?ながら、Windowsで稼働するBecky!2をつかって、emlをインポートして、mbox形式でエクスポートした。

因みに、Becky!2上ではSubject:がJISであっても問題なく読める。

Subject:をMIMEエンコードする

これにはシェルスクリプトで対応してみた。元のメールヘッダが、

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

変換後のmboxを既存のmboxへマージする

cat Mlist_Name.mbox.encoded >> Mlist_Name.mbox

保存書庫の再構築

/usr/local/mailman/bin/arch --wipe Mlist_Name

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-06-02 (火) 10:37:31