[英]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.