如何发送带有SSL证书的电子邮件?

时间:2017-11-03 04:30:39

标签: c# sockets ssl smtp

我在发送带有SSL证书的电子邮件时遇到了麻烦。 我知道我可以使用第三方,但由于我不想讨论的原因,我不能使用这些。

目前我正在使用

System.Net.Sockets
发送电子邮件。据我所知,使用此方法无法通过SSL发送电子邮件。所以我来到了
System.Net.Security.SslStream
,我发现了一些示例代码来演示如何执行此操作。

在STARTTLS命令之后,我正在创建一个SslStream。这是有效的,但是当我进行握手时,我收到错误消息:由于意外的数据包格式,握手失败。

以下是我创建SSLStream并进行握手的代码。

private SslStream _sslStream = null;
private NetworkStream _networkStream = null;
private TcpClient _client = null;
private bool _SSLActive = false;

public SmtpConnectorWithSSL(string smtpServerAddress, int port) : base(smtpServerAddress, port)
        {
            _client = new TcpClient(smtpServerAddress, port);
            _networkStream = _client.GetStream();
        }    

public override void CreateSSLConnection()
        {
            _sslStream = new SslStream(
                _networkStream,
                true,
                new RemoteCertificateValidationCallback(ValidateServerCertificate),
                null
                );

            // The server name must match the name on the server certificate.
            try
            {
                _sslStream.AuthenticateAsClient(SmtpServerAddress, GetX509CertificateCollection(), SslProtocols.Tls, false);

                _SSLActive = true;
            }
            catch (AuthenticationException e)
            {
                _sslStream = null;
                Console.WriteLine("Exception: {0}", e.Message);
                if (e.InnerException != null)
                {
                    Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
                }
                Console.WriteLine("Authentication failed - closing the connection.");
                _client.Close();
            }
            catch (Exception ex)
            {
                _sslStream = null;
                Console.WriteLine("Error: {0}", ex.Message);
                _client.Close();
            }
        }

错误发生在“AuthenticateAsClient()”函数中。

也许它与我正在加载的证书有关?

public static X509CertificateCollection GetX509CertificateCollection()
    {
        X509Certificate2 certificate1 = new X509Certificate2(@"C:\Users\leo\OneDrive - Cumulo9 Limited\Documents\Cumulo9\StartCom\mailprimer.com\IISServer\2_mailprimer.com.crt");
        X509CertificateCollection collection1 = new X509CertificateCollection();
        collection1.Add(certificate1);
        return collection1;
    }

也许证书是错的,但我不知道如何找到它。我希望错误信息会有所不同。

如果这更容易,我可以提供整个示例项目,如果这有帮助。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

此问题的解决方案是收件人服务器的超时时间为1秒。握手持续时间超过1秒,因此抛出异常。收件人电子邮件服务器将超时更改为30秒后,握手成功。