2015-01-20 95 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

相关问题