简体   繁体   English

Microsoft.Office.Interop.Outlook

[英]Microsoft.Office.Interop.Outlook

I am using the Microsoft.Office.Interop.Outlook.Application interface I can get Outlook events to record OK if: 我正在使用Microsoft.Office.Interop.Outlook.Application接口,如果发生以下情况,我可以获取Outlook事件来记录OK:

a) Outlook is already running when my application starts, a)当我的应用程序启动时,Outlook已经在运行,

b) If Outlook started once my application is running. b)如果我的应用程序运行后Outlook已启动。 (To do this I had to change default permissions of the Monitoring tool application from admin to normal user – to stop COM complaining about type mis-matches) (为此,我不得不将监视工具应用程序的默认权限从admin更改为普通用户,以防止COM抱怨类型不匹配)

BUT I cannot get the application to register outlook events if: 但是,在以下情况下,我无法使应用程序注册Outlook事件:

c) The Outlook app is quit, during run-time and then re-started (during run-time). c)Outlook应用在运行时退出,然后重新启动(在运行时)。

Basically – the application handles a NewExplorer event OK for (b) above, but once an open outlook app has been quit – this event handler is no longer called. 基本上-应用程序为上述(b)处理NewExplorer事件正常,但是一旦退出打开的Outlook应用程序-将不再调用此事件处理程序。 I have done some checks, and at the time of the Quit event – the NewExplorer event is still assigned. 我已经做了一些检查,并且在退出事件发生时–仍分配了NewExplorer事件。 But then obviously becomes unassigned before the next outlook open. 但是,在下一个展望打开之前,显然没有分配。 I've tried assigning it when the user clicks on the Outlook app button (so just before it opens) and this doesn't produce any runtime error, but this does not solve the problem. 我已经尝试在用户单击Outlook应用程序按钮时(因此,在它打开之前)分配它,这不会产生任何运行时错误,但这不能解决问题。

…So currently if a user starts using Outlook, then shuts it and then restarts, only events from the first Outlook session will be recorded. …因此,当前,如果用户开始使用Outlook,然后关闭它,然后重新启动,则只会记录第一个Outlook会话中的事件。

The OutlookEventListener class that I am using is pasted below. 我正在使用的OutlookEventListener类粘贴在下面。 It is instantiated on the main application form. 它在主申请表上实例化。

Regards AG 问候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;
        }
    }
}

It looks like you need to develop an Outlook add where you can all Outlook events. 看起来您需要开发一个Outlook添加,可以在其中添加所有Outlook事件。 See Walkthrough: Creating Your First Application-Level Add-in for Outlook to get started quickly. 请快速入门:演练:为Outlook创建您的第一个应用程序级加载项

If you need to get any information from a standalone application you can use standard mechanism for inter-process communications (for example, WCF - .Net Remoting) to access the running instance of your managed add-in. 如果需要从独立应用程序中获取任何信息,则可以使用标准机制进行进程间通信(例如WCF-.Net Remoting),以访问托管外接程序的运行实例。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM