2015-09-15 5 views
0

Я пишу автономную программу для копирования нескольких PST в один новый PST. Когда есть дубликаты электронной почты, я бы хотел всего лишь 1 экземпляр, но не все из них.как заменить MailItem в outlook C#

Как он стоит, мой код:

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

Перспективы способна производить желаемые результаты вручную, выбрав: Файл> Открыть> Импорт> Импорт из другой программы или файла> файл данных Outlook> Заменить дубликаты с импортированными предметами.

Благодарим за помощь!

ответ

1

Основная проблема заключается в том, как определить, что такое дубликат. Если вы перемещаете их в пределах одного .PST, вы можете сравнить свойство MailItem.Id, поскольку оно уникально в одном PST. По мере того, как вы переходите с одного pst на другой, вы, вероятно, захотите просмотреть, какие свойства вы считаете «уникальными» в элементе почты и сравнить их. (Вы даже можете использовать хэш-значение, если хотите). В качестве примера -

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

Если вам значение хеш-функции для сравнения существующих элементов в вашей цели PST.

или просто сравнить свойства, которые вы сочтете бы показать дубликат

Пример -

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

Я использовал маршрут, очень похожий на это, спасибо. Вместо поиска совпадений я получаю все электронные письма и помещаю их в HashSet для PST. Прежде чем копировать текущее письмо, я проверяю, присутствует ли его хэш в другом Pash's HashSet. –

1

объектная модель Перспективы не предоставляет каких-либо свойство или метод для проверки дубликатов. Вам нужно сравнить свойства объекта, чтобы решить, нужно ли копировать определенный элемент или нет. Я бы предложил использовать методы Find/FindNext или Restrict класса Items для поиска дубликатов. Также вы можете использовать метод AdvancedSearch класса Application. Ключевыми преимуществами использования метода AdvancedSearch в Outlook являются:

  • Поиск выполняется в другом потоке. Вам не нужно запускать другой поток вручную, так как метод AdvancedSearch автоматически запускает его в фоновом режиме.
  • Возможность поиска любых типов предметов: почты, назначения, календаря, заметок и т. Д. В любом месте, то есть за пределами определенной папки. Методы Ограничения и Найти/FindNext могут применяться к определенной коллекции элементов (см. Свойство Items класса Folder в Outlook).
  • Полная поддержка запросов DASL (пользовательские свойства могут также использоваться для поиска). Подробнее об этом можно узнать в статье Filtering в MSDN. Чтобы повысить эффективность поиска, ключевые слова Instant Search можно использовать, если для хранилища включен Instant Search (см. Свойство IsInstantSearchEnabled класса Store).
  • Наконец, вы можете остановить процесс поиска в любой момент, используя метод Stop в классе Search.

Вы можете прочитать больше об этих методах в следующих статьях:

Не используйте следующий код:

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

Это будет очень медленно ...