2017-03-06 5 views
0

J'ai un addin de perspectives qui traverse un tas de dossiers, les enregistre sur le disque et les déplace vers le dossier de la corbeille.A défaut d'obtenir des informations sur MailItem

Le code que j'ai ajouté fonctionne pour 99% des courriels. Le tas de caches d'essai est pour le débogage, donc s'il vous plaît ignorez-les.

Il extrait quelques milliers de mails par jour et fonctionne pour tout, sauf les mails dans un dossier.

Je vérifie si les éléments sont des MailItems et tout vérifie, mais dès que j'essaie d'obtenir une propriété, cela me donne ce type d'erreur.

Une telle interface prise en charge (Exception de HRESULT: 0x80004002 (E_NOINTERFACE))

10:57:51 AM: à Microsoft.Office.Interop.Outlook._MailItem.get_ReceivedTime()

La méthode change en fonction de ce que j'essaie d'accéder.

Avez-vous cherché des solutions pour cela pendant un certain temps, mais en vain.

Aidez-nous s'il vous plaît.

while (unreadFolders.Count > 0 && count < COUNT) 
      { 
       Outlook.Folder currentFolder = unreadFolders.FirstOrDefault().Key; 
       string path = unreadFolders.FirstOrDefault().Value; 
       Debug.WriteLine("reading folder: " + currentFolder.Name); 
       unreadFolders.Remove(currentFolder); 

       Outlook.Folder parent = GetParent(currentFolder); 
       var t = parent?.FullFolderPath; 
       //replenish the list 
       foreach (Outlook.Folder f in currentFolder.Folders) unreadFolders.Add(f, path + "\\" + f.Name); 

       //create directory if it doesnt exist 
       Directory.CreateDirectory(path); 

       Outlook.Items items = currentFolder.Items; 
       foreach (var item in items) 
       { 
        if (item != null && item is Outlook.MailItem) 
        { 
         if (count++ > COUNT) break; 
         var mailItem = (Outlook.MailItem)item; 
         if (mailItem == null) continue; 
         var fullpath = path + "\\"; 
         try 
         { 
          fullpath += "[(R)" + mailItem.ReceivedTime.ToWeirdDateFormat() + "]"; 
         } 
         catch (Exception ex) 
         { 
          using (StreamWriter file = new StreamWriter(@"C:\\temp\logs.txt", true)) 
          { 
           file.WriteLine(DateTime.Now.ToLongTimeString() + ":\t\tReceived Time Broken"); 
           file.WriteLine(DateTime.Now.ToLongTimeString() + ":\t\t" + ex.Message); 
           file.WriteLine(DateTime.Now.ToLongTimeString() + ":\t\t" + ex.StackTrace); 
          } 
         } 
         try 
         { 
          fullpath += "[(T)" + mailItem.To.MakeWindowsSafe() + "]"; 
         } 
         catch (Exception ex) 
         { 
          using (StreamWriter file = new StreamWriter(@"C:\\temp\logs.txt", true)) 
          { 
           file.WriteLine(DateTime.Now.ToLongTimeString() + ":\t\tTo Broken"); 
           file.WriteLine(DateTime.Now.ToLongTimeString() + ":\t\t" + ex.Message); 
           file.WriteLine(DateTime.Now.ToLongTimeString() + ":\t\t" + ex.StackTrace); 
          } 
         } 
         try 
         { 
          fullpath += "[(F)" + mailItem.SenderName.MakeWindowsSafe() + "]"; 
         } 
         catch (Exception ex) 
         { 
          using (StreamWriter file = new StreamWriter(@"C:\\temp\logs.txt", true)) 
          { 
           file.WriteLine(DateTime.Now.ToLongTimeString() + ":\t\tSender name Broken"); 
           file.WriteLine(DateTime.Now.ToLongTimeString() + ":\t\t" + ex.Message); 
           file.WriteLine(DateTime.Now.ToLongTimeString() + ":\t\t" + ex.StackTrace); 
          } 
         } 
         try 
         { 
          fullpath += "[+][(S)" + mailItem.Subject.MakeWindowsSafe() + "]"; 
         } 
         catch (Exception ex) 
         { 
          using (StreamWriter file = new StreamWriter(@"C:\\temp\logs.txt", true)) 
          { 
           file.WriteLine(DateTime.Now.ToLongTimeString() + ":\t\tSubject Broken"); 
           file.WriteLine(DateTime.Now.ToLongTimeString() + ":\t\t" + ex.Message); 
           file.WriteLine(DateTime.Now.ToLongTimeString() + ":\t\t" + ex.StackTrace); 
          } 
         } 
         fullpath += ".msg"; 
         //save message to directory 
         mailItem.SaveAs(fullpath, Outlook.OlSaveAsType.olMSG); 

         //move message to deleted 
         if (parent == null) 
         { 
          using (StreamWriter file = new StreamWriter(@"C:\\temp\logs.txt", true)) 
          { 
           file.WriteLine(DateTime.Now.ToLongTimeString() + ":\t\tParent Null"); 
           file.WriteLine(DateTime.Now.ToLongTimeString() + ":\t\t" + currentFolder.FullFolderPath); 
          } 
         } 
         else 
         { 
          mailItem.Move(parent.Folders["Deleted Items"]); 
         } 
        } 
       } 
      } 

Répondre

0

Vérifiez la valeur de la propriété MailItem.Class - il peut être 46 (OlObjectClass.olReport) (et MailItem.MessageClass serait REPORT.IPM.Note.NDR). Les messages de rapport non distribuables sont des objets ReportItem, mais il est possible qu'ils soient considérés comme un objet MailItem et transmettent ainsi votre évaluation.

Assurez-vous également que vous utilisez une rétrogradation pour la boucle de compteur, car vous modifiez peut-être la collection en déplaçant l'élément vers un autre dossier (plus les boucles sont mauvaises pour les objets Outlook). C'est toujours une bonne idée d'appeler Marshal.ReleaseCOMObject sur vos variables contenant des objets Outlook.

+0

Je n'aurai accès à la boîte aux lettres que demain pour vérifier cela, mais j'ai lu les messages quand j'ai eu accès et ils m'ont semblé être des messages normaux. Quelle devrait être la valeur de la propriété MailItem.Class? J'ai également changé le code à utiliser pour les boucles et j'utilise maintenant le ReleaseComObject, mais je ne pourrai confirmer que demain. – LeftOfHere

+0

43. merci msdn docs. – LeftOfHere

+0

L'utilisation de boucles for à la place des boucles foreach a aidé. A également dû libérer correctement les objets com. [question msdn] (https://social.msdn.microsoft.com/Forums/vstudio/en-US/e460d068-f872-44cd-a032-8f74e92d68f8/failing-to-get-any-info-on-mailitem? forum = outlookdev) – LeftOfHere