使用交换Web服务阅读电子邮件

时间:2012-07-13 19:39:25

标签: email exchangewebservices exchange-server-2010

这是我的方案:我必须阅读来自Exchange 2010 sp2帐户的电子邮件。我必须使用Exchange Web服务,POP3和IMAP被阻止。我必须在人们只能通过Intranet中的Web浏览器访问其帐户的环境中测试我的应用程序。我无法直接将此应用程序调试到此Intranet。我有这个代码段来访问帐户:

private void Dowork()
{
    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);

    string dominio = "domain";
    string usuario = "user";
    string password = "password";

    service.Credentials = new NetworkCredential(usuario, password, dominio);

    string url = usuario + "@" + dominio + ".com";

    service.AutodiscoverUrl(url, RedirectionUrlValidationCallback);
    //service.AutodiscoverUrl(url);

    FindItemsResults<Item> findResults = service.FindItems(
       WellKnownFolderName.Inbox,
       new ItemView(10));

    string content = string.Empty;

    foreach (Item item in findResults.Items)
    {
        EmailMessage email = EmailMessage.Bind(service, item.Id);
        email.Load();

        content += item.Subject + "\n";
        content += email.From.Address + "\n";
        content += email.Body + "\n\n";

        //Console.WriteLine(item.Subject);
        //Console.WriteLine(email.From.Address);
        //Console.WriteLine(email.Body);
    }

    string result = content;
}

// Create the callback to validate the redirection URL.
static bool RedirectionUrlValidationCallback(String redirectionUrl)
{
    // Perform validation.
    return (redirectionUrl == "https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml");
}

如果我使用这一行:

service.AutodiscoverUrl(url);

我收到此错误:

  

“自动发现阻止了可能不安全的重定向到https://autodiscover.colpatria.com/autodiscover/autodiscover.xml。要允许自动发现遵循重定向,请使用AutodiscoverUrl(string,AutodiscoverRedirectionUrlValidationCallback)重载。”

所以方法RedirectionUrlValidationCallback已经实现,我不确定网址是否正确。事实是我收到了这个错误:

  

“无法找到自动发现服务”。

自动发现是否可能未正确配置?我不是交换管理员,我怎么知道自动发现是否有效?我需要参数来告诉交换管理员必须配置此功能。谢谢你的帮助。

6 个答案:

答案 0 :(得分:3)

最近遇到类似问题并努力解决这些问题我发现了一个在故障排除方面非常有帮助的实用程序:EWS Editor它可能无法解决您的问题,但可以用来快速迭代不同的配置组合这有望为你的问题提供一些启示。

在使用客户端建立自动发现和服务URL连接以测试和生成Exchange服务器时,我使用了此应用程序。它不仅对我而且对客户的IT员工也很方便。他们下载并使用该实用程序来测试和验证他们的设置。

来自http://ewseditor.codeplex.com

项目说明

EWSEditor有三个目标:

  1. 通过源代码向开发人员展示Exchange Web Services托管API功能和简单性。

  2. 演示用于执行通过资源管理器用户界面启动的操作的Exchange Web服务SOAP流量。

  3. 通过深入探索项目,文件夹及其属性,协助非开发人员调试和了解Exchange存储

答案 1 :(得分:2)

不知何故,您需要记录redirectionUrl的结果。当redirectionUrl与您指定的URI不匹配时,您将收到此错误(即您的自动发现验证回调返回FALSE )。当然redirectionUrl URI不是你想象的那样。如果您使用的是SSL - 则需要处理重定向验证回调。

由于您无法调试应用程序,也许您可​​以向自己发送电子邮件,登录到共享数据库或文件,或者使用应用程序事件日志(抛出应用程序异常)。

注意:第一个错误会告诉您自动发现URI为https://autodiscover.colpatria.com/autodiscover/autodiscover.xml。这应该替换现有的字符串https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml吗?

另见related SO post regarding Exchange AutodiscoveryValidating a Potentially Unsafe Redirection URL on MSDN

答案 2 :(得分:1)

这是一篇旧帖子,我认为我已经为报告的错误提供了一个完整的示例解决方案。只需将 service.AutodiscoverUrl(“someuser@somedomain.org”); 替换为 System.Uri(“https://mail.somedomain.org/ews/Exchange.asmx”);

这是完整的代码块

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
                service.Credentials = new WebCredentials("someuser", "somepassword");
                //service.AutodiscoverUrl("someuser@somedomain.org");
                service.Url = new System.Uri("https://mail.somedomain.org/ews/Exchange.asmx");

答案 3 :(得分:0)

尝试service.TraceEnabled = true;

WFM。在我的情况下,我需要通过将证书从Exchange Server安装到客户端计算机上来设置SSL / TLS。我从跟踪输出中找到了这个解决方案。

答案 4 :(得分:0)

这对我来说就像一个魅力:

   var exchange = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
   var username = Settings.EmailUserName;
   var password = Settings.EmailPassword;
   var domain = Settings.EmailDomain;
   var email = Settings.Email;
   exchange.Credentials = new WebCredentials(email, password);
   exchange.AutodiscoverUrl(email, RedirectionCallback);

并且RedirectionCallback是:

 static bool RedirectionCallback(string url)
        {
            // Return true if the URL is an HTTPS URL.
            return url.ToLower().StartsWith("https://");
        }

继承人是链接: https://msdn.microsoft.com/en-us/library/office/dd635285(v=exchg.80).aspx

问候!

答案 5 :(得分:0)

当您将AutodiscoverUrl()与RedirectionUrlValidationCallback一起使用时,下面是示例代码:

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
service.PreAuthenticate = true;
service.Credentials = new WebCredentials("my_username","my_password"); //use WebCredentials instead of NetworkCredential
service.AutodiscoverUrl(userEmailAddress, RedirectionCallback);

和RedirectionCallback方法类似:

        static bool RedirectionCallback(string url)
        {
            bool redirectionValidated = false;
            Uri redirectionUri = new Uri(url);

//There are two ways of implementing a RedirectionCallback scheme

// Way 1: Return true if the URL is an HTTPS URL.
            //return url.ToLower().StartsWith("https://");
            if (redirectionUri.Scheme == "https")
                redirectionValidated = true;

//Way 2: check if url is autodiscovery url
            if (url.Equals(
                "https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml"))
                redirectionValidated = true;

            return redirectionValidated;
        }

PS:小心禁止自动发现服务的代理。就我而言,此代码每次都返回“无法找到自动发现服务”错误,但是根本原因是“ 403在自动发现调用中被禁止”。代理设置后,它确实起作用。