Warpっぽくいこう

#Counter
File #05 (メールフォルダーの構造)

Contents :
List #01 :Netscape 2.02
List #02 :.snm ファイル構造 その(1), (2)
List #03 :メール構造 (PMMail/2)
List #04 :PCMPMだよ〜ん

PCMPMだよ〜ん -- 2000.11.22

随分遅れての情報公開なんだけど, ついに PCMPMのフォルダー構造の公開。 って, まだ公開の確認とってないや。 事後承諾てことになるかな? ちょっち やばいかも。 (←ぉぃ)

この PCMPMのばやいも, PMMail/2と同じように 一つのメッセージは一つのファイルに収められているのら。 メッセージの数だけファイルがあるのだね。(つーか, ソレが普通なのかも)
んで, ファイル名はとゆーと 数字になっている訳なんだ, コレが。 ・・・ ま, ここまでだったらディレクトリ手繰れば きっと分かるはずにょ。

実は, このメッセージのファイルにはいくつかの謎が隠されている。 まず一つ目は, ファイルの先頭1行分はメッセージと関係ないらしいこと。 なにが入っているのかは分かんない。だって手元にないから。(^^)\(☆バキッ)

そして二つ目は, 拡張属性が付いていて そこにある種の情報が含まれていたりすること。 なんせ拡張属性っつーくらいだからね。いやホント。で, 拡張属性のソレの名前は PCMPM.READMARKだにょ。
その必要な情報ってのが, 11バイト目の未読/既読フラグ。てゆーより 11バイトしかないのかな。 ちょっと分かんないや。なんせ手元にないから。(^^)\(☆ドカッ)

さて, そのディレクトリには数字のファイル名を持つ物の他にも ファイルがあることに気付くだろう。

てゆーことで, FIRST.PMSに入っている番号から NUMBER.PMSに入っている番号の一つ手前までが, そのフォルダーに存在しているメッセージのファイルってことなのら。たぶん。

んで, 今度はプログラムから PCMPMのフォルダーの位置をアレする方法をお教えしよう。ふふふふふ, あははははー。

まずは, 環境変数PATH から PCMPM.EXEを探し出すってことになる。 ちなみに σ(^^)メールDB 編集では どーやってるかっつーと, PATHに指定していないことも考慮して すべてのディレクトリを探索していたりなんかする。 でも, 毎回ソレだったら遅過ぎな訳で, 勝手に <PCM/PM_EXE> とゆーオブジェクトIDで Workplace Shellに登録していたりするにょ。 おちゃめー。 時間がある人は, どーやってるか眺めてみよー。混乱すること請け合いかも。

PCMPM.EXEが見つかったら, そこに PCMPM.INIも見つかることだろー。って, 最初からコレ探せばいいんじゃないのけ? まっいいか。
その PCMPM.INIには, PCMPMの中の path のとこに, メールが入っているフォルダーの位置のよーなのが入っているのら。 んで, そこからディレクトリを調べていくと お宝が ・・・ って訳。

Rexxのプログラムにすると↓こう。エラー処理は省いてあるもん。

inif = /* PCMPM.EXE があるとこの*/'PCMPM.INI'
base = SysIni(inif, 'PCMPM', 'path')
if DBRight(base, 1) \== '\' then base = base'\'
base = base'Folder'

call SysFileTree base'\', 'file', 'DO'
do i = 1 to file.0
   fname = file.i
   Rc = SysGetEA(fname, 'PCMPM.FOLDER.NUMBER', 'ea')

   say fname '('substr(ea, 11)')'
end

ところで, ↑の拡張属性ってなんだっけ。(^^;

さてさて, PCMPMも 古い版では, こんなじゃなかったはず。てことは もしかすっと今の PCMPMでは管理方法が違うのかも。 違ってたらごめんしてちょ。

次回は, ・・ そう 次回もあったりするもん。ソレは Polarbar Mailかも。だけど予定は未定てことだもん。
・・てことで, うじゃ。(^^)/~


メール構造 (PMMail/2) -- 2000.5.11

PMMail/2 ・・ ソレは英語版のメーラーのことだ。 だけど, RxJisか それとも 上野博さんとこDeleGate で, 日本語が通るよーになるはずだ。きっと。
このメーラーって どれくらいの人が使ってんのか知らないけど, 見た目は結構よさげ。 てことで, その一部の構造を公開しよう。ふっふっふ。

まずは手始めに, ソレがインストールされているかどーか, コレについて調べてみよう。
とりあえず「デスクトップ」にソレのフォルダーがあるかどうかアレしてみて ・・・ とゆーのはウソ。 ホントは, ユーザー INIファイルの PMMail/2InstallRoot を調べてみると分かるのだ。 Rexxで見てみると (↓)こう。

/* PMMailが導入してある場所を表示してみる */
call RxFuncAdd 'SysLoadFuncs', 'rexxutil', 'SysLoadFuncs'
call SysLoadFuncs
say SysIni('User', 'PMMail/2', 'InstallRoot')

エラーが表示されたら失敗だ。じだんだ踏んで悔しがろう。

んじゃ次に, メールフォルダーの場所を見つけてみよう。
先ほどのディレクトリからたどっていくと *.ACT と, ゆーディレクトリがあって, さらにそこからラッキョのごとく *.FLD とゆーフォルダーが見つかる。ブツはその中だ。ぐふふふふ。 (← なんだ, ラッキョって)

一つ一つのメッセージは, それぞれ別ファイルに収められてて, そーゆー意味で Netscapeとはちと違う。 アレは幾つかのメッセージがまとめて一つになってるからね。 んで, *.FLD の中には FOLDER.BAG っつーファイルが見つかる。 コレが一つ一つのメッセージを管理しているファイルなのだ。

さて, これでよーやく一歩手前まで到達したって気がする。 ・・・ 気がするだけかもしれないけど, 先に進んでみよう。 この FOLDER.BAG はテキスト形式になっていて, 1行分の構造は(↓)このよーになっている。 あ, 項目の区切りはなぜか 0xde ね。

  1. 0 なら未読 (16進数?)
  2. 不明
  3. 日付
  4. 時刻
  5. Subject
  6. To
  7. To の名前
  8. From
  9. From の名前
  10. サイズ (KB単位)
  11. ファイル名
  12. 不明
  13. ファイルサイズ

ここまで来たら, あとは 11番目の項目に記されているファイル名を使って, 内容を読みだすだけだ。あぁ, よくぞここまで ・・・ (←何が)
メッセージが収められているファイルには, メッセージのヘッダとボディとが空行を隔てて書き込まれている。 プログラムでアレしたりコレしたりするばやい, そのことに注意しておこうね。

何だかすっかり更新を忘れてたよーなこのページ。実はアレについて書いておこうとかメモはあったんだけど, すっかし忘れてた。 ま, いいか。 うじゃ (^o^)/~


.snm ファイル構造 その(1), (2) -- 2000.3.2, 2000.3.8

てことで, Netscape 2.02のメール関係の *.snmファイルの構造なのであ〜る。

ここには, 実際のメッセージ・テキストを高速に扱うことができるよーに ・・・ だか何だかのため, いろんな情報が収められている。 この情報を使って, なにかのプログラムを作ってもいいかもしんない。
けどねー, 2.02 じゃバージョン低いからねー, やっぱダメだね。(^^;

さて, このファイルの先頭には, テキストで 1行だけ IDっぽいのが入っていて, それには ・・・ # Netscape folder cache などとゆーふーになっている。
そんで, その後にはバイナリで, 次のよーな順番で各種の情報が入ってんのだ。

  1. 各種件数とか日付とか各種サイズとかいろいろ
  2. キャッシュ(?) ・・・ 文字列の配列で, 添字は 0から
  3. 各メッセージ毎に, いろんな情報が ・・

では, 最初の「各種のアレ」ってヤツを見ていくことにしよう。

.snm ファイルの先頭の構造
項目名(?)サイズ
文字列 "# Netscape folder cache"1行
不明4 Bytes
ファイルのサイズ4 Bytes
ファイルの更新日付4 Bytes
何かの位置?4 Bytes
全体の件数4 Bytes
実際の件数4 Bytes
未読件数4 Bytes
移動・削除した長さ4 Bytes

・・・ こんなとこかな。

んで, (↑)の続きだよん。(^^)
ヘッダーっぽいものの後には, 文字列がどどどーんと入っている。

.snm ファイルの中ほどの構造
文字列の件数2 Bytes
0x00で終わる文字列「文字列の件数」の数だけある

・・・ なんて単純なんだろ。
で, この文字列は何かっつーと, この後に続く「各メッセージの情報」から参照されている訳なのだ。 参照は, 番号でアレされていて, まるで文字列の配列みたいに扱われることになってるにょ。
んで, 最初にも書いたように, この添字は 0から始まるんだもーん。

で, お次は, 各メッセージの情報。
ここには, 「メッセージが格納されているファイル」の, 各メッセージの内容が, アクセスしやすいように整然と並んでいるのだ。
てことで, この構造は, メッセージの数だけ並んで入っている (「全体の件数」の数だよー)。

.snm ファイルの後半の構造
項目名(?)サイズ
From文字列の添字 2 Bytes
To文字列の添字 2 Bytes
Subject文字列の添字2 Bytes
Date(time_t形式) 4 Bytes
不明 2 Bytes
status情報 2 Bytes
「メッセージファイル」のオフセット4 Bytes
このメッセージの長さ 4 Bytes
メッセージ内の X-Mozilla-Statusの位置2 Bytes
メッセージの行数 2 Bytes
Message-ID文字列の添字2 Bytes
参照(?)数 2 Bytes
参照(?)文字列の添字2 Bytes × 参照(?)数

あ〜〜, 何だかコレ(↑)って意味不明な日本語になってる気がする (^^;
てなことで, うじゃ (^o^)/~


Netscape 2.02 -- 2000.2.21

なんと今回, Netscape 2.02のメーラーについての話。
うーみゅ, ちょー遅過ぎって感じがしないでもないね。へへへっ。

実は, Palmデバイス系のソフトウェアを開発するってなとき, いろんなメーラー調べてくうちに, このメーラーのことも何となく分かったっつーことなのにゃ。 だがしかーし, 『2.02』, つまり(現在の)最新の『4.61』ではにゃ〜い。 『4.61』について何か分かったらアレするかもしれないけど, トホーもなく変わっちゃってるから無理かも。(T-T)

で, そのメールフォルダのことなんだけど, コレって(ディレクトリじゃなく)単なるファイルになってるのだ。 つまり「Inbox」「Trash」とゆーフォルダだったら, 二つのファイルってことだね。 ここまでは, Netscapeのディレクトリ覗くと, よ〜く分かるはずだっ。

このメールフォルダの中にあるメッセージはどーゆー形式になってるのか? ・・・ それはだね, まんま通信した時のイメージで入ってんのさっ。 ヘッダも通常のやつだし, 漢字は(メール送受信に使われる)JISコードで入ってるはずだし, 添付ファイルもそのまんま。
でも, たくさんのメッセージを一つのファイルに収めてる訳で, メッセージの区切りとかが必要になる。 ソレがないと Netscapeはメッセージの一覧さえ表示できなくなってしまう。 ソレが『From - Mon Feb 21 01:02:03 2000』などと記されている行なのだ。 行頭に『From -』から始まるのがあるとそーゆーことになるらしい。
もひとつ, メッセージではない部分ってのがある。ソレがコレ『X-Mozilla-Status:』。 ヘッダの中にソレが入ってて, 4桁の 16進数らしくって, フラッグか何からしい。

X-Mozilla-Status:
推測できる意味
0000取り込んだばかりの状態? (未読)
0001メッセージを読んで, 緑が消えた状態
0004赤い旗を立てた状態
0008メッセージが存在しない状態(移動とか削除)

← ほかにもいろいろあって, 「8001」とか見かけるんだけど, ・・・ 意味分がんね。(T-T)

んで, メールフォルダがあるところに「*.snm」なんてゆーのが見つかる。
では次に, コレの構造を紹介 ・・・ と思ってる間に, T.V.を見る時間が来てしまった。うじゃ (^o^)/ (←こら)