[英]Call function every time you enter an e-mail in Sent Items - Outlook - VSTO
[英]Call a function to get the Sent Date when an e-mail is sent and that works with all types of connected e-mail - Outlook - VSTO
我做了兩種不同的實現來解決我的問題,即:我需要在發送 email 時,它調用 function ,用它我可以獲得 The Sent Date 。 兩種實現都有效,不是 100%,但它們有效。
private void ThisAddIn_Startup(object sender, System.EventArgs e) {
//First implementation.
try
{
Outlook.Stores stores = Application.Session.Stores;
foreach (Outlook.Store store in stores)
{
var folder = store.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail);
items = folder.Items;
items.ItemAdd += ItemsAdd;
}
}
catch (Exception exception)
{
Log.Error(exception.Message);
throw;
}
//Second implementation.
this.Application.ItemSend += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemSendEventHandler(Application_ItemSend);
}
第一個實現:有了它,我可以返回正確的Sent Date ,但是它不適用於 Outlook 應用程序中使用的所有類型的電子郵件,例如,我有我的 microsoft email 可以使用它,還有一個企業 Z0C83F57ABC7836已作為 POP3 連接,並且使用此帳戶無法正常工作。
第二個實現:它適用於所有類型的電子郵件,但發送日期錯誤。
在第一個實現中是否有解決方案可以使用作為 POP3 連接的帳戶? 或解決我的問題的其他實現?
使用www.DeepL.com/Translator翻譯(免費版)
當您遍歷配置文件中的所有商店時,您訂閱的是同一個文件夾:
foreach (Outlook.Store store in stores)
{
var folder = store.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail);
items = folder.Items;
items.ItemAdd += ItemsAdd;
}
相反,您需要使用store
object 來訂閱商店特定的已Sent Items
文件夾。
foreach (Outlook.Store store in stores)
{
var folder = store.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail);
items = folder.Items;
items.ItemAdd += ItemsAdd;
}
此外,保留Items
對象列表也很有意義,因為每次代碼都會覆蓋 object 引用,因此之前的對象可能會在某個時間點被 GC 釋放。
Store.GetDefaultFolder方法返回一個Folder
object,它表示存儲中的默認文件夾,並且是FolderType
參數指定的類型。 此方法類似於NameSpace
object 的GetDefaultFolder
方法。 不同之處在於此方法獲取與帳戶關聯的交付存儲上的默認文件夾,而NameSpace.GetDefaultFolder
返回當前配置文件的默認存儲上的默認文件夾。
Application.ItemSend
事件在項目發出之前觸發,並且該過程可以被其他人取消。 因此,您不能確定該項目是在那個階段發送的。
首先,正如 Eugene 所指出的,您一直在檢索相同的默認已發送郵件文件夾 - 改為使用store.GetDefaultFolder
。
其次,您不斷重置相同的變量( items
)。
如果您希望每個商店的已發送項目文件夾中的ItemAdd
事件,您需要創建一個包裝器 class,該包裝器從商店檢索作為參數傳遞給構造函數的 Items 集合,並將事件處理程序設置為包裝器 class 上的方法。 然后,您可以將包裝器列表存儲在列表中,以確保它們處於活動狀態並可以引發事件。 沿線的東西
List<StoreWrapper> _stores = new List<StoreWrapper>(); //global level
...
foreach (Outlook.Store store in stores)
{
_stores.Add(new StoreWrapper(store));
}
...
public class StoreWrapper
{
private Items _items;
public StoreWrapper(Store store)
{
_items = store.GetDefaultFolder(OlDefaultFolders.olFolderSentMail).Items;
_items.ItemAdd += ItemsAdd;
}
private void ItemsAdd(object item)
{
//todo
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.