Как заменить MailItem в outlook C#

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

В моем нынешнем виде код:

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

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

Спасибо за вашу помощь!

2 ответа

Решение

Ваша главная проблема здесь заключается в том, как определить, что является дубликатом. Если вы перемещали их в пределах одного.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;
}

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

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

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

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

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

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

Другие вопросы по тегам