日記/2010-4-1

最終更新時間:2010年04月01日 21時38分21秒

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

 ちょこちょこっと書き換えたらすぐに動いちゃったので、全然デバッグしてません。バグってたらごめんなさい。

参考