阿里云ECS服务器发送邮件25端口被拒踩坑记录

 0 0条评论

网站迁移到了阿里云服务器,有一个系统服务是登录阿里的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,竟然可以发送了,真是太神奇了,困扰了一天一夜的问题总算解决。

以上踩坑记,遇到的兄弟们,可以使用此方法解决,避免再走弯路。

本文作者:双黑

版权声明:本站文章欢迎链接分享,禁止全文转载!

游客