【问题标题】:When is it necessary to enable SSL on MailKit何时需要在 MailKit 上启用 SSL
【发布时间】:2019-11-22 06:53:41
【问题描述】:

我在 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 的工作方式感到困惑。

【问题讨论】:

  • “此行不应该捕获证书类型” 是的,除非它永远不会走到这一步。

标签: c# mailkit


【解决方案1】:

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

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

当您在 MailKit 的 Connect 方法中将 useSsl 指定为 true 时,它假定您打算使用 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。

【讨论】:

    猜你喜欢
    • 2020-02-24
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2017-10-06
    相关资源
    最近更新 更多