2017-12-13 3 views
1

Ich habe eine Konsolenanwendung in Visual Studio mit C# erstellt. Ich habe eine Konfigurationsdatei (app.config) mit vielen Schlüsseln, um die E-Mail zu identifizieren, die ich löschen möchte.Nicht in der Lage, E-Mails aus Outlook auf den ersten Blick zu löschen

Mein Problem ist, dass selbst wenn das Löschen funktioniert, wenn ich 10 ungelesene E-Mails zu löschen habe, muss ich die Anwendung ein paar Mal ausführen, um dies tun zu können. Ich bekomme keinen Fehler.

Es sieht so aus als gäbe es eine Art Timeout, also löscht die Anwendung die ersten 3 Emails, den Rest unberührt, dann starte ich die Applikation nochmal und es werden die nächsten 3 oder 4 Emails gelöscht und dann immer wieder bis ich alles löschen

Mache ich etwas falsch? Nach meinem Code verbindet es sich mit Outlook und unser Mail-Server ist 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; 
    } 
    } 
} 

Antwort

0

Sie ändern die Sammlung, während Sie durch ihre Elemente iterieren. Durchlaufen Sie die Sperrung der eingeschränkten Objekte und speichern Sie die Eintrags-IDs (MailItem.EntryID) in einer Liste. Sie können dann die Stiche in dieser Liste durchlaufen, jeden Eintrag mit öffnen und dann die Nachricht mit MailItem.Delete löschen.

+0

Vielen Dank, es funktioniert! – MarcosF8

Verwandte Themen