我在发送带有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;
}
也许证书是错的,但我不知道如何找到它。我希望错误信息会有所不同。
如果这更容易,我可以提供整个示例项目,如果这有帮助。
感谢您的帮助。
答案 0 :(得分:0)
此问题的解决方案是收件人服务器的超时时间为1秒。握手持续时间超过1秒,因此抛出异常。收件人电子邮件服务器将超时更改为30秒后,握手成功。