2017-12-13 7 views
1

Visual StudioでC#でコンソールアプリケーションを構築しました。私は削除したい電子メールを特定するために多くのキーを持つ設定ファイル(app.config)を持っています。最初のショットでOutlookから電子メールを削除できない

私の問題は、未読の電子メールが10件ある場合に削除が機能しても、それを実行するには数回アプリケーションを実行する必要があるということです。私は何の誤りもありません。

タイムアウトがあるようですので、アプリケーションは最初の3つの電子メールを削除して残りの部分を残してから、アプリケーションを再実行し、次の3つまたは4つの電子メールを削除してからすべてを削除する

何か間違っていますか?私のコードに続いて、それはOutlookに接続し、私たちのメールサーバーはMicrosoft Exchangeです。

using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.Linq; 
using Microsoft.Office.Interop.Outlook; 
using Exception = System.Exception; 

namespace OutlookReader 
{ 
    class Program 
    { 
    static void Main() 
    { 
     try 
     { 
      var outlookApplication = new ApplicationClass(); 
      var mapiNameSpace = outlookApplication.GetNamespace("MAPI"); 

      //Inbox 
      var inbox = mapiNameSpace.GetDefaultFolder(OlDefaultFolders.olFolderInbox); 
      //Unread emails 
      var unreadItems = inbox.Items.Restrict("[Unread]=true"); 

      var splitter = char.Parse(ConfigurationManager.AppSettings["splitter"]); 
      var excludeBySenderName = ConfigurationManager.AppSettings["ExcludeBySenderName"].Split(splitter).ToList(); 
      var excludeByEmail = ConfigurationManager.AppSettings["ExcludeByEmail"].Split(splitter).ToList(); 
      var excludeByDomain = ConfigurationManager.AppSettings["ExcludeByDomain"].Split(splitter).ToList(); 
      var excludeByTo = ConfigurationManager.AppSettings["ExcludeByTo"].Split(splitter).ToList(); 
      var excludeBySubject = ConfigurationManager.AppSettings["ExcludeBySubject"].Split(splitter).ToList(); 



      foreach (MailItem item in unreadItems) 
      { 
       Console.WriteLine("Sender: " + item.SenderName + " - To: " + item.To + " - Subject: " + item.Subject); 

       if (stringExists(item.SenderName, excludeBySenderName) 
        || stringExists(item.SenderEmailAddress, excludeByEmail) 
        || stringExists(item.SenderEmailAddress, excludeByDomain) 
        || stringExists(item.To, excludeByTo) 
        || stringExistsFullSearch(item.Body, excludeByDomain) 
        || stringExistsFullSearch(item.HTMLBody, excludeByDomain) 
        || stringExistsFullSearch(item.Subject, excludeBySubject)) 
       { 
        //item.UnRead = false; 
        item.Delete(); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 

     Console.ReadKey(); 
    } 

    private static bool stringExists(string pattern, List<string> list) 
    { 
     var result = list.Find(item => item.ToLower().Contains(pattern.ToLower())); 

     if (string.IsNullOrWhiteSpace(result)) 
     { 
      return false; 
     } 

     return true; 
    } 

    private static bool stringExistsFullSearch(string pattern, List<string> list) 
    { 
     var result = false; 
     foreach (var item in list) 
     { 
      if (pattern.ToLower().Contains(item.ToLower())) 
      { 
       result = true; 
      } 
     } 

     return result; 
    } 
    } 
} 

答えて

0

要素を反復処理している間は、コレクションを変更しています。制限付き品目をループして、エントリids (MailItem.EntryID)をリストに格納します。そのリストのスティッキングをループし、Namespace.GetItemFromIDを使用して各項目を開き、次にMailItem.Deleteを使用してメッセージを削除します。

+0

ありがとう、それは動作します! – MarcosF8

関連する問題