メーラー作りましょ(4) | 今宵は月が高い。注意されたし。

メーラー作りましょ(4)

マルチパートはヘッダの Content-Type が multipart で始まるので用意に判定できます。その時 boundary 属性が付くので、本文をこの文字列で分割してやるだけです。この文字列はメーラごとに違うので毎回取得するべし。

詳しい事は添付ファイルを自分宛てに送って、IdPOP3.RetrieveRaw で TStrings に取り込んで全文を見てみれば一目瞭然であります。
本文中の各パート毎に更に細かいヘッダがつきますが、最初の空行までがヘッダである事は同じ(センチネルというのだそうだ)。

なので、個々のメッセージ保持クラスは更にリスト管理クラスを持ち、パート毎にメッセージ保持クラスを持させて管理します。



TNgymMessageList = class;

TNgymMessage = class( TPersistent );
  FOwner : TNgymMessageList;
  FPartList : TNgymMessageList;
end;

TNgymMessageList = class( TObjectList );
  property Items[Index:Variant] : TNgymMessage; default;
end;



大体の雰囲気わかりますかね。これだけど孫、曾孫とナンボでも保持しますが現実にそういう状況はありませんし。パートの分割は必要になってからリストを生成するのでメモリの無駄はありません。

リストへのアクセスは、インデックスと文字列で受け付けています。文字列は各パートの Content-Type ヘッダの name 属性 を検索して返します。バリアントはこういう風に使うもんだ!と自画自賛(笑)
でもプロトタイプはIndexなので、ソース見て直感的に使えたりはしませんね……何かいい命名規則ないもんでしょか。

リクエストがあれば、実装したクラスのソースコードを公開しても良いです。まぁ、要らんと思うがね。