阿里云服务器发送邮件失败 默认禁用25端口

使用.NET C#写了一个Windows监控服务部署在阿里云上,在网站出现访问异常时自动发送提醒邮件。使用的是QQ邮箱,在本地调试时能正常发送邮件,但是部署到阿里云服务器后发送邮件失败了,日志里看到异常信息:

Worker running at: 05/20/2024 22:19:18 +08:00, message: System.Net.Mail.SmtpException: Failure sending mail.

 ---> System.Net.Sockets.SocketException (10060): 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 [::ffff:183.47.101.192]:25

   at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)

   at System.Net.Sockets.Socket.Connect(EndPoint remoteEP)

   at System.Net.Sockets.Socket.Connect(IPAddress[] addresses, Int32 port)

--- End of stack trace from previous location ---

   at System.Net.Sockets.Socket.Connect(IPAddress[] addresses, Int32 port)

   at System.Net.Sockets.Socket.Connect(String host, Int32 port)

   at System.Net.Sockets.TcpClient.Connect(String hostname, Int32 port)

   at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)

   at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)

   at System.Net.Mail.SmtpClient.Send(MailMessage message)

   --- End of inner exception stack trace ---

   at System.Net.Mail.SmtpClient.Send(MailMessage message)

   at Tools.EmailTools.Send(String to, String subject, String body) in D:\GitHub\MyTools\Tools\EmailTools.cs:line 23

   at MyTools.Service.Worker.ExecuteAsync(CancellationToken stoppingToken) in D:\GitHub\MyTools\MyTools.Service\Worker.cs:line 64

阿里云服务器发送邮件失败 默认禁用25端口

发送QQ邮件需要到QQ的账户设置中打开POP3/SMTP/IMAP功能,允许在其他地方收发邮件,否则无法通过代码发送QQ邮件。QQ邮件账户设置方法

C#实现发送QQ邮件的代码如下:

public static void Send(string to, string subject, string body)
{
    var message = new MailMessage();
    message.From = new MailAddress("xxxxxx@qq.com", "通知");
    message.To.Add(new MailAddress(to, string.Empty));
    message.Subject = subject;
    message.Body = body;
    using (var smtpClient = new SmtpClient("smtp.qq.com"))
    {
        smtpClient.Credentials = new NetworkCredential("xxxxxx@qq.com", "xxxxxx");
        smtpClient.EnableSsl = true;
        smtpClient.Send(message);
    }
}

网上查了一下原因,原来是阿里云为了防止滥发垃圾邮件,默认禁用了25端口。在云服务器的安全组>访问规则>出方向里允许25端口也是没有用的,安全组出方向默认允许所有访问,即从安全组内ECS访问外部都是放行的。

有一种说法是可以申请解封25端口,但是现在似乎已经不行了。可以参考阿里云的官方文档:TCP 25端口解封申请

比较好的解决方法是使用SSL加密端口465发送邮件,QQ邮箱的话是587端口

我们要修改发送邮件的代码,下面是修改后的发送方法代码:

public static void Send(string to, string subject, string body, bool enableSsl = false)
{
    var message = new MailMessage();
    message.From = new MailAddress("xxxxxx@qq.com", "通知");
    message.To.Add(new MailAddress(to, string.Empty));
    message.Subject = subject;
    message.Body = body;
    using (var smtpClient = new SmtpClient("smtp.qq.com"))
    {
        if (enableSsl)
        {
            smtpClient.Port = 587;
            smtpClient.EnableSsl = true;
        }
        smtpClient.Credentials = new NetworkCredential("xxxxxx@qq.com", "xxxxxx");
        smtpClient.EnableSsl = true;
        smtpClient.Send(message);
    }
}

这样就能正常发送QQ邮件了,如图所示:

阿里云服务器发送邮件失败 默认禁用25端口

评论