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.
问题
- 为什么
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.
问题是您正在连接到纯文本端口并需要 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);
当我尝试使用 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.
问题是您正在连接到纯文本端口并需要 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);