什么时候需要在MailKit上启用SSL SSL

时间:2019-07-12 13:35:00

标签: c# mailkit

我在Microsoft网站上看​​到SMTPCLIENT已过时,他们建议使用mailkit进行替换。

我正在编写应用程序以利用Mailkit。

这是我到目前为止所拥有的:

    // *************** SEND EMAIL *******************
    using (var client = new MailKit.Net.Smtp.SmtpClient())
    {
      //accept all SSL certificates
      client.ServerCertificateValidationCallback = (s, c, h, e) => true;

      client.Connect(emailSettings.SmtpServer, emailSettings.SmtpPort, emailSettings.IsSslEnabled);

      if (emailSettings.IsAuthenticationRequired)
      {
        // Note: only needed if the SMTP server requires authentication
        client.Authenticate(emailSettings.SmtpUsername, emailSettings.SmtpPassword);
      }

      // timeout = 20 seconds
      client.Timeout = 20000;

      client.Send(message);
      client.Disconnect(true);
    }

当我设置此部分时:

client.Connect(emailSettings.SmtpServer, emailSettings.SmtpPort, emailSettings.IsSslEnabled);

最后一个参数是bool useSSL,我将其设置为true。我的电子邮件服务器由Rackspace托管,因此我知道它使用SSL。当我将此选项设置为true时,它无法发送,但是如果我将此选项设置为false,则可以正常发送。

此行不应该捕获证书类型:

client.ServerCertificateValidationCallback

如果是这样,为什么在连接上不使用SSL无效?我需要将useSSL设置为false吗?当我上面一行时,我对useSSL的工作方式感到困惑。

1 个答案:

答案 0 :(得分:0)

邮件协议(SMTP,IMAP和POP3)都有两种不同的SSL方式。

System.Net.Mail.SmtpClient仅实现了对STARTTLS进行SSL的支持,而MailKit两者都支持。

在MailKit的useSsl方法中将true指定为Connect时,它假定您要使用SSL封装的连接(不同于STARTTLS)。

为减少混乱,MailKit提供了一个Connect方法,该方法采用一个SecureSocketOptions参数而不是一个bool

选项如下:

  • None:请勿使用任何形式的SSL(或TLS)。
  • Auto:根据指定的端口自动决定要使用哪种SSL模式。注意:仅当端口是标准定义的端口(例如SMTP的25、587或465)时,此方法才可靠。
  • SslOnConnect:这指定MailKit应该通过SSL包装的连接进行连接。
  • StartTls:使用STARTTLS方法进行SSL / TLS加密。如果服务器不支持STARTTLS命令,请中止连接。
  • StartTlsWhenAvailable:如果服务器支持,请使用STARTTLS方法进行SSL / TLS加密,否则继续使用未加密的通道。

由于您使用的是SMTP,因此您可能会发现它很有用:

端口25是用于SMTP的原始端口,它最初仅支持未加密的通信。

后来,管理员和用户都要求SSL加密,因此管理员和邮件客户端开始支持端口465上的SSL封装的连接,因为这对管理员来说非常容易(无需升级服务器软件,而需要升级的客户端不支持SSL封装的连接,可以继续在端口25上进行连接。

几年后,邮件协议作者为IMAP,SMTP和POP3引入了STARTTLS命令扩展名(对于POP3,该命令扩展名是STLS,但在其他方面是相同的)客户端可以选择是否使用(如果他们支持的话)。此扩展仅在原始(非SSL封装)端口上有意义。

这几天STARTTLS是加密客户端和邮件服务器之间通信的首选方法,但是SSL封装的端口仍在广泛使用。

MailKit将端口587与对待25相同。换句话说,它将端口25587视为纯文本连接端口,但是如果通过STARTTLS请求将其切换为SSL / TLS。