由于旧的SMTPClient已过时,我试图更改我们的代码以使用MailKit发送电子邮件。
我们连接到我们自己的服务器,不需要进行身份验证。这是代码:
Using client = New SmtpClient()
Dim values = SQL.EMAIL_SQL.GetSMTPInfo("MailHostOutsideNetwork")
client.Connect(values.Item1, values.Item2, Security.SecureSocketOptions.None)
client.Send(Message)
client.Disconnect(True)
End Using
只要不使用TLS或SSL,我就能正常工作并发送电子邮件。当我尝试使用它们中的任何一个时,都会出现异常:
尝试建立SSL或TLS连接时发生错误。由于以下原因,无法验证服务器的SSL证书:-服务器证书具有以下错误:-已处理的证书链,但终止于受信任提供者不信任的根证书。
所以,我的第一个想法是与我们的IT部门联系并询问证书。他们告诉我,我们从未有过任何证书,而且很有可能永远也不会(某些胡说八道)。问题是他们仍然希望我们在发送电子邮件时使用TLS,而我的老板说必须有一种方法可以做到这一点(我基本上是这样回答的……好吧,如果我们的系统和证书井井有条。她没有vey happy哈哈)。
所以,现在我在这里问你是否有任何办法。使用没有证书的TLS发送电子邮件。有什么想法吗?
如Jimi所述,您可以设置ServerCertificateValidationCallback方法。
如果您阅读以上文档,它可能会为您提供一个比return true
更好的解决方案,但是在最简单的情况下,将其设置为始终返回true的函数将满足您的需求。
根据错误消息,听起来像是是证书链,只是SMTP服务器可能使用自签名SSL证书和/或由生成的根证书您的公司而不是官方的SSL证书颁发机构,因此发送电子邮件的系统不信任SMTP服务器使用的根证书。
您也可以在此处查看MailKit的默认行为:https://github.com/jstedfast/MailKit/blob/master/MailKit/MailService.cs#L356
[基本上,如果问题只是一个不受信任的根(听起来像是您的问题),那么它将退回到它要检查的受信任邮件服务器证书详细信息的硬编码列表上:
var cn = certificate.GetNameInfo (X509NameType.SimpleName, false);
var fingerprint = certificate.Thumbprint;
var serial = certificate.SerialNumber;
var issuer = certificate.Issuer;
显然,您根本不知道这些字符串,但是如果您编写了一个自定义函数来打印此信息,则可以将这些值硬编码到验证回调函数的将来版本中,并感觉到比返回true更安全;-)