簡體   English   中英

調用 function 以獲取發送電子郵件時的發送日期,並且適用於所有類型的連接電子郵件 - 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM