使用C#发送电子邮件时出现问题

时间:2009-04-29 07:20:56

标签: c# email smtp

当我尝试使用带有gmail的smtp服务器的C#发送电子邮件时,我收到此错误..

“根据验证程序,远程证书无效”。

启用SSL

使用的端口是587

使用的服务器名称是“Smtp.gmail.com”。

用户名和密码正确

outlook express在同一台电脑上使用相同的设置正常工作

c#程序在其他地方也可以正常工作......我们只在客户端才会收到此错误。

非常感谢任何帮助..

由于

编辑:@Andomar,我在哪里可以找到客户端的根证书?我该如何解决这个问题?

@ Alnitak,我如何使用System.Net.Mail库发布starttls?

@ David,我作为“(对象发件人,X509Certificate证书,X509Chain链,SslPolicyErrors sslPolicyErrors)”的参数传递什么“

谢谢大卫。我添加了这些行。但是,我仍然对最近发生的事情感到困惑,因为就我的理解而言,这段代码与System.Net.Mail没有任何直接联系。希望问题消失。

4 个答案:

答案 0 :(得分:2)

还要检查根证书是否在客户端的受信任的根颁发机构存储中。如果这是来自服务,那么将根证书添加到本地计算机存储也可能有所帮助。为了更好地掌握原因,我发现以下政策很有帮助......

public bool ValidateServerCertificate( object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
// No errors so continue…
if (sslPolicyErrors == SslPolicyErrors.None)
       return true;

// I’m just logging it to a label on the page, 
//  this should be stored or logged to the event log at this time. 
lblStuff.Text += string.Format("Certificate error: {0} <BR/>", sslPolicyErrors);

// If the error is a Certificate Chain error then the problem is
// with the certificate chain so we need to investigate the chain 
// status for further info.  Further debug capturing could be done if
// required using the other attributes of the chain.
      if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors)
      {
       foreach (X509ChainStatus status in chain.ChainStatus)
       {
             lblStuff.Text += string.Format("Chain error: {0}: {1} <BR/>", status.Status, status.StatusInformation);
  }
}

// Do not allow this client to communicate 
//with unauthenticated servers.
      return false;
}

要添加策略,请使用以下命令,只需对Application域执行一次。

using System.Net;
...
ServicePointManager.ServerCertificateValidationCallback =
new Security.RemoteCertificateValidationCallback(ValidateServerCertificate);

您也可以使用该策略完全删除错误,但解决问题比解决问题更好。

答案 1 :(得分:1)

检查客户端商店中是否有正确的根证书。客户的系统日期是正确的。

答案 2 :(得分:1)

您是使用STARTTLS还是假设端口587上的连接从一开始就是SSL加密的?

Google smtp.gmail.com上的服务器需要STARTTLS。

答案 3 :(得分:0)

你有没有设置

 client.EnableSsl = true;

因为gmail需要它