【发布时间】:2020-05-12 11:53:33
【问题描述】:
我正在尝试更改我们的代码以使用 MailKit 发送电子邮件,因为旧的 SMTPClient 已过时。
我们连接到我们自己的服务器,不需要进行身份验证。代码如下:
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,而我的老板说必须有办法做到这一点(我基本上回答了......好吧,如果我们的系统和证书井井有条。她不是很高兴哈哈)。
所以,现在我在这里问你是否有任何方法可以做到这一点。使用没有证书的 TLS 发送电子邮件。有什么想法吗?
【问题讨论】:
-
ServicePointManager.ServerCertificateValidationCallback = Function(s, c, ca, pe) Return True End Function(在 3 行中,在创建连接之前) -
正如@jstedfast 所指出的,
ServerCertificateValidationCallback的使用必须限于众所周知的、可靠的来源,出于可以理解的原因,由于证书验证失败而产生异常。您可以构建一个验证回调,如here 所示(参见TlsValidationCallback代码),修改它(使用此处答案中的示例作为蓝图)以仅处理已知的颁发者。之后,您可以将ServerCertificateValidationCallback设置为Nothing(这样其他代码就不会误调用它)。