カテゴリ:今日もまた老年プログラマー( 14 )
メールの内容確認
 1月20日 メール内容表示プログラム

f0066555_15414969.jpg いきなり、テキストファイルを出力する前に、メールファイルの内容を表示させるプログラムを作成。
 入力するファイルの拡張子が、dbxかidxにより、OEかBeckyかを区別し、それぞれのメールを読み込み、表示している。
 =前のメールを表示、=次のメールを表示等の機能の他に、(メールは30行表示するようにしているので)=メールの続きを表示の機能がある。 は(すぐ前の部分でなく)そのメールの先頭まで戻る。

 メールの内容は、Received:とか、Return-Path:とかのキーワード、テキスト形式のメール本文が続き、HTML形式のメールの場合それが続き、添付ファイルがある時は、/9j/4R3JRXhp等の文字列が続きます。

 これで完成!…と思っていたところ、妙な文字列が続くメールがあることに気づく。 色々調べた結果、charset="utf-7"となっていることに気づく。 エンコードがJISでなく、UTF-7だと分かる。 これも、インターネットで調べ、デコードできるようにする。
 比較的最近になって、知り合いになった方からのメールでした。 今後も未だ知らないメールの約束事を発見するたびに、手直しが必要になってくるでしょう。

 1月27日 キーワードとメール本文の区別

 テキストファイルとして保存したいのは、FROM:、TO: 、DATE:、SUBJECT:の各キーワードとテキスト形式のメール本文としました。
 が、これが意外と厄介です。 キーワードをすべてリストアップするとなると、(見当違いかもしれないが)メールソフトやメールサーバごとに、違うものがあるのではないかと思います。
 もっといい方法があるかもしれませんが、手探りで進めていくことになりました。
 また、たまたま使っているOEとBeckyのメールソフトだけに関するプログラムとなりますが、まあ自分用に作るプログラムですから、それでいいでしょう。 これはいいものだと自信が持てるようであれば、将来他の方にもお勧めすることがあるかもしれませんが。
[PR]
by t_ichib | 2006-01-27 20:04 | 今日もまた老年プログラマー
プログラム作成の準備
 1月11日 OutlookExpressのフォーマットは

 家内が近所の美容院に。 この間にまた、パソコンを…。

 先日作成したファイルダンプで、受信箱.dbxを調べる。(印刷したdbxファイルの説明書と首っ引きで)

 ファイルヘッダとか、ファイル情報だとかは良く理解できないが、相対アドレス:2B24番地に最初のインデックスヘッドがある。 (少なくとも私のパソコンでは)
f0066555_20435416.jpg


 その部分を16進表記で見ると、
 242B 0000 F401 0000 0000 1401 805F 0000 0100 0000 0204 0000 84D4 EA00
①       ②           ③                             ④
① オブジェクトマーカ: アドレスと同じ数値が入ります。(ヘッド部分は12バイト) ≠の時はインデックスの終り
② 使用されているインデックス領域のバイト数(ヘッドを除く)、次のインデックスヘッドは12+500(=1F4)バイト後にあります。
③ インデックス情報(各4バイト)の個数、20個(=14) 0の時は未使用のインデックス
④ メッセージ本体のポインター アドレス:EAD4

 メッセージの情報は
D4EA 0000 0002 0000 0002 0000 E4EC 0000 5265 7475 726E 2D50
①                ②       ③
① オブジェクトマーカ: アドレスと同じ数値が入ります。(ヘッド部分は16バイト)
② メッセージのバイト数
③ 同じメッセージの次のブロックのアドレス 0の時は、そのメッセージの終り
 この後の5265…以下は、メッセージの内容です。 (Return-P)

 1月14日 Beckyのインデックスは

 OutlookExpressの場合は、メール本文へのインデックスがありましたが、Beckyの場合もインデックスがあるのではないかと調べてみました。
f0066555_1512680.jpg すると、ありました。 右の図のFolder.idxというのがインデックスファイルです。
|bb6e6f8|3eb19ca8|(メールのタイトル) という文字列がありました。
3eb19ca8は右の図の3eb19ca8.bmfというファイルを、はそのファイルのなかのアドレスを指していました。
一つ一つのインデックスは、復帰改行コード(16進0D0A)で区切られています。

 これで、OutlookもBeckyもファイルを指定したら、インデックスを読みそのインデックスからメールを取り出すという同じ手順でプログラム化できます。
[PR]
by t_ichib | 2006-01-14 20:25 | 今日もまた老年プログラマー
ファイルダンプのプログラム
 12月30日 =に悩まされたが

 家内が元の職場の人に誘われて、お餅つきに出かけた。 昼少し前に出て、夕食も終わった8時過ぎに帰って来た。 久しぶりにもとの職場のメンバーが顔を揃え、話がはずんだようだ。

 前回までに、少し仕組みが分かってきたので、Beckyのファイルを読み込んで、BASE64のデコード・JIS⇒シフトJIS変換をしながら、テキストボックスに表示するプログラムを作ってみる。
 iso2022-jp、?=などの開始と終りのキーワードを検出するなど、大分プログラムが複雑になる。 …と、実行エラー。

 漢字だから、偶数バイトでないといけないのに、奇数バイトになっている。 文字列が次の行に継続する時、行末にが使われるようだ。

 2行をくっつけて、JIS⇒シフトJIS変換をするようにする。 が、文章の途中から妙な文になる。 妙な表現になる元の文字列を見ると、またもやの位置。

 どうやら、Escコード(16進で1B)、スペース(16進で20)、=(16進で3D)が文字列の中にあると、=1B、=20、=3Dとしている。 (これもインターネットのどこかで説明があったかも)

 それを修正して、再度 xxxx.bmf を見てみると、やったぞ。 後ろの方に写真などの添付ファイルらしき文字列があるが(当面無視)、前の方にはメールヘッド・テキストが正しく表示されている。

 1月7日 プログラム作成

 家内が元の職場の人とお茶をしに行った。 じゃ、パソコンにむかって…

 前回、Beckyのメールファイルの中味が少し分り、気をよくして、OutlookExpressの受信箱.dbx をやはり前回作成したプログラムで見てみた。 が、文字化けがひどく何がなんだか分からない。 
 しかも、数行表示しただけ…。 どうやら、Beckyのようなシーケンシャルファイルではなく、特殊なファイル構造のようだ。

 実は年末年始の2~3日、インターネットでそれを調べていた。

 dbxファイルは、一つのファイルの中が、ファイルヘッド、インデックス情報、メッセージ、その他色々に分かれている。 それを確認するためには…。
f0066555_1457564.jpg
 昔、作った事があるファイルダンプのプログラムを作ってみた。

 テキストボックスを2つ配置して、一方には16進コードの表示、もう一方にはASCコードを表示する。 (判別がつく場合は、BASE64をデコードし、JIS⇒シフトJIS変換した文字列を表示する。)

 現在表示している位置より前の画面・次の画面を表示する機能、指定されたアドレスへジャンプして表示する機能、文字列の検索(ASCコード・JISコード・16進コード)機能等をつけた。

 右のプログラムの画面にたどり着くまでに、数回作り変えた。 まあ、今回の目的にあったファイルダンププログラムができた。
[PR]
by t_ichib | 2006-01-07 20:35 | 今日もまた老年プログラマー
メールをテキストファイルで保存
 12月20日 きっかけは

 前から、不安に思っていたこと。
 「メールが満杯になったらどうしたらいい」、「トラブルでメールが消えたらどうしよう」

 私はBeckyとOutlookExpressを使っています。 これをテキストファイルとして保存したらいいんじゃないかと常々思っていました。 やってみようか。
 まずメモ帳で C:¥becky以下のメールの保存領域 xxx.bmf を見てみる。

Return-Path:...   とbeckyのヘッダで見覚えのあるキーワードがある。 が、
Subject: =?iso-2022-jp?B?GyRC...  と、これは何だ。 それに後ろの方の
$B=U$rO"$l$F$-$?:y$N2V$,%...  など訳の分からない記号は?

 と言う訳で、さっそくインターネットで調べてみる。

 なんとか分かった。 BASE64変換とか。

 通信では、8ビットは使えず、7ビットを用いている。(昔聞いたパリティビットと関係あるのか?) とにかく、
① 8ビットの文字×3バイトを6ビット(頭2ビットには0を詰める)×4バイトにする。
② 変換前の文字列が3の倍数でない時は足りないビットに0を詰める。
③ 結果の各バイトは、(6ビットなので)0~63の数値になっている。 それを
 0~25⇒英大文字のA~Z、26~51⇒英小文字のa~z、52~61⇒数字の0~9、62⇒記号の+、63⇒記号の/
 と変換している。
④ 結果のバイト数が4の倍数にならない時は、=を詰めて4の倍数にしている。
 この操作をエンコードといい、そして、その文字列を「?iso-2022-jp?B?」と「?=」とで、囲んでいる。 逆の操作はデコードというそうだ。

 カタカナの「ア」のJISコードは16進コードで、2522なのでビットで表すと、

    00100101  |  00100010     となるので

  00001001|00010010|00001000  に変換される。 (最後の00は②により詰めた。)

 ③と④により、結果はJSI=という文字列になる。

 この反対の操作をすればいいので、Visual Basicでさっそく、テキストボックス2つとコマンドボックスを配置し、メモ帳の「?iso-2022-jp?B?」と「?=」の間の文字列をテキストボックスに貼り付けて、デコード結果をもう一つのテキストボックスに表示してみる。

 結果は

$B....  またまた??

   が、メモ帳で見た後の方の文字列と似ている。 どうやら漢字らしいが。

 12月24日 JISコードとシフトJISコード

 今年は、アンコールワット旅行の時から雪に見舞われ続けているが、昨日はまれに見る大雪、各地で被害が出ているようだ。 昨日と今日、午後になって家の周りの道の除雪をする。

 そして、除雪作業の合間に、懸命になってインターネットで、先日のメモ帳で見たメールの訳の分からない文字の理由を調べる。 有った!
 パソコンで使っている漢字はシフトJISコードだそうだが、メール等ではJISコードを使っている。 パソコンに表示する為にはJISコードからシフトJISコードに変換する必要がある。

 前回メモ帳で見た、・$BはここからJISコードが始まることを(最初の・はEscコードと言い、アスキー文字には無いコード、メモ帳では文字化けしていた)(BJISコードの終わりを表す。 (Jが使われる時もある。

 それなら、先日のVBのプログラムにもう一つテキストボックスを追加して、シフトJISコードを表示するようにしてみよう。

 さらに、インターネットでJIS⇒シフトJIS変換の仕組みを調べるが、Cで書かれたプログラムは多いが、VBではない。 バリバリのプログラマーはVBなんか使わないのか…。
 変換のロジックはいろいろ調べてみた結果、VBで20行前後でプログラムにすることができた。

 実行してみた結果、確かにメールで見たとおりの文字が出てきた。
[PR]
by t_ichib | 2005-12-24 20:52 | 今日もまた老年プログラマー