网站迁移到了阿里云服务器,有一个系统服务是登录阿里的smtp服务器,发送邮件的。
之前的服务器并非阿里云的,所以没有任何问题,转义到阿里云之后,竟然发现发送报错,如下错误。
System.Net.Mail.SmtpException: 发送邮件失败。
---> System.Net.WebException: 无法连接到远程服务器
---> System.Net.Sockets.SocketException: 由
于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 42.120.226.4:25 在 System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot,
SocketAddress socketAddress) 在 System.Net.ServicePoint.ConnectSocketInternal
(Boolean connectFailure, Socket s4, Socket s6,
Socket& socket, IPAddress& address, ConnectSocketState state,
IAsyncResult asyncResult, Exception& exception) --- 内部异常堆栈跟踪的结尾 --- 在 System.Net.ServicePoint.GetConnection(PooledStream PooledStream,
Object owner, Boolean async, IPAddress& address,
Socket& abortSocket, Socket& abortSocket6) 在 System.Net.PooledStream.Activate(Object owningObject,
Boolean async, GeneralAsyncDelegate asyncCallback) 在 System.Net.ConnectionPool.GetConnection(Object owningObject,
GeneralAsyncDelegate asyncCallback, Int32 creationTimeout) 在 System.Net.Mail.SmtpConnection.GetConnection(ServicePoint servicePoint) 在 System.Net.Mail.SmtpClient.GetConnection() 在 System.Net.Mail.SmtpClient.Send(MailMessage message) --- 内部异常堆栈跟踪的结尾 --- 在 System.Net.Mail.SmtpClient.Send(MailMessage message) 在 AutoMail.SendMail(String key, String title,
String body, String address, Boolean isCC)
这下头大了,原来的服务器可以使用,为什么换了阿里云的就不行了?一直以为是代码的问题,反复研究代码几个小时,都没有找到解决方案。
或许是网络的问题?阿里云明确表明,安全组出方向默认允许所有访问,即从安全组内ECS访问外部都是放行的,也不需要开放本机的25端口啊,我开了也没用,难道是smtp服务器拒绝了本机?
命令行输入
telnet 42.120.219.29 25
竟然发现连不上?这下问题有点茅塞顿开了,原来是阿里云是为了防止垃圾邮件,屏蔽了25端口。那么就要换ssl的465端口了,telnet465端口,是通的,那么代码里加上ssl的设置,全部代码我就不贴了,网上一大堆。
client.Port = 465;
client.UseDefaultCredentials = false;
client.EnableSsl = true;
结果,还是报错,错误变成以下的了。
System.Net.Mail.SmtpException: 发送邮件失败。
---> System.IO.IOException: 无法从传输连接中读取数据: net_io_connectionclosed。 在 System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer,
Int32 offset, Int32 read, Boolean readLine) 在 System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller,
Boolean oneLine) 在 System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller) 在 System.Net.Mail.SmtpConnection.GetConnection(ServicePoint servicePoint) 在 System.Net.Mail.SmtpClient.GetConnection() 在 System.Net.Mail.SmtpClient.Send(MailMessage message) --- 内部异常堆栈跟踪的结尾 --- 在 System.Net.Mail.SmtpClient.Send(MailMessage message) 在 AutoMail.SendMail(String key, String title, String body,
String address, Boolean isCC)
这下真的懵圈了,又搜了一大堆方法,还是无解,最后我无意间,把端口改成了80,竟然可以发送了,真是太神奇了,困扰了一天一夜的问题总算解决。
以上踩坑记,遇到的兄弟们,可以使用此方法解决,避免再走弯路。