2015-09-15 3 views
0

J'écris un programme autonome pour copier plusieurs PST dans un seul nouveau PST. Quand il y a des doublons d'un email, je voudrais juste 1 copie, pas tous.comment remplacer MailItem dans Outlook C#

En l'état actuel, mon code est:

if (item is Outlook.MailItem) 
{ 
    Outlook.MailItem i = item as Outlook.MailItem; 
    Outlook.MailItem iCopy = i.Copy(); 
    iCopy.Move(targetMAPIFolder); 
} 

Outlook est en mesure de produire les résultats souhaités manuellement en choisissant: Fichier> Ouvrir> Importer> Importer à partir d'un autre programme ou fichier> fichier de données d'Outlook> Remplacer les doublons avec des articles importés.

Merci pour votre aide!

Répondre

1

Votre principal problème ici est de déterminer ce qu'est un doublon. Si vous les déplacez dans un fichier .PST unique, vous pouvez comparer la propriété MailItem.Id car elle est unique dans un fichier PST unique. Lorsque vous vous déplacez d'un pst à un autre, vous voulez probablement vérifier les propriétés que vous jugez «uniques» sur l'article de courrier et les comparer. (Vous pourriez même utiliser une valeur de hachage si vous le vouliez). À titre d'exemple -

var hash = String.Format("{0}{1}{2}{3}", item.To, item.From, item.CC, item.Subject, item.Body).GetHashCode(); 

devrait vous donner une valeur de hachage pour comparer contre les éléments existants dans votre PST cible.

Ou tout simplement comparer les propriétés que vous jugerez montrerait un double

Exemple -

private bool CheckIsDuplicate(MailItem item) 
{ 
    //load the target pst 
    Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application(); 
    Microsoft.Office.Interop.Outlook.NameSpace outlookNs = app.GetNamespace("MAPI"); 
    outlookNs.AddStore(@"D:\pst\Test.pst"); 
    Microsoft.Office.Interop.Outlook.MAPIFolder emailFolder = outlookNs.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderSentMail); 

    //check for your mail item in the repository 
    var duplicateItem = (
     from email in 
     emailFolder.Items.OfType<MailItem>() 
     where //here you could try a number of things a hash value of the properties or try using the item.I 
     email.SenderName == item.SenderName && 
     email.To == item.To && 
     email.Subject == item.Subject && 
     email.Body == item.Body 
     select email 
      ).FirstOrDefault(); 

     return duplicateItem != null; 
} 
+0

J'ai utilisé un itinéraire très similaire à ceci, merci. Au lieu de rechercher des correspondances, je hache tous les emails et les place dans un HashSet par PST. Avant de copier l'email actuel, je vérifie si son hash est présent dans le HashSet d'un autre PST. –

1

Le modèle d'objet Outlook ne fournit aucune propriété ou méthode de vérification des doublons. Vous devez comparer les propriétés de l'élément pour décider si vous devez copier un élément particulier ou non. Je suggère d'utiliser les méthodes Find/FindNext ou Restrict de la classe Items pour trouver des doublons. Vous pouvez également envisager d'utiliser la méthode AdvancedSearch de la classe Application. Les principaux avantages de l'utilisation de la méthode AdvancedSearch dans Outlook sont les suivants:

  • La recherche est effectuée dans un autre thread. Vous n'avez pas besoin d'exécuter un autre thread manuellement car la méthode AdvancedSearch l'exécute automatiquement en arrière-plan.
  • Possibilité de rechercher des types d'éléments: courrier, rendez-vous, calendrier, notes, etc. dans n'importe quel emplacement, c'est-à-dire au-delà de la portée d'un certain dossier. Les méthodes Restreindre et Find/FindNext peuvent être appliquées à une collection Items particulière (voir la propriété Items de la classe Folder dans Outlook).
  • Prise en charge complète des requêtes DASL (les propriétés personnalisées peuvent également être utilisées pour la recherche). Vous pouvez en savoir plus à ce sujet dans l'article Filtering dans MSDN. Pour améliorer les performances de la recherche, les mots clés de recherche instantanée peuvent être utilisés si la recherche instantanée est activée pour le magasin (voir la propriété IsInstantSearchEnabled de la classe Store).
  • Enfin, vous pouvez arrêter le processus de recherche à tout moment en utilisant la méthode Stop de la classe Search.

Vous pouvez en savoir plus sur ces méthodes dans les articles suivants:

Ne pas utiliser le code suivant:

var duplicateItem = (
    from email in 
    emailFolder.Items.OfType<MailItem>() 

Ce sera très lent ...