我在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
如果是这样,为什么在连接上不使用SSL无效?我需要将useSSL设置为false吗?当我上面一行时,我对useSSL的工作方式感到困惑。
答案 0 :(得分:0)
邮件协议(SMTP,IMAP和POP3)都有两种不同的SSL方式。
System.Net.Mail.SmtpClient仅实现了对STARTTLS
进行SSL的支持,而MailKit两者都支持。
在MailKit的useSsl
方法中将true
指定为Connect
时,它假定您要使用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
相同。换句话说,它将端口25
和587
视为纯文本连接端口,但是如果通过STARTTLS
请求将其切换为SSL / TLS。