记录一下C#使用SmtpClient发送网易163、126邮件使用sll协议失败的坑

遇到的坑

默认使用EnableSsl=false本地可以发送邮件,传到服务器上就不行,查找原因是阿里云封掉了25端口,必须使用非25端口才能发送,没办法换ssl协议。

端口选择注意

接收邮件服务器:imap.qq.com,使用SSL,端口号993
发送邮件服务器:smtp.qq.com,使用SSL,端口号465或587
对于ssl/tls加密,使用465端口
对于starttls 一般使用587端口

换了587端口各种不行,查了资料才发现SmtpClient只支持STARTTLS加密

msnd
EnableSsl 属性指定是否使用 SSL 来访问指定的 SMTP 邮件服务器。
还可以在计算机或应用程序配置文件中设置此属性的默认值。 对 EnableSsl 属性所做的任何更改都会覆盖配置文件设置。
SmtpClient 类仅支持在 RFC 3207 中定义的基于传输层安全性的安全 SMTP 的 SMTP 服务扩展。 在此模式下,SMTP 会话在未加密的通道上开始,然后客户端向服务器发出一个 STARTTLS 命令,以使用 SSL 切换到安全通信。 有关详细信息,请参阅 Internet 工程任务组(IETF)发布的 RFC 3207。
备用连接方法是在发送任何协议命令之前提前建立 SSL 会话的位置。 此连接方法有时被称为 SMTP/SSL、SMTP over SSL 或 SMTPS,并在默认情况下使用端口465。 当前不支持使用 SSL 的替代连接方法。
你可以使用 ClientCertificates 来指定应使用哪些客户端证书建立 SSL 连接。 ServerCertificateValidationCallback 允许您拒绝 SMTP 服务器提供的证书。 SecurityProtocol 属性允许你指定要使用的 SSL 协议的版本。

网易的163刚好不支持,下面列举了些部分邮箱及对应的smtp服务器和支持的协议

邮箱 smtp服务器 支持的协议(可能有遗漏)
gmail smtp.gmail.com TLS/ STARTTLS(TLS)
qq smtp.qq.com SSL/TLS/ STARTTLS(TLS)
foxmail smtp.exmail.qq.com SSL/TLS/ STARTTLS(TLS)
outlook smtp-mail.outlook.com STARTTLS(TLS)
雅虎 smtp.mail.yahoo.com TLS/STARTTLS(TLS)
网易163 smtp.163.com SSL/TLS
hotmail smtp.live.com STARTTLS(TLS)
icloud smtp.mail.me.com STARTTLS(TLS)
Yandex smtp.yandex.ru SSL/TLS/STARTTLS(SSL/TLS)
GMX smtp.gmx.com TLS/STARTTLS
新浪 smtp.sina.com SSL/TLS/STARTTLS(SSL/TLS)
aol smtp.aol.com TLS/STARTTLS
rediff smtp.rediffmail.com SSL/TLS/STARTTLS(SSL/TLS)

解决方案

如果你使用的是.NET SmtpClient,需要使用支持STARTTLS协议的邮箱,比如QQ邮箱