2011-03-13 21 views
2

メールをチェックして読むための "メールクライアント"プログラムを作成します。 多くの著者のソースコードをcodeprojectでダウンロードしましたが、プログラムは非常に長く読み込まれていました。プログラムを再起動すると、プログラムを再ダウンロードする必要があります。 ダウンロードしたメールを保存し、新しいメールのみをダウンロードするという考えがあります。 メールを保存するにはどうすればよいですか?私はXMLまたはSQLを使用できますか? 私はPOP3とIMAPを使用しています。私が読んでいたメールを保存し、C#で新しいメールのみを読み込みます。

+0

節約問題のどの部分ですか? XMLファイルかSQLデータベースのどちらかを選ぶのに問題はありますか? XMLファイルを作成する方法やSQLデータベースに保存する方法に問題がありますか?あなたの記憶表現はどのように見えますか?空想的なオブジェクトモデルか、単に 'byte []'を持っていますか? –

+0

メールの内容をすべて保存します。私はXMLとSQlの間で問題を選択し、XMLを作成します。任意のメモリ。 – giaosudau

答えて

0

サーバ上のメッセージにはUID(少なくともIMAPの場合)があります。By definition UIDは増加するだけです。意味は、UIDが321の場合、次のUIDは322以上でなければなりません。だからあなたはあなたのDBに "最後のUID"を格納し、次にサーバーから最高のUIDを取得することができます。あなたの最後のものよりも高い場合は、新しいものをロードしてください。

2

Limisoftライブラリをご覧ください。ここで

はコードのサンプルです:

using LumiSoft.Net.IMAP; 
using LumiSoft.Net.IMAP.Client; 
using LumiSoft.Net; 

...

using (IMAP_Client client = new IMAP_Client()) 
{ 
    client.Connect("imap.gmail.com", 993, true); 
    client.Login("[email protected]", "your_cool_password"); 
    client.SelectFolder("INBOX"); 

    IMAP_SequenceSet sequence = new IMAP_SequenceSet(); 
    //sequence.Parse("*:1"); // from first to last 

    IMAP_Client_FetchHandler fetchHandler = new IMAP_Client_FetchHandler(); 

    fetchHandler.NextMessage += new EventHandler(delegate(object s, EventArgs e) 
    { 
     Console.WriteLine("next message"); 
    }); 

    fetchHandler.Envelope += new EventHandler<EventArgs<IMAP_Envelope>>(delegate(object s, EventArgs<IMAP_Envelope> e){ 
     IMAP_Envelope envelope = e.Value; 
     if (envelope.From != null && !String.IsNullOrWhiteSpace(envelope.Subject)) 
     { 
      Console.WriteLine(envelope.Subject); 
     } 

    }); 

    // the best way to find unread emails is to perform server search 

    int[] unseen_ids = client.Search(false, "UTF-8", "unseen"); 
    Console.WriteLine("unseen count: " + unseen_ids.Count().ToString()); 

    // now we need to initiate our sequence of messages to be fetched 
    sequence.Parse(string.Join(",", unseen_ids)); 

    // fetch messages now 
    client.Fetch(false, sequence, new IMAP_Fetch_DataItem[] { new IMAP_Fetch_DataItem_Envelope() }, fetchHandler); 

    // uncomment this line to mark messages as read 
    // client.StoreMessageFlags(false, sequence, IMAP_Flags_SetType.Add, IMAP_MessageFlags.Seen); 
} 

少し複雑ますが、正常に動作します。 Limisoftライブラリは完全ではありませんので、十分にテストしてください。

+0

私はこのコードを試しましたが、それはそのままで動作しましたが、私はボディを受け取ることができません。新しいIMAP_Fetch_DateItem_Body()を追加し、fetchHandler.Bodyにイベントハンドラを追加しましたが、この関数ではnullへのストリームとBodySectionの空の文字列のみが表示されます。アドバイスや提案はありますか? –

関連する問題