【问题标题】:Can not programmatically send email using web service of MS Exchange Server 2010 SP2无法使用 MS Exchange Server 2010 SP2 的 Web 服务以编程方式发送电子邮件
【发布时间】:2012-11-02 15:17:48
【问题描述】:

我有一个使用 MS Exchange Server 2010 SP2 的 Web 服务发送电子邮件的应用程序 (C#)。它以前工作正常。但是,就在两周前,我遇到了问题。有时代码可以发送电子邮件,但有时不能。我收到如下错误消息(完整的错误消息显示在最后)。

The request failed. Unable to connect to the remote server

我的代码如下。

string ewsUrl = "https://xxxx.xxxx.com/ews/Exchange.asmx";
string userName = "xxxx";
string password = "xxxx";
string to = "xxxx@xxxx.com";
string cc = "xxxx@xxxx.com";

ExchangeService service = new ExchangeService();
service.Url = new Uri(ewsUrl);
service.UseDefaultCredentials = true;
service.Credentials = new WebCredentials(userName, password);

EmailMessage message = new EmailMessage(service);
message.Subject = subject;
message.Body = bodyHtml;
message.ToRecipients.Add(to);
message.CcRecipients.Add(cc);

message.SendAndSaveCopy();

我不知道出了什么问题。我相信该 URL 是正确的,它有时会起作用,但有时会不起作用。我在互联网上进行了搜索,但没有找到任何解决方案。 这与服务器配置有关吗? 我已经和我的 IT 人员谈过了,但他似乎对 Web 服务一无所知。请帮我。完整的错误信息如下。

The request failed. Unable to connect to the remote server
    at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ValidateAndEmitRequest(HttpWebRequest& request)
    at Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.InternalExecute()
    at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.Execute()
    at Microsoft.Exchange.WebServices.Data.ExchangeService.InternalCreateItems(IEnumerable`1 items, FolderId parentFolderId, Nullable`1 messageDisposition, Nullable`1 sendInvitationsMode, ServiceErrorHandling errorHandling)
    at Microsoft.Exchange.WebServices.Data.ExchangeService.CreateItem(Item item, FolderId parentFolderId, Nullable`1 messageDisposition, Nullable`1 sendInvitationsMode)
    at Microsoft.Exchange.WebServices.Data.Item.InternalCreate(FolderId parentFolderId, Nullable`1 messageDisposition, Nullable`1 sendInvitationsMode)
    at Microsoft.Exchange.WebServices.Data.EmailMessage.InternalSend(FolderId parentFolderId, MessageDisposition messageDisposition)
    at Microsoft.Exchange.WebServices.Data.EmailMessage.Send()

【问题讨论】:

  • 你想连接什么端口? "xxx.." 暗示 443 。可以从您的网络服务器访问该端口吗?
  • 您是否尝试过使用 AutodiscoverUrl 功能? msdn.microsoft.com/en-us/library/exchange/…
  • 我也必须指定端口吗?我的网址只是"https://email.companydomain.com/ews/Exchange.asmx";
  • 我尝试了 AutodiscoverUrl 功能,但它变得更糟。我的服务器阻止了该功能,错误消息建议我使用 AutodiscoverRedirectionUrlValidationCallback。那我试试。但仍然没有成功。我的回调如下。 static bool RedirectionUrlValidationCallback(String redirectionUrl) { return (redirectionUrl == "https://autodiscover-s.companydomain.com/autodiscover/autodiscover.xml"); } 这是正确的吗?请建议

标签: c# .net email exchangewebservices exchange-server-2010


【解决方案1】:
ServicePointManager.ServerCertificateValidationCallback = 
    delegate(object sender1,
             System.Security.Cryptography.X509Certificates.X509Certificate certificate,
             System.Security.Cryptography.X509Certificates.X509Chain chain,
             System.Net.Security.SslPolicyErrors sslPolicyErrors) 
    { return true; };

我认为你需要在message.CcRecipients.Add(cc);之间添加上面的代码 和message.SendAndSaveCopy();

【讨论】:

  • 这完全绕过了服务器证书验证,根据您的环境,这可能很危险。
  • 感谢您的帮助!你能告诉我上面的代码是做什么的吗?可以使用吗? Guvante 所说的“绕过服务器证书验证”是什么意思?谢谢。
  • @Guvante 的意思是上面的代码不检查您所获得的证书的有效性。如您所知,该委托始终返回 true,因此如果该信息不正确,则不会被捕获。这是一个安全风险。我会将它用于测试,但不会超出此范围。如果这能解决您的问题,有文章介绍如何正确检查证书。
猜你喜欢
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多