【问题标题】:MailKit: The handshake failed due to an unexpected packet formatMailKit:由于意外的数据包格式,握手失败
【发布时间】:2021-10-27 23:37:09
【问题描述】:

当我尝试使用 MailKit SmtpClient 连接到我的 SMTP 服务器时出现异常。 但是如果我使用 System.Net.Mail.SmtpClient 和相同的参数,我的邮件已经发送成功了!

异常消息An error occurred while attempting to establish an SSL or TLS connection.

内部异常消息The handshake failed due to an unexpected packet format.

问题

  • 为什么MailKit.Net.Smtp.SmtpClient 会抛出异常而System.Net.Mail.SmtpClient 不会?它们有什么区别?
  • 如何解决?

代码

初始化邮件发送所需的参数:

var host = "myhost.com";
var port = 2525;
var from = "from@mydomain.com";
var to = "to@mydomain.com";
var username = "from@mydomain.com";
var password = "myPassword";
var enableSsl = true;

使用System.Net.Mail.SmtpClient发送邮件:

var client = new System.Net.Mail.SmtpClient
{
    Host = host,
    Port = port,
    EnableSsl = enableSsl,
    Credentials = new NetworkCredential(username, password)
};

client.Send(from, to, "subject", "body"); // success.

但是当我尝试使用MailKit 连接到具有相同主机和端口的主机时,出现异常:

var mailKitClient = new MailKit.Net.Smtp.SmtpClient();
mailKitClient.Connect(host, port, enableSsl); // it throws the exception.

【问题讨论】:

    标签: c# .net ssl smtp mailkit


    【解决方案1】:

    问题是您正在连接到纯文本端口并期待 SSL。

    在 MailKit 中,true/false useSsl 参数用于决定是在 SSL 模式还是纯文本模式下连接

    在 System.Net.Mail 中,它们不支持以 SSL 模式连接,它们仅支持在连接建立后使用 STARTTLS 命令将纯文本连接升级到 SSL 模式。

    为了克服这个问题,MailKit 有一个不同的 Connect() 方法,它接受一个枚举值 SecureSocketOptions

    你要的是SecureSocketOptions.StartTls:

    var mailKitClient = new MailKit.Net.Smtp.SmtpClient();
    mailKitClient.Connect(host, port, SecureSOcketOptions.StartTls);
    

    【讨论】:

      猜你喜欢
      • 2017-12-25
      • 2011-07-07
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      相关资源
      最近更新 更多