Как заменить 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.
Вы можете прочитать больше об этих методах в следующих статьях:
- Как: использовать методы Find и FindNext для извлечения почтовых элементов Outlook из папки (C#, VB.NET)
- Как: Использовать метод Restrict для получения почтовых элементов Outlook из папки
- Расширенный поиск в Outlook программно: C#, VB.NET
Не используйте следующий код:
var duplicateItem = (
from email in
emailFolder.Items.OfType<MailItem>()
Это будет очень медленно...