日記/2010-4-1
mhonarcの出力ファイル名の数字を特定のフィールドから決める場当たり的改造
mhonarcは、メールのデータをHTMLに変換するperlで書かれたソフト。
これで変換すると、1通のメールが1つのHTMLファイルとなって出力されるのですが、そのファイル名は「msg00000.html」のようなもの。プレフィックスの「msg」は指定することができるのですが、「00000」の部分については、常に0から始まる連番となります。
この番号を、メーリングリストのそれに基づくものにしたくはないでしょうか。例えば、表題が「[NE:1365] 大当たり!」というメールであれば、その出力ファイル名を「msg01365.html」にしたい、ということです。
実はこの機能、こちらのページで紹介されているパッチですでに実現されています。一般に、上で挙げたような表題になるメーリングリストのメールの場合、ヘッダには「X-Mail-Count」というようなフィールドが設けられていて、それが「X-Mail-Count:1365」という風に設定されています。このフィールドの値を用いて、出力ファイル名の数字の部分の値を決めるという機能が、このパッチで提供されているわけです。
しかしながら、このパッチはmhonarcのバージョン2.4.6に対するものであるため、そのままでは、2010/04/01時点での最新バージョン2.6.16には適用できません。
そこで、このパッチの、出力ファイル名の数字を指定したフィールドから決める機能に関する部分について、バージョン2.6.16に適用できるようにしてみました。
--- mhamain.pl.org 2006-06-10 11:42:58.000000000 +0900 +++ mhamain.pl 2010-03-26 19:58:59.000000000 +0900 @@ -770,7 +770,7 @@ sub read_mail_header { my $handle = shift; my($date, $tmp, $i, $field, $value); - my($from, $sub, $msgid, $ctype); + my($from, $sub, $msgid, $ctype, $seq); local($_); my $index = undef; @@ -926,6 +926,14 @@ @refs = remove_dups(\@refs); # Remove duplicate msg-ids ##------------------## + ## Get seq number ## + ##------------------## + if (defined($SEQNUMFIELD)) { + $seq = $fields->{$SEQNUMFIELD}[0]; + $seq =~ s/(\d+)/$1/; + print STDOUT "($seq)"; + } + ##------------------## ## Get Content-Type ## ##------------------## if (defined($fields->{'content-type'})) { @@ -938,6 +946,10 @@ ## Insure uniqueness of index $index .= $X . sprintf('%d',(defined($msgnum)?$msgnum:($LastMsgNum+1))); + if (defined($SEQNUMFIELD)) { + $IndexNum{$index} = $seq; + } + ## Set mhonarc fields. Note how values are NOT arrays. $fields->{'x-mha-index'} = $index; $fields->{'x-mha-message-id'} = $msgid; @@ -964,7 +976,11 @@ $IndexNum{$index} = $msgnum; ++$NumOfMsgs; # Counteract decrement by delmsg } else { + if(defined $SEQNUMFIELD) { + &getNewMsgNum(); + }else{ $IndexNum{$index} = getNewMsgNum(); + } } $Refs{$index} = [ @refs ] if (@refs);
--- mhopt.pl.org 2005-07-08 15:34:03.000000000 +0900 +++ mhopt.pl 2010-03-26 19:34:02.000000000 +0900 @@ -216,7 +216,8 @@ 'readdb', # Just read db 'v', # Version information - 'help' # A brief usage message + 'help', # A brief usage message + 'seqnumfield=s', # Sequence number field name ); ## Check for help/version options (nothing to do) @@ -548,6 +549,8 @@ $IdxPageNum = $opt{'pagenum'} if defined($opt{'pagenum'}); + $SEQNUMFIELD = $opt{'seqnumfield'} if defined($opt{'seqnumfield'}); + $AttachmentDir = $opt{'attachmentdir'} if defined($opt{'attachmentdir'}); $AttachmentUrl = $opt{'attachmenturl'} if defined($opt{'attachmenturl'});
上記のパッチをあてると、以下のようにオプション「-seqnumfield」で、出力ファイル名の数字を決めるフィールドを指定することができるようになります。
mhonarc -seqnumfield x-mail-count -rcfile default.rc -outdir outdir/ input.mbox
ちょこちょこっと書き換えたらすぐに動いちゃったので、全然デバッグしてません。バグってたらごめんなさい。
参考
- MHonArc で日本語を使うときに幸せになれるパッチ
- こちらで提供されているパッチを元にしました。ありがとうございます。