PostPet2001 のおともだち帳

よんどころない事情にて mbox 形式のメールファイルの From 欄を抜き出して、PostPet2001 for Windows のおともだち帳を作らなくてはならなくなりました。

  まず、ポストペットのアドレス帳形式なんて知らないので、まずは google で検索してみますが、からっきしヒットしません。仕方ないので、自分で調べることにしました。以下、作業は cygwin のコンソール上で行います。
 まず数件の適当なデータのみのアドレス帳を作り、直接エディタで開いてみます。が、さすがにバイナリデータのようでうまく表示されません。ただし、入力したペットの名前などはそのまま入っているようです。  次に、HEX ダンプをみてみます。od -x すると割と簡単にだいたい以下のようなレコード形式だということがわかりました。

先頭4バイト:ペットの種類。
0がポストマンのようです。
ペットの名前
可変長(<255文字) の Shift-JIS パスカル文字列。名無しなら NULL 文字(0x00)。
飼い主の名前
可変長(<255文字) の Shift-JIS パスカル文字列。名無しなら NULL 文字(0x00)。
メールアドレス
可変長(<255文字) の ASCII パスカル文字列。
末尾4バイト:セパレータ。
すべて0(00 00 00 00)。
※パスカル文字列というのはNULLで終わるのではなく先頭に1バイトで文字列長を置く文字列形式です。

というわけで、ペットの種類は「ポストマンに固定」かつペットの名前は「なし」にして、 From 欄の名前を「飼い主の名前」にするといった仕様でよさそうです。

  あとはフィルタを作るだけです。同じ人からの複数のメールから複数のおともだち帳レコードを作らないようにするのに sort と uniq コマンドを使いたかったので、前処理(mboxからメールアドレスと名前を抜く)と後処理(メールアドレスと名前からアドレス帳を生成)用の2つの Perl スクリプトを書くことにしました。
  後処理はこんな感じです。

#後処理では、前処理で
# 名前\tメールアドレス
#という形式で書き出したファイルを sort|uniq したものを読み込みます。

$separator = pack("CCCC",00,00,00,00);
$dammy = pack("C",00);

while(<>){
	$line = $_; 
	$line =~ s/^M//;
	($name,$address) = split(/\t/,$line);
	$nlength = pack("C",length($name));
	$alength = pack("C",length($address));
	printf $separator.$dammy.$nlength.$name.$alength.$address.$separator;
}

  というわけで、無事おともだち帳を生成することができました。

関連ページ
What's New
関連レビュー
Cygnus GNU-Win32(1999.11)
Cygwin -CYGNUS GNU Win32-(2)(2001.1)

(2002.2.11)