2011-03-13 3 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 이상이어야합니다. 따라서 "마지막 UID"를 DB에 저장 한 다음 서버에서 가장 높은 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 만 볼 수 있습니다. 어떤 조언이나 제안? –