我正在编写一个独立程序,将多个PST复制到一个新的PST。如果有重复的电子邮件,我只想复制一份,而不是全部。
目前,我的代码是:
if (item is Outlook.MailItem)
{
Outlook.MailItem i = item as Outlook.MailItem;
Outlook.MailItem iCopy = i.Copy();
iCopy.Move(targetMAPIFolder);
}
Outlook可以通过选择以下方式手动生成所需的结果:文件>打开>导入>从另一个程序或文件导入>
感谢您的帮助!
答案 0 :(得分:1)
这里的主要问题是如何确定什么是重复。如果您在单个.PST中移动它们,则可以比较MailItem.Id属性,因为这在单个PST中是唯一的。当您从一个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;
}
答案 1 :(得分:1)
Outlook对象模型不提供用于检查重复项的任何属性或方法。您需要比较项目的属性以决定是否需要复制特定项目。我建议使用Items类的Find / FindNext或Restrict方法来查找重复项。您也可以考虑使用Application类的AdvancedSearch方法。在Outlook中使用AdvancedSearch方法的主要好处是:
您可以在以下文章中阅读有关这些方法的更多信息:
请勿使用以下代码:
var duplicateItem = (
from email in
emailFolder.Items.OfType<MailItem>()
会很慢......