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

When is it necessary to enable SSL on 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

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

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

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

当您在 MailKit 的 Connect 方法中将 useSsl 指定为 true 时,它假定您打算使用 SSL-wrapped 连接(不同于 STARTTLS).

为了减少混淆,MailKit 有一个 Connect 方法,它接受一个 SecureSocketOptions 参数而不是 bool.

选项如下:

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

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

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

后来,管理员和用户要求 SSL 加密,所以管理员和邮件客户端开始支持端口 465 上的 SSL-wrapped 连接,因为这对管理员来说很容易做到(不需要升级服务器软件)不支持 SSL-wrapped 连接的客户端可以继续在端口 25) 上连接。

几年后,邮件协议作者为 IMAP、SMTP 和 POP3 引入了 STARTTLS 命令扩展(好吧,对于 POP3,命令是 STLS 但其他方面是一样的thing) 客户可以选择使用,如果他们支持的话。此扩展仅对原始(非SSL-wrapped)端口有意义。

如今,STARTTLS 是加密客户端和邮件服务器之间通信的首选方法,但 SSL-wrapped 端口仍在广泛使用。

MailKit 对待端口 587 的方式与对待端口 25 的方式相同。换句话说,它将端口 25587 视为 plain-text 连接端口,但如果通过 STARTTLS 请求这样做,它将切换到 SSL/TLS。