【问题标题】:read email using exchange web services使用 Exchange Web 服务阅读电子邮件
【发布时间】:2012-07-13 16:53:28
【问题描述】:

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

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的方法,我不确定url是否正确。事实是我收到了这个错误:

“找不到自动发现服务”。

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

【问题讨论】:

  • 我相信您现在已经找到了一种方法,因为这个问题已经存在一年了,只是想补充一点,使用调用 AutoDiscoverUrl 并不是连接 EWS 的唯一方法。相反,自己直接设置 url 可能是一个可行的选择。示例:service.Url = new URI("https://your_exchange_server/EWS/Exchange.asmx");
  • 硬编码 service.Url 不是正确的方法!我们使用自动发现是有目的的。它让我们不用担心用户是在本地还是 Office365。 EWS 端点 Url 将自动设置为 service.Url。

标签: email exchangewebservices exchange-server-2010


【解决方案1】:

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

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

注意:第一个错误确实告诉您自动发现 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】:

    最近遇到了类似的问题并正在努力解决这些问题,我发现了一个对故障排除非常有帮助的实用程序:EWS Editor 它可能无法解决您的问题,但可以用于非常快速地迭代不同的配置组合,这将希望能对您的问题有所了解。

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

    来自http://ewseditor.codeplex.com

    项目描述

    EWSEditor 有三个目标:

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

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

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

    【讨论】:

      【解决方案3】:

      这是一篇旧帖子,我想我应该为报告的错误提供一个完整的示例解决方案。只需将 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");
      

      【讨论】:

        【解决方案4】:

        试试service.TraceEnabled = true;

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

        【讨论】:

          【解决方案5】:

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

             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

          问候!

          【讨论】:

            【解决方案6】:

            当您将 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 Forbidden on Autodiscovery call。它在代理设置后确实有效。

            【讨论】:

              猜你喜欢
              • 2023-03-15
              • 1970-01-01
              • 2017-04-19
              • 2011-05-23
              • 2011-08-10
              • 1970-01-01
              • 1970-01-01
              • 2010-10-13
              • 2023-03-15
              相关资源
              最近更新 更多