Encoutering IOException:无法从传输连接读取数据:连接已关闭。尝试发送邮件消息时

Encoutering IOException: Unable to read data from the transport connection: The connection was closed. when trying to send mailmessage

提问人:March 提问时间:9/16/2023 最后编辑:March 更新时间:9/18/2023 访问量:59

问:

我在 .Net 7 的 Asp.Net 核心上有一个 Web 应用程序,我需要从它发送电子邮件

这是我需要发送电子邮件的两个代码段

public bool SendMail(string name, string email, string subject, string body)
        {
            ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
            System.Net.ServicePointManager.SecurityProtocol = System.Net.ServicePointManager.SecurityProtocol | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
            MailMessage message = new MailMessage();
            SmtpClient smtpClient = new SmtpClient();
            message.From = new MailAddress("[email protected]");
            message.To.Add("[email protected]");
            message.Subject = "Contact from customer: "+name;
            message.IsBodyHtml = true;
            message.Body = "<p>" + "Name: " + name + "</p>" + "<p>" + "Email: " + email + "</p>" + "<p>" + "subject: " + subject + "</p>" + "<p>" + "message: " + body + "</p>";
            smtpClient.Port = 465;
            smtpClient.Host = "mydomain.com";
            smtpClient.EnableSsl = true;
            smtpClient.UseDefaultCredentials = false;
            smtpClient.Credentials = new NetworkCredential("[email protected]", "password");
            smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
            smtpClient.Send(message);
            return true;
        }

public bool SendMail(string car, string name, string email, string phone, string service_type, string pickup_date, string pickup_hour, string pickup_minute, string pickup_AM_PM, string pickup_location, string pickup_destination)
        {
            
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
                MailMessage message = new MailMessage();
                SmtpClient smtpClient = new SmtpClient();
                message.From = new MailAddress("[email protected]");
                message.To.Add("[email protected]");
                message.Subject = "Request to book: " + car + " from: " + name;
                message.IsBodyHtml = true;
                message.Body = "<p>" + "Send Date: " + DateTime.Now + "</p>" + "<p>" + "Name: " + name + "</p>" + "<p>" + "Email: " + email + "</p>" + "<p>" + "phone: " + phone + "</p>" + "<p>" + "Servie required: " + service_type + "</p>" + "<p>" + "Pickup date: " + pickup_date + "</p>" + "<p>" + "Pickup time: " + pickup_hour + ":" + pickup_minute + " " + pickup_AM_PM + "</p>" + "<p>" + "Pickup location: " + pickup_location + "</p>" + "<p>" + "Destination: " + pickup_destination + "</p>";
                smtpClient.Port = 465;
                smtpClient.Host = "mydomain.com";
                smtpClient.EnableSsl = true;
                smtpClient.UseDefaultCredentials = false;
                smtpClient.Credentials = new NetworkCredential("[email protected]", "password");
                smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
                smtpClient.Send(message);
                return true;

这是我所拥有的

  • 所有服务器信息和凭据都正确无误
  • 该代码在我的机器和生产环境中都不起作用
  • 它也不适用于任何电子邮件提供商(当我第一次构建它时,它与 Outlook 完美配合,现在它也不行)
  • 当我尝试通过外部测试工具(https://www.gmass.co/smtp-test)发送测试电子邮件时,它可以使用相同的设置和凭据

我搜索了关于这个问题的几乎所有问题,但没有一个解决方案有效(很多答案都说使用端口 587,但是,主机指定使用 465,当我尝试使用 587 时,它甚至在测试站点上也不起作用

编辑:我的应用程序托管在带有plesk的服务器间,以防万一

编辑 2:我已经解决了这个问题,原来这是一个宇宙巧合,生产环境和我的机器有两个独立的问题,对于机器来说,是防火墙阻止了我的尝试,至于主机,这是一个简单的凭据问题。

C# ASP.Net-Core 电子邮件 SMTP

评论

0赞 zgc7009 9/16/2023
465 是旧端口。奇怪的是,他们会告诉你明确使用它。无论如何,这似乎是一个TLS问题。您是否正在查看一个示例来尝试使其工作?如果是这样,是哪一个?
0赞 March 9/16/2023
在这一点上,我的代码只是来自 stackoverflow 上各种解决方案的代码片段的混合体,以尝试使其工作原始代码取自一个示例,并且运行良好,这就是为什么我如此困惑,除了 smtp 配置和信条之外,我没有更改任何关于代码的内容,它停止工作,即使我恢复这些,它也无法正常工作
0赞 Brando Zhang 9/18/2023
根据错误消息,执行tls握手时似乎出现了一些问题。这实际上是一个网络问题。我建议您应该检查客户端和 SMTP 支持 tls 版本和 chipper 或其他一些与 tls 相关的设置,以确保握手可以正常工作。

答: 暂无答案