什么时候需要在 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
的方式相同。换句话说,它将端口 25
和 587
视为 plain-text 连接端口,但如果通过 STARTTLS
请求这样做,它将切换到 SSL/TLS。
我在 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
的方式相同。换句话说,它将端口 25
和 587
视为 plain-text 连接端口,但如果通过 STARTTLS
请求这样做,它将切换到 SSL/TLS。