2015-02-03 3 views
1

받은 편지함에서 특정 전자 메일을 삭제하는 프로그램을 만들려고합니다.큰받은 편지함 읽기

: 여기

AE.Net.Mail

사용

을 (서버가 시간 내에 응답하지 않았습니다) 가끔 서버가 정말 느리게 응답 할 때까지 내 논리는 나를 위해 일하는 내 내가 오류 예외가 나의 코드

 private void GetMessages() 
    { 
     ImapClient client = new ImapClient(); 
     client.Connect("imap-mail.outlook.com", 993, true, false); 
     client.Login("mail", "password"); 
     client.SelectMailbox("INBOX"); 
     client.ServerTimeout = 0; // I just assumed 0 might be never. 
     client.IdleTimeout = 0; 
     int mcount = client.GetMessageCount(); 
     for (int i = 0; i < mcount; i++) 
     { 
      lblStatus.BeginInvoke(new MethodInvoker(delegate { lblStatus.Text = "Proccessed " + i.ToString() + "/" + mcount.ToString() + " e-mail messages. "; })); 
      MailMessage msg = client.GetMessage(i, true); 
      if (msg.From.Address == txtMailToDelete.Text) 
      { 
       deletedcount++; 
       client.DeleteMessage(msg); 
       lblDeletedMessages.BeginInvoke(new MethodInvoker(delegate { lblDeletedMessages.Text = "Deleted " + deletedcount.ToString() + " messages. "; })); 
      } 
     } 
    } 

지금받은 편지함에 3500 개 이상의 이메일이 있기 때문에 전체받은 편지함을받지 못했습니다. 너무 오래 걸리고 같은 예외가 있습니다. 내 방법은 스레드로 작업 된 이후

감사

+0

다른 ServerTimeout 값을 사용하면 어떻게됩니까? – arnt

+0

같은 예외. –

답변

0

난 그냥

Thread.Sleep(500); 

고정, 난 그냥 루프마다 다음에 메소드 잠을 넣어. 이제는 작동하지만 느리다.

+0

500ms의 절전으로 인해 프로그램이 너무 느려지고 서버가 너무 많은 연결을 빠르게 연속해서 처리하는 문제가있는 경우 한 번에 X 개의 전자 메일을 삭제 한 다음 작업하기 전에 잠자기 상태로 전환하는 것이 좋습니다 다음 X 개의 이메일에서 예 : 10 개의 이메일을 삭제하고, 500 밀리 초 동안 잠을 자고, 다음 10 개의 이메일을 삭제하십시오. SQL 서버에 많은 수의 파일을 업로드 할 때이 기술을 사용했습니다. – valsidalv

+0

제안 해 주셔서 감사합니다. –

2

이 문제에 대한 더 나은, 더 빠른 해결책은이 같은 MailKit을 사용하는 것입니다

private void DeleteMessages() 
{ 
    using (var client = new ImapClient()) { 
     client.Connect ("imap-mail.outlook.com", 993, true); 
     client.Authenticate ("mail", "password"); 

     client.Inbox.Open (FolderAccess.ReadWrite); 

     // Search for messages that match the From address. 
     var uids = client.Inbox.Search (SearchQuery.FromContains (txtMailToDelete.Text)); 

     // Mark the messages for deletion. 
     client.Inbox.AddFlags (uids, MessageFlags.Deleted, true); 

     // if the server supports the UIDPLUS extension, issue a "UID EXPUNGE" 
     // command to purge the messages we just marked for deletion. 
     if (client.Capabilities.HasFlag (ImapCapabilities.UidPlus)) 
      client.Inbox.Expunge (uids); 

     client.Disconnect (true); 
    } 
} 

이 배치 요청 이후 상황이 훨씬 빨리 이동하고 요청으로 서버를 망치하지 않습니다.

+0

답변 해 주셔서 감사합니다. 그냥 MailKit과 그것의 화려한 발견. 매력처럼 작동합니다. –