繁体   English   中英

通过 C#、Exchange 和 EWS 托管 API 发送电子邮件会出现错误 407:请求失败 - 需要代理身份验证。 为什么?

[英]Sending e-mail through C#, Exchange and EWS Managed API gives error 407: Request failed - Proxy authentication required. Why?

我正在为我在一家公司工作的客户编写基于C#EWS 托管 API 2.2.0 (Microsoft.Exchange.WebServices.dll 程序集)的 Windows 窗体应用程序。

该应用程序的逻辑很简单:我的客户将他的电子邮件地址“sender@ABC.domain.com”和收件人的电子邮件地址“recipient@contoso.com”放在一起,然后应用程序将基于 HTML 的电子邮件发送到接受者。

该应用程序必须连接到我客户公司的 Exchange 服务器,以 Windows 域用户身份向 Exchange验证我的客户端(使用 Windows 域身份验证)(客户端已使用其用户名“发件人”登录 Windows,并且该 Windows 用户发出请求) 然后,通过他的邮箱“sender@ABC.domain.com”发送电子邮件。

到目前为止,我已经编写了上面的代码,这似乎是正确的,但它给了我这个错误: “请求失败。远程服务器返回错误:(407)。需要代理身份验证”

    try{

        //Initialize and bound 'service' to the latest known version of Exchange
        ExchangeService service = new ExchangeService();

        //Use the Windows logged-in user domain account credentials:
        //Is this correct / is this enough???
        service.UseDefaultCredentials = true;

        ServicePointManager.ServerCertificateValidationCallback = myValidationCallBackFunction;

        service.AutodiscoverUrl("sender@ABC.domain.com", myRedirectionCallback);
        MessageBox.Show("Autodiscover Exchange URL found:" + service.Url.ToString());

        //Impersonation test - just in case - but this is not make any difference in the error
        service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "sender@ABC.domain.com");

        //Initialize and set an EmailMessage
        EmailMessage message = new EmailMessage(service);
        message.Subject = "HelloWorld";

        string emailMessageBody = "<!DOCTYPE html><html> ... </html>";

        message.Body = new MessageBody(BodyType.HTML, emailMessageBody);
        email.ToRecipients.Add("recipient@contoso.com");

        message.SendAndSaveCopy();

        MessageBox.Show("E-Mail sent successfully");

    }
    catch (Exception ex)
    {
        MessageBox.Show("Error: " + ex.Message);
    }

我的客户使用 Windows 10。他的 PC 是 Windows 域的一部分,URL 为“XYZ.domain.com”,他在 Windows 上的用户名是“sender”。 他还在他的 PC 上安装了一个 Outlook 应用程序,它可以完美地连接到公司网络上的 Exchange 服务器......

我完全是 Windows 域帐户/身份验证的业余爱好者。 这是 Windows 域身份验证问题吗? 这是 Exchange 连接设置问题吗? 或者问题出在我的身份验证部分的代码中(我是否必须添加更多内容)?

我自己找到了一部分解决方案!

现在我的代码工作正常。

问题出在我客户端 PC 上 Windows 10 中的代理设置中。 出于某种原因,他启用了手动代理设置,但他不知道。 当我找到它并禁用它时,电子邮件就可以正常发送了。

我是说我找到了解决方案的“一部分”,因为:

1) Outlook 365 在本地 Exchange Server 2010 上运行良好,即使我是否启用了代理设置。 但我的应用程序只能在禁用代理设置的情况下工作。 有谁知道这是如何解释的? 为什么 Outlook 可以在两种方式下正常工作?

2)如果我客户公司的IT强制他一直启用代理设置,我该如何绕过这个错误? 我是否必须以某种方式传递用户的凭据(带或不带密码)? 如果是,那么我如何用 C# 做到这一点?

  1. 我认为这两种方式都可以正常工作,因为您的客户在 Windows 10 代理设置中启用了“不要将代理服务器用于本地(内联网)地址” 这将解释为什么在连接到本地 Exchange Server 时会绕过代理。
    但是,它没有解释为什么当您的应用程序连接到本地 Exchange Server (?)

  2. 您可以将 EWS 配置为使用System.Net.WebProxy如下所示:

WebProxy myProxy = new WebProxy("http://myproxy", 8080)
{
    BypassProxyOnLocal = true,
    Credentials = new NetworkCredentials("username", "password)
};

exchangeService.WebProxy = myProxy;

您使用的凭据取决于您客户端的代理基础架构。 如果它需要域帐户,您可以设置myProxy.UseDefaultCredentials = true以传入当前用户。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM