2015-01-20 93 views
0

我想創建一個服務,它將作爲服務器上的後臺服務運行。該服務一進入收件箱就會解析郵件。解析屬於其他帳戶的收件箱中的Outlook電子郵件

我們有一個電子郵件帳戶[email protected]。我們正在使用Outlook來檢查電子郵件。這是一項服務,所以Outlook不會一直在服務器上運行。我想爲此帳戶自動解析電子郵件。此帳戶不是我的電子郵件帳戶。我在C#程序中使用Microsoft.Office.Interop.outlook。

該程序正在運行,但它正在解析我的電子郵件收件箱中的電子郵件。我不知道如何指定特定的電子郵件來解析收件箱。需要知道新郵件到達時觸發的事件。我的程序從我的收件箱中解析了一半的電子郵件,但之後它拋出了對象空引用錯誤。

static void Main(string[] args) 
    { 
     Microsoft.Office.Interop.Outlook.Application myApp=new Microsoft.Office.Interop.Outlook.Application(); 
     try 
     { 
      String Subject, Body, Createdate, Sender = null; 
      Microsoft.Office.Interop.Outlook.NameSpace mapinamespace = myApp.GetNamespace("MAPI"); 

      mapinamespace.Logon(null, null,true,true); 
      Microsoft.Office.Interop.Outlook.MAPIFolder myInbox = mapinamespace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox); 
      Microsoft.Office.Interop.Outlook.Accounts accounts = myApp.Session.Accounts; 
      try 
      { 
       foreach (Microsoft.Office.Interop.Outlook.Account account in accounts) 
       { 
        if (account.SmtpAddress == "[email protected]") 
        { 
         Console.Write(account); 
        } 
        else 
        { 
         Console.Write("Not found ---"); 
        } 
       } 
      } 
      catch{ 
      throw new System.Exception(string.Format("No account with amtp:{0} exists!"));} 

      foreach (object item in myInbox.Items) 
      { 
       try 
       { 
        var mail = item as MailItem; 
        if (mail != null) 
        { 
         //Creation date 
         Createdate = mail.CreationTime.ToString(); 
         Console.WriteLine("CreationTime---" + Createdate); 
         //Grab the senders address 
         Sender = mail.SenderEmailAddress.ToString(); 
         Console.WriteLine("Sender's E-mail---" + Sender); 
         //grab the Subject 
         Subject = mail.Subject.ToString(); 
         Console.WriteLine("Subject--" + Subject); 
         //Grab the body 
         Body = mail.Body.ToString(); 
         Console.WriteLine("Body---" + Body); 

         //Grab the Attachment 

        } 
        else 
        { 
         Console.Write("Error in mail---"); 
        } 
       } 
       catch (System.Runtime.InteropServices.COMException e) 
       { 
        Console.Write(e); 
       } 
      } 
     } 
     catch (System.Runtime.InteropServices.COMException e) 
     { 
      Console.Write(e); 
     } 



    } 

回答

0

我試圖創造出將運行在服務器後臺服務的服務。

微軟目前並不提倡,不支持,Microsoft Office應用程序自動化從任何無人蔘與的非交互式客戶端應用程序或組件(包括ASP,ASP.NET,DCOM和NT Service),因爲Office在此環境中運行時可能會出現不穩定的行爲和/或死鎖。

如果您正在構建一個在服務器端上下文中運行的解決方案,那麼您應該嘗試使用對於無人執行安全的組件。或者,您應該嘗試找到允許至少部分代碼運行客戶端的替代方案。如果您從服務器端解決方案使用Office應用程序,則該應用程序將缺少成功運行所需的許多必要功能。此外,您將面臨整體解決方案穩定性的風險。

您可以在Considerations for server-side Automation of Office文章中閱讀更多關於此的內容。

無論如何,它看起來像你對Application類的NewMailEx事件感興趣。另外我建議你閱讀下面的系列文章:

+0

NewMailEx僅觸發配置文件中主郵箱中收到的郵件。它不會觸發委託郵箱中的郵件。 – 2015-01-20 19:57:53

+0

謝謝。是的,我確實意識到我正在嘗試使用Exchange管理的API。 – user2897967 2015-01-23 16:44:25

0

正如尤金提到的,你不能使用Outlook(或任何其他Office應用程序)在服務中。

對於Exchange郵箱,可以使用EWS(基於HTTP)而不是Outlook對象模型。

您還可以使用擴展MAPI(C++或Delphi)或Redemption(任何語言)來訪問服務中的Outlook數據。

+0

謝謝。我正在嘗試使用EWS。 – user2897967 2015-01-23 16:45:44

相關問題