メールの一覧を表示するには?


由香  2010-01-09 00:06:06  No: 36823  IP: 192.*.*.*

質問させて頂きます。

Delphiをまだ初めてまもないのですが、メールの受信プログラムを作りたくて過去トピを拝見させて頂き、メール受信のプログラムは完成できたのですが、未読メールを一件しか読みとりません。
そこで質問なのですが、受信メールの一覧を表示してクリックするとメールを開くことができるようなプログラムを作りたいのですが、具体的なプログラムを教えて頂けないでしょうか。
私自信でも色々調べてはみたのですが、ピンポイントで書かれたものがなく分かりませんでした。

環境はDelphi7です。
メール受信のプログラムはこちらです。

procedure TForm1.btnReceptionClick(Sender: TObject);
var
  Msg : TIdMessage;
  i, x: integer;
  s : string;
begin
  memo1.Lines.Clear;
  IdPOP31.Host    :=  '********';
  IdPOP31.Port    :=  ***;
  IdPOP31.Username  :=  '******';
  IdPOP31.Password :=  '******';
  IdPOP31.Connect;
  for i :=  1 to  IdPOP31.CheckMessages do  begin
    Msg :=  TIdMessage.Create(Self);
    IdPOP31.Retrieve(i, Msg);


    memBody.Lines.Add(Msg.Subject{タイトル});
    memBody.Lines.Add(Msg.From.Text{送信者});
    memBody.Lines.Add(datetostr(msg.Date{送信日}));
    //Memo1.Lines.Add(Msg.Headers.Strings[6]{送信日時});



    for x :=  0 to  Pred(Msg.MessageParts.Count) do begin
      if Msg.MessageParts.Items[x] is TIdText then  begin
        s :=  TIdText(Msg.MessageParts.Items[x]).Body.Text;
        memBody.Lines.Add(jconvert.ConvertJCode(s, SJIS_OUT));
      end;


  end;
  IdPOP31.Disconnect;
end;

end;


初歩的な質問ですいませんが、よろしくお願いします。

編集 削除
igy  2010-01-09 08:38:09  No: 36824  IP: 192.*.*.*

>受信メールの一覧を表示してクリックするとメールを開くことができるようなプログラムを作りたいのですが、

受信したデータをデータベースに格納し、
DBGrid(あるいはStringGridやListView)に表示させる
のはいかがですか?

編集 削除
由香  2010-01-09 13:47:31  No: 36825  IP: 192.*.*.*

受信データをデータベースに格納する方法があるんですね!

でも、このプログラムでは受信メールを一件しか呼び出さないのですが、
すべて呼び出すことはできないのでしょうか?

初歩的な質問ばかりですいません。

編集 削除
igy  2010-01-09 16:57:15  No: 36826  IP: 192.*.*.*

>このプログラムでは受信メールを一件しか呼び出さないのですが

for i :=  1 to  IdPOP31.CheckMessages do

の前あたりで、
  ShowMessage('メール件数:' + IntToStr(IdPOP31.CheckMessages));
みたいにして、IdPOP31.CheckMessages の値を確認したら
何件と表示されますか?

あと、
>初歩的な質問
と繰り返し書かれてますが、初歩的な質問じゃないと思いますよ。

編集 削除
由香  2010-01-10 06:59:32  No: 36827  IP: 192.*.*.*

教えていただいたソースを代入したら、メールの件数は1件ではなく、
ちゃんと受信ボックスに入っているメールの件数がでました!

表示されるのが一番最新のメールだけになってるみたいです。
これはどういうことなのでしょうか?

編集 削除
igy  2010-01-10 08:55:02  No: 36828  IP: 192.*.*.*

>表示されるのが一番最新のメールだけになってるみたいです。

>  for i :=  1 to  IdPOP31.CheckMessages do  begin
のfor 文で、件数分 受信していると思いますので、

>    for x :=  0 to  Pred(Msg.MessageParts.Count) do begin
>      if Msg.MessageParts.Items[x] is TIdText then  begin
>        s :=  TIdText(Msg.MessageParts.Items[x]).Body.Text;
>        memBody.Lines.Add(jconvert.ConvertJCode(s, SJIS_OUT));
>      end;

の後あたりで、(リストやデータベースに格納したりして)
データを取り出せばよいかと思います。

編集 削除
由香  2010-01-10 14:13:30  No: 36829  IP: 192.*.*.*

件数が読み込まれているということは、受信したデータも一緒に表示していないだけで取り込んでいるのですか?
その表示というのはできないのでしょうか?

何度も質問ばかりですいません。

編集 削除
igy  2010-01-10 14:31:27  No: 36830  IP: 192.*.*.*

>件数が読み込まれているということは、受信したデータも一緒に表示していないだけで取り込んでいるのですか?

おそらく、読み込まれていると思います。

>その表示というのはできないのでしょうか?

前回、回答したように、for文の中で、データを
リストやデータベースに格納したあと、
それらを表示すればよいかと思います。

編集 削除
Mr.XRAY  2010-01-10 14:56:00  No: 36831  IP: 192.*.*.*

こんにちは,Mr.XRAYです.

>    for x :=  0 to  Pred(Msg.MessageParts.Count) do begin
>      if Msg.MessageParts.Items[x] is TIdText then  begin
>        s :=  TIdText(Msg.MessageParts.Items[x]).Body.Text;
>        memBody.Lines.Add(jconvert.ConvertJCode(s, SJIS_OUT));
>      end;

の部分を,

        Memo1.Lines.Add('');
        IdPOP31.Retrieve(i,IdMessage1);
        Memo1.Lines.AddStrings(IdMessage1.Body);
        Memo1.Lines.Add('');
        Memo1.Lines.Add('----' + IntToStr(i) + '番目のメール終わり -----');
        Memo1.Lines.Add('');

        //受信したメールをメールサーバから削除する場合
        //IdPOP31.Delete(i);
  
と書けば,Memo1に受信した全てのメールの内容が表示されます.
これをヒントに,自分でリストを作成してメールごとに格納するとか...
これだけだと,今回受信したメールだけですから.後は工夫です.
(IdMessage1 : TIdMessage; )

ただし,上のコードは Windows XP(SP3) + Delphi2010(UP5)
Indy 10.5.5 で確認したものですので,Delphi7では少し違う可能性があります.

メールをどのようにデータとして格納して整理し,どのような仕様にするかは,
開発者次第です.
多くのメーラー(メールソフト)では独自のデータベース形式を考えて作成されて
てるようです.
いつくかのメールソフトの動作を自分で見て,Delphiではどんなコントロール
(コンポーネント)に相当するものを使っているか,等を考えていくしかないでしょう.

編集 削除
Mr.XRAY  2010-01-10 15:13:50  No: 36832  IP: 192.*.*.*

由香さんのコードでは,TIdMessageを実行時に生成していますが,
[Indy Msc]タブにこのコンポーネントがあります.

参考までに.

編集 削除
由香  2010-01-10 16:04:19  No: 36833  IP: 192.*.*.*

>igyさん

ご親切にありがとうございます!for文でデータ格納していくわけですね!
ちなみにDelphiでのメーラ開発で参考になるサイトや文献をご存じないでしょうか??

>Mr.XRAY 

ご協力して頂いて申し訳ないです!!
教えて頂きましたコードを入れたところすべてのメールが表示されました!
しかし、HTMLタグが非常にたくさん表示されるのですがこれは何なんでしょうか??あと文字化けもしています。

お手数おかけしてすいません。

編集 削除
Mr.XRAY  2010-01-10 16:11:35  No: 36834  IP: 192.*.*.*

Mr.XRAYです.

Delphi7では文字のコンバートが必要ですね.
IKEDA Takahiroさん作のjconvertを使用することにして.

http://www10.tok2.com/home2/offoff/

本文の取得コードを以下のようにすると文字化けしませんでした.
動作確認  Windows XP(SP3) + Delphi7 Pro + indy 9.00.10

j はInteger
usesにJConvertが必要(上記のサイトからダウンロードして解凍したもの)

      for j:=0 to IdMessage1.Body.Count-1 do begin
        Memo1.Lines.Add(jconvert.ConvertJCode(IdMessage1.Body[j], SJIS_OUT));
      end;


>HTMLタグが非常にたくさん表示されるのですがこれは何なんでしょうか?

これは送ってきたメールがHTMLメールだからでしょう.

ここに参考リンクがあります.
http://mrxray.on.coocan.jp/Delphi/Ohters/OtherInfo19_OutlookMail.htm#02

編集 削除
Mr.XRAY  2010-01-10 16:22:00  No: 36835  IP: 192.*.*.*

>これは送ってきたメールがHTMLメールだからでしょう.

メールの受信としての機能はこれで正しいことになります.
必要でなければご自分で削除するコードを追加することになります.
HTMLタグの知識が必要です,HTMLタグの処理は,この掲示板やGoogle等で調べてみてください.

メールソフトを作成するというのは大変なことだと思いますよ.
そんなに簡単なことではありません.
いろいろな知識が必要です.プログラムとしては,総合的な分野でしょう.
したがって,このような掲示板で,

>具体的なプログラムを教えて頂けないでしょうか。

というわけにはいきません.

編集 削除
Mr.XRAY  2010-01-10 16:43:35  No: 36836  IP: 192.*.*.*

>いろいろな知識が必要です.プログラムとしては,総合的な分野でしょう.

したがって,

>ちなみにDelphiでのメーラ開発で参考になるサイトや文献をご存じないでしょうか??

ありません.しいて言えば,Delphiというかプログラミングの知識全てです.
この掲示板で,ここのところデータベース関係のスレッドがあります.
これも参考になるでしょう.
いつも,情報のアンテナを張っていることです.

たとえば,

http://yourcolor.seesaa.net/article/134778238.html

のnanatreeというものの画像を見てください.
左のペインの項目をクリックすると,その該当する文書が表示されるようになっています.
これも,メーラーに応用できそうですよね.
左がメールのタイトル,右がそのメール本文と考えることもできます.

編集 削除
由香  2010-01-10 19:42:51  No: 36837  IP: 192.*.*.*

色々説明していただきありがとうございました。

>HTMLタグの処理は,この掲示板やGoogle等で調べてみてください

調べてはみたのですが、関するサイトを見つけられませんでした。
除去できないのでしょうか?

編集 削除
igy  2010-01-10 20:19:33  No: 36838  IP: 192.*.*.*

>除去できないのでしょうか?

除去するのでなく、HTMLメールの場合には、
メール本文を作業ファイルに保存し、それをTWebBrowser
で表示するとかは、いかがですか?
(試していないので、うまくいかないかもしれませんが。)

編集 削除