2015-09-15 92 views
0

我正在編寫一個獨立的程序,將多個PST複製到一個新的PST上。當有重複的電子郵件時,我只需要1份,而不是全部。如何在outlook c中取代MailItem#

既然這樣,我的代碼是:

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

觀能夠通過選擇手動產生所期望的結果:文件>打開>導入>從另一程序或文件> Outlook數據文件>替換重複與物品進口。

感謝您的幫助!

回答

1

您的主要問題在於如何確定什麼是重複的。如果您在單個.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; 
} 
+0

我已經使用了一個非常相似的路線,謝謝。代替搜索匹配,我散列所有電子郵件並將其放入每個PST的HashSet。在複製當前電子郵件之前,我測試它的散列值是否存在於另一個PST的HashSet中。 –

1

Outlook對象模型不提供用於檢查重複的任何屬性或方法。您需要比較項目的屬性以決定是否需要複製特定項目。我建議使用Items類的Find/FindNext或Restrict方法來查找重複項。你也可以考慮使用Application類的AdvancedSearch方法。在Outlook中使用AdvancedSearch方法的主要優點是:

  • 該搜索是在另一個線程中執行的。由於AdvancedSearch方法在後臺自動運行,因此不需要手動運行其他線程。
  • 可以在任何位置搜索任何物品類型:郵件,約會,日曆,便籤等,即超出某個文件夾的範圍。 Restrict和Find/FindNext方法可以應用於特定的Items集合(請參閱Outlook中的Folder類的Items屬性)。
  • 對DASL查詢的全面支持(自定義屬性也可用於搜索)。您可以在MSDN的Filtering文章中閱讀關於此的更多信息。爲了提高搜索性能,如果爲商店啓用了即時搜索,則可以使用即時搜索關鍵字(請參閱Store類的IsInstantSearchEnabled屬性)。
  • 最後,您可以使用Search類的Stop方法隨時停止搜索過程。

你可以閱讀更多有關這些方法在下面的文章:

不要使用下面的代碼:

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

這將是非常緩慢的...

相關問題