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