.Net实现邮件定时发送问题总结

来源:互联网 发布:第一会软件 编辑:程序博客网 时间:2024/06/06 13:58

环境:
Windows下使用C#实现邮件发送,用的是163邮箱
步骤:
1)登录163邮箱,选择设置-》POP3/SMTP/IMAP设置
开启SMTP服务
2)开启客户端授权码,并设置授权码(此授权码会用于客户端用户登录凭证密码)
3)使用System.Net.Mail实现邮件发送

问题:
采用25端口,在本地实现邮件发送,发送成功,而将程序部署到服务器,却无法发送。
排查:
1)在服务器上,打开命令提示符, 输入:telnet smtp.163.com 25
返回:正在连接smtp.163.com…无法打开到主机的连接。 在端口25:连接失败。
由此判断,可能是由于服务器关闭端口导致,经查实,猜测正确
https://help.aliyun.com/knowledge_detail/51777.html
尝试方案:
1)改为SSL连接,使用465端口,163邮箱服务器SSL设置帮助如下:
http://help.163.com/10/1111/15/6L7HMASV00753VB8.html
2)在服务器上,打开命令提示符,输入:telnet smtp.163.com 465
进入telnet页面(全黑),光标闪烁,表示465端口正常
3)在代码里修改端口为465,设置EnableSSL=true,尝试发送,发送失败。
搜索查询,得到的问题答案是:
System.Net.Mail只支持显式SSL
引发的问题:
1)什么是显式SSL和隐式SSL
explicit SSL:
explicit SSL会执行以下操作:尝试连接25端口 -> 申请加密连接( StartTLS)-> 认证-> 发送数据, 如果SMTP服务器要求一开始就需要加密连接,那么使用explicit SSL 就会发送失败
implicit SSL:
申请加密连接(Start SSL) -> 连接-> 认证-> 发送数据
(参考来源:
https://blogs.msdn.microsoft.com/webdav_101/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465/)
2)怎么验证邮箱服务器是使用explicit SSL 还是 implicit SSL:
按惯例来说,使用25端口正常模式下的SMTP发送,使用的是显式的SSL,而使用465端口,采用SSL协议的SMTPS发送,使用的是隐式SSL,邮件发送使用587端口的使用的是显式SSL。
想要确定到底是使用哪一种SSL,可以通过Telnet端口号来确定,比如”telnet smtp.163.com 25.如果服务器返回文本信息标识连接成功,那么你就是在使用显式SSL连接,如果你连接成功但没有看到任何返回,那么你就是使用隐式SSL连接
(参考来源: https://stackoverflow.com/questions/172811/is-there-a-way-i-can-tell-whether-an-smtp-server-is-expecting-a-client-to-connec)
最终方案:
使用第三方插件 Aegis Implicit Mail (AIM) V1.0.3
https://sourceforge.net/p/netimplicitssl/wiki/Home/
遇到问题:
1)
如果发送的邮件内容中包含HTML内容,需要使用以上带6个参数的MimeMailer的构造函数,邮件才能正确显示HTML

 _mailer = new MimeMailer(smtpInfo.SmtpHost, smtpInfo.SmtpPort.Value, smtpInfo.SmtpUserName,                smtpInfo.SmtpPassword, SslMode.Ssl, AuthenticationType.Base64);

2)发送的主题包含中文,无法正确显示。(乱码)
最后还是修改了插件源码,给主题加上使用UTF-8编码才解决了问题。

主要参考:
http://www.ruanyifeng.com/blog/2008/06/mime.html
https://en.wikipedia.org/wiki/MIME#Difference_between_Q-encoding_and_quoted-printable

原创粉丝点击