【问题标题】:Parse Outlook email in Inbox which belongs to other account解析收件箱中属于其他帐户的 Outlook 电子邮件
【发布时间】:2015-03-19 03:12:03
【问题描述】:

我正在尝试创建一个将作为后台服务在服务器上运行的服务。此服务将在电子邮件进入收件箱后立即对其进行解析。

我们有一个电子邮件帐户 abc@organization.com。我们正在使用 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 == "abc@organization.com")
                    {
                        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);
        }



    }

【问题讨论】:

    标签: c# outlook office-interop


    【解决方案1】:

    正如 Eugene 所述,您不能在服务中使用 Outlook(或任何其他 Office 应用程序)。

    对于 Exchange 邮箱,您可以使用 EWS(基于 HTTP)而不是 Outlook 对象模型。

    您还可以使用扩展 MAPI(C++ 或 Delphi)或 Redemption(任何语言)访问服务中的 Outlook 数据。

    【讨论】:

    • 谢谢。我正在尝试使用 EWS。
    【解决方案2】:

    我正在尝试创建一个将作为后台服务在服务器上运行的服务。

    Microsoft 目前不推荐也不支持从任何无人值守的非交互式客户端应用程序或组件(包括 ASP、ASP.NET、DCOM 和 NT 服务)自动化 Microsoft Office 应用程序,因为 Office在此环境中运行 Office 时可能会出现不稳定的行为和/或死锁。

    如果您要构建在服务器端上下文中运行的解决方案,您应该尝试使用已确保无人值守执行安全的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方案。如果您使用服务器端解决方案中的 Office 应用程序,该应用程序将缺少许多成功运行所需的功能。此外,您将在整体解决方案的稳定性方面承担风险。

    您可以在Considerations for server-side Automation of Office 文章中了解更多相关信息。

    无论如何,您似乎对 Application 类的 NewMailEx 事件感兴趣。另外我建议阅读以下系列文章:

    【讨论】:

    • NewMailEx 仅针对在配置文件的主邮箱中收到的邮件触发。它不会为委托邮箱中的邮件触发。
    • 谢谢。是的,我确实意识到我正在尝试使用 Exchange 托管 API。
    猜你喜欢
    • 2015-10-03
    • 2012-03-24
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多