MailKit:由于意外的数据包格式,握手失败

MailKit: The handshake failed due to an unexpected packet format

当我尝试使用 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.

问题

代码

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

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.

问题是您正在连接到纯文本端口并需要 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);