簡體   English   中英

Microsoft.Office.Interop.Outlook

[英]Microsoft.Office.Interop.Outlook

我正在使用Microsoft.Office.Interop.Outlook.Application接口,如果發生以下情況,我可以獲取Outlook事件來記錄OK:

a)當我的應用程序啟動時,Outlook已經在運行,

b)如果我的應用程序運行后Outlook已啟動。 (為此,我不得不將監視工具應用程序的默認權限從admin更改為普通用戶,以防止COM抱怨類型不匹配)

但是,在以下情況下,我無法使應用程序注冊Outlook事件:

c)Outlook應用在運行時退出,然后重新啟動(在運行時)。

基本上-應用程序為上述(b)處理NewExplorer事件正常,但是一旦退出打開的Outlook應用程序-將不再調用此事件處理程序。 我已經做了一些檢查,並且在退出事件發生時–仍分配了NewExplorer事件。 但是,在下一個展望打開之前,顯然沒有分配。 我已經嘗試在用戶單擊Outlook應用程序按鈕時(因此,在它打開之前)分配它,這不會產生任何運行時錯誤,但這不能解決問題。

…因此,當前,如果用戶開始使用Outlook,然后關閉它,然后重新啟動,則只會記錄第一個Outlook會話中的事件。

我正在使用的OutlookEventListener類粘貼在下面。 它在主申請表上實例化。

問候AG

using System;
using Outlook = Microsoft.Office.Interop.Outlook;

using MonitoringTool.Common;

namespace MonitoringTool.OfficeInterop
{
    public class OutlookEventListener: OfficeEventListener
    {
        public Outlook.Application outlookApp;
        private const string PR_SMTP_ADDRESS = "http://schemas.microsoft.com/mapi/proptag/0x39FE001E";

        private Outlook.Explorer explorer;
        private Outlook.Explorers explorers;
        private Outlook.Folder deletefolder;
        private Outlook.MailItem mailitem;
        private string itemid = "", openitemid = "";



        public OutlookEventListener(NLogger observerLogger)
        {
            outlookApp = new Outlook.Application();

            outlookApp.Startup += new Outlook.ApplicationEvents_11_StartupEventHandler(outlookApp_Startup);
            outlookApp.ItemSend += new Outlook.ApplicationEvents_11_ItemSendEventHandler(outlookApp_ItemSend);
            outlookApp.NewMailEx += new Outlook.ApplicationEvents_11_NewMailExEventHandler(outlookApp_NewMailEx);
            (outlookApp as Outlook.ApplicationEvents_11_Event).Quit += new Outlook.ApplicationEvents_11_QuitEventHandler(outlookApp_Quit);

            deletefolder = outlookApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderDeletedItems) as Outlook.Folder;
            deletefolder.Items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(ItemDelete);

            //Outlook.Folder inboxfolder = outlookApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
            //inboxfolder.BeforeItemMove += new Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler(ItemMove);

            explorers = outlookApp.Explorers;
            if (outlookApp.Explorers.Count > 0)
            {
                explorer = outlookApp.ActiveExplorer();
                explorer.FolderSwitch += new Outlook.ExplorerEvents_10_FolderSwitchEventHandler(explorer_FolderSwitch);
                explorer.SelectionChange += new Outlook.ExplorerEvents_10_SelectionChangeEventHandler(explorer_SelectionChange);
                (explorer.CurrentFolder as Outlook.Folder).BeforeItemMove += 
                    new Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler(ItemMove);
            }
            else  
            {

                explorers.NewExplorer +=
                    new Outlook.ExplorersEvents_NewExplorerEventHandler(outlookApp_NewExplorer);
            }

            outlookApp.Inspectors.NewInspector += new Outlook.InspectorsEvents_NewInspectorEventHandler(inspectors_NewInspector);
            RegisterObserver(observerLogger);
            Observer.OutlookReady();
        }

        private void outlookApp_Startup()
        {
            LoggerEventArgs e = new LoggerEventArgs();
            e.LogTime = string.Format("[{0:HH:mm:ss.fff}]", DateTime.Now);
            e.MessageLevel = LoggerMessageLevel.Level3;
            e.MessageType = MessageType.OUTL_START_APP;
            e.MessageText = ""; 

            Observer.LogEvent(e);
        }

        private void outlookApp_ItemSend(Object Item, ref bool Cancel)
        {
            Outlook.MailItem newMailItem = outlookApp.ActiveInspector().CurrentItem as Outlook.MailItem;

            LoggerEventArgs e = new LoggerEventArgs();
            e.LogTime = string.Format("[{0:HH:mm:ss.fff}]", DateTime.Now);
            e.MessageLevel = LoggerMessageLevel.Level3;
            e.MessageType = MessageType.OUTL_SEND_EMAIL;
            e.MessageText = "SUBJECT=" + newMailItem.Subject + "; " +
                "RECIPIENTS=" + GetSMTPAddressForRecipients(newMailItem) + "; " +
                "BODY=" + newMailItem.Body; 
            Observer.LogEvent(e);
        }

        private string GetSMTPAddressForRecipients(Outlook.MailItem mail)
        {
            Outlook.Recipients recips = mail.Recipients;
            string strrecips = "";

            foreach (Outlook.Recipient recip in recips)
            {
                Outlook.PropertyAccessor pa = recip.PropertyAccessor;
                string smtpAddress = pa.GetProperty(PR_SMTP_ADDRESS).ToString();
                if (!string.IsNullOrEmpty(strrecips))
                    strrecips += ", ";
                strrecips += recip.Name + " (" + smtpAddress + ")";
            }

            return strrecips;
        }

        private void outlookApp_NewMailEx(string entryID)
        {
            try
            { 
                Outlook.NameSpace outlookNS = outlookApp.GetNamespace("MAPI");
                Outlook.MAPIFolder folder = outlookApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
                if (outlookNS != null)
                {
                    Outlook.MailItem mailItem = outlookNS.GetItemFromID(entryID, folder.StoreID) as Outlook.MailItem;

                    Outlook.PropertyAccessor pa = mailItem.Sender.PropertyAccessor;
                    string smtpAddress = pa.GetProperty(PR_SMTP_ADDRESS).ToString();

                    LoggerEventArgs e = new LoggerEventArgs();
                    e.LogTime = string.Format("[{0:HH:mm:ss.fff}]", DateTime.Now);
                    e.MessageLevel = LoggerMessageLevel.Level3;
                    e.MessageType = MessageType.OUTL_RECEIVE_MAIL;
                    e.MessageText = "SUBJECT=" + mailItem.Subject + "; " +
                        "RECIPIENTS=" + GetSMTPAddressForRecipients(mailItem) + "; " +
                        "BODY=" + mailItem.Body; 
                    Observer.LogEvent(e);
                }
            }
            catch (Exception e) 
            {
                ErrorLogEventArgs err = new ErrorLogEventArgs();
                err.LogTime = string.Format("[{0:HH:mm:ss.fff}]", DateTime.Now);
                err.MessageText = e.Message;
                err.StackTrace = e.StackTrace; 

                Observer.LogException(err);
            }
        }

        private void outlookApp_Quit()
        {
            LoggerEventArgs e = new LoggerEventArgs();
            e.LogTime = string.Format("[{0:HH:mm:ss.fff}]", DateTime.Now);
            e.MessageLevel = LoggerMessageLevel.Level3;
            e.MessageType = MessageType.OUTL_QUIT_APP;
            e.MessageText = "";             
            Observer.LogEvent(e);

            // At this point: explorers = outlookApp.Explorers ... ie not Null

        }

        private void ItemDelete(object item)
        {
            LoggerEventArgs e = new LoggerEventArgs();
            e.LogTime = string.Format("[{0:HH:mm:ss.fff}]", DateTime.Now);
            e.MessageLevel = LoggerMessageLevel.Level3;
            e.MessageType = MessageType.OUTL_DELETE_MAIL;
            e.MessageText = (item as Outlook.MailItem).Subject; 

            Observer.LogEvent(e);
        }

        private void ItemMove(Object Item, Outlook.MAPIFolder MoveTo, ref bool Cancel)
        {
            LoggerEventArgs e = new LoggerEventArgs();
            e.LogTime = string.Format("[{0:HH:mm:ss.fff}]", DateTime.Now);
            e.MessageLevel = LoggerMessageLevel.Level3;
            e.MessageType = MessageType.OUTL_MOVE_MAIL;
            e.MessageText = MoveTo.Name; 

            Observer.LogEvent(e);
        }


        // This event handler only gets called when Outlook application has not been 'quit' during runtime.

        public void outlookApp_NewExplorer(Outlook.Explorer Explorer)
        {
            if (explorer == null)
            {
                LoggerEventArgs e = new LoggerEventArgs();
                e.LogTime = string.Format("[{0:HH:mm:ss.fff}]", DateTime.Now);
                e.MessageLevel = LoggerMessageLevel.Level3;
                e.MessageType = MessageType.OUTL_START_APP;
                e.MessageText = "";
                Observer.LogEvent(e); 

                explorer = outlookApp.ActiveExplorer();
                explorer.FolderSwitch += new Outlook.ExplorerEvents_10_FolderSwitchEventHandler(explorer_FolderSwitch);
                explorer.SelectionChange += new Outlook.ExplorerEvents_10_SelectionChangeEventHandler(explorer_SelectionChange);
            }
        }        

        private void explorer_FolderSwitch()
        {
            (explorer.CurrentFolder as Outlook.Folder).BeforeItemMove +=
                new Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler(ItemMove);
            deletefolder.Items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(ItemDelete);

            LoggerEventArgs e = new LoggerEventArgs();
            e.LogTime = string.Format("[{0:HH:mm:ss.fff}]", DateTime.Now);
            e.MessageLevel = LoggerMessageLevel.Level3;
            e.MessageType = MessageType.OUTL_SWITCH_FOLDER;
            e.MessageText = explorer.CurrentFolder.Name; 

            Observer.LogEvent(e);
        }

        private void explorer_SelectionChange()
        {
            try
            {
                if (explorer.Selection.Count > 0)
                {
                    Object selObject = explorer.Selection[1];
                    if (selObject is Outlook.MailItem)
                    {
                        mailitem = (selObject as Outlook.MailItem);

                        if (!itemid.Equals(mailitem.EntryID))
                        {
                            itemid = mailitem.EntryID;

                            mailitem.Open += mailitem_Open;
                            (mailitem as Outlook.ItemEvents_10_Event).Reply += mailitem_Reply;
                            (mailitem as Outlook.ItemEvents_10_Event).ReplyAll += mailitem_ReplyAll;
                            (mailitem as Outlook.ItemEvents_10_Event).Forward += mailitem_Forward;

                            (explorer.CurrentFolder as Outlook.Folder).BeforeItemMove +=
                                new Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler(ItemMove);
                            deletefolder.Items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(ItemDelete);

                            LoggerEventArgs e = new LoggerEventArgs();                            
                            e.LogTime = string.Format("[{0:HH:mm:ss.fff}]", DateTime.Now);
                            e.MessageLevel = LoggerMessageLevel.Level3;
                            e.MessageType = MessageType.OUTL_CHANGE_SEL;
                            e.MessageText = mailitem.Subject; 

                            Observer.LogEvent(e);
                            LoggerEventArgs e2 = new LoggerEventArgs();
                            if (mailitem.UnRead)
                                e2.LogTime = string.Format("[{0:HH:mm:ss.fff}]", DateTime.Now);
                                e2.MessageLevel = LoggerMessageLevel.Level3;
                                e2.MessageType = MessageType.OUTL_READ_MAIL;
                                e2.MessageText = mailitem.Subject;
                                Observer.LogEvent(e2);
                        }
                    }
                }
            }
            catch //(Exception ex)
            {
                //outlook is closing
                return;
            }
        }

        private void mailitem_Open(ref bool Cancel)
        {
            if (!openitemid.Equals(mailitem.EntryID))
            {
                openitemid = mailitem.EntryID;

                LoggerEventArgs e = new LoggerEventArgs(); 
                e.LogTime = string.Format("[{0:HH:mm:ss.fff}]", DateTime.Now);
                e.MessageLevel = LoggerMessageLevel.Level3;
                e.MessageType = MessageType.OUTL_OPEN_MAIL;
                e.MessageText = mailitem.Subject; 

                Observer.LogEvent(e);
            }
        }

        private void mailitem_Reply(Object Response, ref bool Cancel)
        {
            LoggerEventArgs e = new LoggerEventArgs();
            e.LogTime = string.Format("[{0:HH:mm:ss.fff}]", DateTime.Now);
            e.MessageLevel = LoggerMessageLevel.Level3;
            e.MessageType = MessageType.OUTL_REPLY_MAIL;
            e.MessageText = mailitem.Subject; 

            Observer.LogEvent(e);
        }

        private void mailitem_ReplyAll(Object Response, ref bool Cancel)
        {
            LoggerEventArgs e = new LoggerEventArgs();
            e.LogTime = string.Format("[{0:HH:mm:ss.fff}]", DateTime.Now);
            e.MessageLevel = LoggerMessageLevel.Level3;
            e.MessageType = MessageType.OUTL_REPLY_ALL;
            e.MessageText = mailitem.Subject; 

            Observer.LogEvent(e);
        }

        private void mailitem_Forward(Object Item, ref bool Cancel)
        {
            LoggerEventArgs e = new LoggerEventArgs();
            e.LogTime = string.Format("[{0:HH:mm:ss.fff}]", DateTime.Now);
            e.MessageLevel = LoggerMessageLevel.Level3;
            e.MessageType = MessageType.OUTL_FORWARD_MAIL;
            e.MessageText = (Item as Outlook.MailItem).Subject; 

            Observer.LogEvent(e);
        }

        private void inspectors_NewInspector(Outlook.Inspector Inspector)
        {
            if (!(Inspector.CurrentItem as Outlook.MailItem).Sent)
            {
                LoggerEventArgs e = new LoggerEventArgs();
                e.LogTime = string.Format("[{0:HH:mm:ss.fff}]", DateTime.Now);
                e.MessageLevel = LoggerMessageLevel.Level3;
                e.MessageType = MessageType.OUTL_COMPOSE_MAIL;
                e.MessageText = "";

                Observer.LogEvent(e);
            }
        }

        ~OutlookEventListener()
        {
            Dispose(false);
        }

        public override void Dispose()
        {
            LoggerEventArgs e = new LoggerEventArgs();
            e.LogTime = string.Format("[{0:HH:mm:ss.fff}]", DateTime.Now);
            e.MessageLevel = LoggerMessageLevel.StatusUpdate;
            e.MessageType = MessageType.OUTLOOK_WATCHER;
            e.MessageText = "Closing Outlook Monitor."; 

            Observer.LogStatus(e); 
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposed)
                return;

            try
            {
                if (disposing)
                {
                    // Free any other managed objects here.
                    //if (outlookApp != null)
                    //    (outlookApp as Outlook._Application).Quit();
                }

                // Free any unmanaged objects here. 
            }
            catch (Exception e) 
            {
                ErrorLogEventArgs err = new ErrorLogEventArgs();
                err.LogTime = string.Format("[{0:HH:mm:ss.fff}]", DateTime.Now);
                err.MessageText = e.Message;
                err.StackTrace = e.StackTrace; 

                Observer.LogException(err);
            }

            disposed = true;
        }
    }
}

看起來您需要開發一個Outlook添加,可以在其中添加所有Outlook事件。 請快速入門:演練:為Outlook創建您的第一個應用程序級加載項

如果需要從獨立應用程序中獲取任何信息,則可以使用標准機制進行進程間通信(例如WCF-.Net Remoting),以訪問托管外接程序的運行實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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