我安装了 hmailserver 5.3.2 并进行了配置。它正常接收和发送电子邮件,但我想用它从位于另一台服务器的 .net/C# 应用程序发送电子邮件,为此我想使用 SSL 通信。之前,该应用程序被配置为通过 gmail 在端口 587 上发送电子邮件,它工作正常,但现在我们想使用我们自己的邮件服务器。我们首先将应用程序配置为连接到端口 25 上的 smtp.domain.com 并且可以正常工作,它会发送电子邮件。
然后我们创建了一个自签名证书来测试我们是否可以通过安全通道发送消息。我创建了带有 openSSL 设置通用名称的证书:mail.domain.com、smtp.domain.com、*.domain.com、域名.com。我在防火墙上打开了端口 587,并将 hmailserver 配置为在该端口上使用证书进行入站连接。我创建的证书都不起作用(我尝试了一个,然后创建了另一个,依此类推),在应用程序中生成以下(通用)异常:
System.Exception: _COMPlusExceptionCode = -532459699
当然,我也尝试通过 telnet 连接:telnet smtp.domain.com 587,但我只是得到一个空白屏幕。这不是防火墙问题,因为当我禁用端口 587 上的 ssl 时,我可以正常连接。在使用 587 和 SSL 时,查看日志甚至没有显示尝试连接。
我已经检查了这些问题:Getting SmtpClient to work with a self signed SSL certificate和Using a self-signed certificate with .NET's HttpWebRequest/Response,但它并没有解决我的问题。ServerCertificateValidationCallback的方法没有任何影响。
我尝试使用端口 25(这也在上述问题之一中提出)、465、587,并且所有 3 个端口都发生了相同的情况:初始握手(SYN / SYN-ACK / ACK),大约 80 秒后连接是关闭(FIN),中间没有。
我是否必须在某处安装该证书以便.net 应用程序将其视为受信任的?我的意思是,我已经将它安装为受信任的根证书颁发机构,并且可以通过运行 mmc 进行检查,所以我现在不知道该去哪里......
谢谢您的帮助!
PS:不确定这是否属于 ServerFault,因为它涉及 C# 应用程序,但也涉及邮件服务器......
编辑:代码示例:
ServicePointManager.ServerCertificateValidationCallback =
(sender, certificate, chain, sslPolicyErrors) => true;
SmtpClient mailClient = new SmtpClient("smtp.domain.com");
mailClient.Credentials = new NetworkCredential("username@domain.com", "pwd");
mailClient.Port = 587;
mailClient.EnableSsl = true;
MailMessage mailMessage = new MailMessage("mailAddressFrom", "mailAddressTo", "subject", "body");
mailMessage.IsBodyHtml = true;
mailClient.Send(mailMessage);
编辑 2:日志(基于 Ramunas 的建议):
"TCPIP" 3588 "2010-06-23 10:02:49.685" "TCPConnection - Posting AcceptEx on 0.0.0.0:465"
"DEBUG" 3588 "2010-06-23 10:02:49.809" "Creating session 24039"
"TCPIP" 772 "2010-06-23 10:04:29.639" "TCPConnection - SSL handshake with client failed. Error code: 2, Message: End of file, Remote IP: X"
"DEBUG" 772 "2010-06-23 10:04:29.639" "Ending session 24039"