[[Mailman Tips 6]]
#contents
&lastmod;
*Mailman Tips 7 [#cf13d0d1]
**Mailman Subject: のMIMEエンコード [#xcf4e42c]
何のことかと言えば、とあるMLの過去ログのCD-ROMを、現在運用中のMLの書庫にマージしようという試みであります。配布された過去ログCD-ROMは、eml形式の一メール一ファイル。文字コードはJIS。で、問題のSubject:は、JISのまま・・・・。

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

そこで、必要な作業が、
+eml形式をmbox形式へ変換する
+Subject:をMIMEエンコードする
+変換後のmboxを既存のmboxへマージする
+保存書庫の再構築
+ついでにNamazuのデータベースも再構築

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

因みに、Becky!2上ではSubject:がJISであっても問題なく読める。
**Subject:をMIMEエンコードする [#h96f0d72]
これにはシェルスクリプトで対応してみた。元のメールヘッダが、
 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/tfc.mbox time 
 #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 tfc.mbox.temp tfc.mbox.temp.back
 cp Mlist_Name.mbox.temp Mlist_Name.mbox.temp.back
 sleep 3
 rm -f tfc.mbox.temp tfc.mbox.temp0 tfc.mbox.temp1 FL.temp FL1.temp LINo.txt log.txt tfc.mbox.temp2 tfc.mbox.temp3
 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 tfc.mbox.test tfc.mbox.temp
 touch tfc.mbox.temp_sp
 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 tfc.mbox.temp
 touch tfc.mbox.temp0
 touch tfc.mbox.encoded
 touch Mlist_Name.mbox.temp
 touch Mlist_Name.mbox.temp0
 touch Mlist_Name.mbox.encoded
 sleep 3
 echo "読み込むファイル名 tfc.mbox.test"
 sed -e "s/ /┼/" -e "s/Subject:/Subject: /" tfc.mbox.test > tfc.mbox.temp_sp
 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" >> tfc.mbox.temp0 ;;
 		Subject:*)	echo "$LINE" > FL.temp | sed -e "s/┼/ /" FL.temp > FL1.temp && nkf -Mj FL1.temp >> tfc.mbox.temp0;;
 			*)	echo "$LINE" >> tfc.mbox.temp0;;
 		*=?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/' tfc.mbox.temp
 #sed -e '$LNNo s/$before/$after/' Mlist_Name.mbox.temp
 #変数を使用するときは「$」を打ち消さないように「"」を使用する
 #変数は値に展開されてから sed コマンドに渡される必要があるため、
 #「'」(シングルクォーテーション)で囲んで「$」をエスケープしてはいけない。
 		done < tfc.mbox.temp_sp
 		sed -e "s/┼/ /" tfc.mbox.temp0 > tfc.mbox.encoded
 		done < Mlist_Name.mbox.temp_sp
 		sed -e "s/┼/ /" Mlist_Name.mbox.temp0 > Mlist_Name.mbox.encoded
 	echo "処理は終了しました"
 	exit 0
 #diff tfc.mbox.test tfc.mbox.temp1 > tfc.mbox.temp_1.diff
 #diff Mlist_Name.mbox.test Mlist_Name.mbox.temp1 > Mlist_Name.mbox.temp_1.diff
 #time  ./SubjectMIME_Encode7.sh
**変換後のmboxを既存のmboxへマージする [#k6c93406]
 cat tfc.mbox.encoded >> tfc.mbox
 cat Mlist_Name.mbox.encoded >> Mlist_Name.mbox
**保存書庫の再構築 [#l8f8c123]
 /usr/local/mailman/bin/arch --wipe tfc
 /usr/local/mailman/bin/arch --wipe Mlist_Name

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS