如何在outlook c#中替换MailItem
本文关键字:替换 MailItem outlook | 更新日期: 2023-09-27 18:12:43
我正在编写一个独立的程序,将多个PST复制到一个新的PST。当邮件有副本时,我只想要一份,而不是全部。
我的代码是:
if (item is Outlook.MailItem)
{
Outlook.MailItem i = item as Outlook.MailItem;
Outlook.MailItem iCopy = i.Copy();
iCopy.Move(targetMAPIFolder);
}
Outlook能够通过以下选择手动生成所需的结果:文件>打开>导入>从其他程序或文件导入>Outlook数据文件>用导入的项替换重复项。
谢谢你的帮助!
Outlook对象模型不提供任何属性或方法来检查重复项。您需要比较项目的属性,以决定是否需要复制特定的项目。我建议使用Items类的Find/FindNext或Restrict方法来查找重复项。您还可以考虑使用Application类的AdvancedSearch方法。在Outlook中使用AdvancedSearch方法的主要好处是:
- 在另一个线程中执行搜索。你不需要手动运行另一个线程,因为AdvancedSearch方法会在后台自动运行它。
- 可以在任何位置搜索任何项目类型:邮件,约会,日历,笔记等,即超出某个文件夹的范围。Restrict和Find/FindNext方法可以应用于特定的Items集合(参见Outlook中Folder类的Items属性)。
- 完全支持DASL查询(自定义属性也可以用于搜索)。您可以在MSDN的过滤文章中阅读更多相关内容。为了提高搜索性能,如果商店启用了即时搜索,可以使用即时搜索关键字(参见store类的IsInstantSearchEnabled属性)。
- 最后,您可以使用search类的stop方法随时停止搜索进程。
您可以在以下文章中阅读更多关于这些方法的信息:
- 如何:使用Find和FindNext方法从文件夹中检索Outlook邮件项目(c#, VB.NET)
- 如何:使用Restrict方法从文件夹 中检索Outlook邮件项目
- 在Outlook中编程高级搜索:c#, VB。净
不要使用以下代码:
var duplicateItem = (
from email in
emailFolder.Items.OfType<MailItem>()
这里的主要问题是如何确定哪些是重复的。如果您在单个. pst中移动它们,则可以比较MailItem。Id属性,因为它在单个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;
}