как заменить 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» > «Заменить дубликаты импортированными элементами».

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


person Ryan Loggerythm    schedule 15.09.2015    source источник


Ответы (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;
}
person DotNetHitMan    schedule 15.09.2015
comment
Я использовал маршрут, очень похожий на этот, спасибо. Вместо поиска совпадений я хеширую все электронные письма и помещаю их в HashSet для каждого PST. Перед копированием текущего электронного письма я проверяю, присутствует ли его хеш в HashSet другого PST. - person Ryan Loggerythm; 15.09.2015

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

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

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

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

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

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

person Eugene Astafiev    schedule 15.09.2015