質問させて頂きます。
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;
初歩的な質問ですいませんが、よろしくお願いします。
>受信メールの一覧を表示してクリックするとメールを開くことができるようなプログラムを作りたいのですが、
受信したデータをデータベースに格納し、
DBGrid(あるいはStringGridやListView)に表示させる
のはいかがですか?
受信データをデータベースに格納する方法があるんですね!
でも、このプログラムでは受信メールを一件しか呼び出さないのですが、
すべて呼び出すことはできないのでしょうか?
初歩的な質問ばかりですいません。
>このプログラムでは受信メールを一件しか呼び出さないのですが
for i := 1 to IdPOP31.CheckMessages do
の前あたりで、
ShowMessage('メール件数:' + IntToStr(IdPOP31.CheckMessages));
みたいにして、IdPOP31.CheckMessages の値を確認したら
何件と表示されますか?
あと、
>初歩的な質問
と繰り返し書かれてますが、初歩的な質問じゃないと思いますよ。
教えていただいたソースを代入したら、メールの件数は1件ではなく、
ちゃんと受信ボックスに入っているメールの件数がでました!
表示されるのが一番最新のメールだけになってるみたいです。
これはどういうことなのでしょうか?
>表示されるのが一番最新のメールだけになってるみたいです。
> 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;
の後あたりで、(リストやデータベースに格納したりして)
データを取り出せばよいかと思います。
件数が読み込まれているということは、受信したデータも一緒に表示していないだけで取り込んでいるのですか?
その表示というのはできないのでしょうか?
何度も質問ばかりですいません。
>件数が読み込まれているということは、受信したデータも一緒に表示していないだけで取り込んでいるのですか?
おそらく、読み込まれていると思います。
>その表示というのはできないのでしょうか?
前回、回答したように、for文の中で、データを
リストやデータベースに格納したあと、
それらを表示すればよいかと思います。
こんにちは,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ではどんなコントロール
(コンポーネント)に相当するものを使っているか,等を考えていくしかないでしょう.
由香さんのコードでは,TIdMessageを実行時に生成していますが,
[Indy Msc]タブにこのコンポーネントがあります.
参考までに.
>igyさん
ご親切にありがとうございます!for文でデータ格納していくわけですね!
ちなみにDelphiでのメーラ開発で参考になるサイトや文献をご存じないでしょうか??
>Mr.XRAY
ご協力して頂いて申し訳ないです!!
教えて頂きましたコードを入れたところすべてのメールが表示されました!
しかし、HTMLタグが非常にたくさん表示されるのですがこれは何なんでしょうか??あと文字化けもしています。
お手数おかけしてすいません。
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
>これは送ってきたメールがHTMLメールだからでしょう.
メールの受信としての機能はこれで正しいことになります.
必要でなければご自分で削除するコードを追加することになります.
HTMLタグの知識が必要です,HTMLタグの処理は,この掲示板やGoogle等で調べてみてください.
メールソフトを作成するというのは大変なことだと思いますよ.
そんなに簡単なことではありません.
いろいろな知識が必要です.プログラムとしては,総合的な分野でしょう.
したがって,このような掲示板で,
>具体的なプログラムを教えて頂けないでしょうか。
というわけにはいきません.
>いろいろな知識が必要です.プログラムとしては,総合的な分野でしょう.
したがって,
>ちなみにDelphiでのメーラ開発で参考になるサイトや文献をご存じないでしょうか??
ありません.しいて言えば,Delphiというかプログラミングの知識全てです.
この掲示板で,ここのところデータベース関係のスレッドがあります.
これも参考になるでしょう.
いつも,情報のアンテナを張っていることです.
たとえば,
http://yourcolor.seesaa.net/article/134778238.html
のnanatreeというものの画像を見てください.
左のペインの項目をクリックすると,その該当する文書が表示されるようになっています.
これも,メーラーに応用できそうですよね.
左がメールのタイトル,右がそのメール本文と考えることもできます.
色々説明していただきありがとうございました。
>HTMLタグの処理は,この掲示板やGoogle等で調べてみてください
調べてはみたのですが、関するサイトを見つけられませんでした。
除去できないのでしょうか?
>除去できないのでしょうか?
除去するのでなく、HTMLメールの場合には、
メール本文を作業ファイルに保存し、それをTWebBrowser
で表示するとかは、いかがですか?
(試していないので、うまくいかないかもしれませんが。)
ツイート | ![]() |