当我尝试使用带有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没有任何直接联系。希望问题消失。
答案 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需要它