.NET 7 Asp.Net Core发送邮件遇IOException连接关闭问题排查
.NET 7 Asp.Net Core 邮件发送异常排查与解决
问题概述
基于.NET 7的Asp.Net Core Web应用实现邮件发送功能时,调用代码出现以下错误:
Encoutering IOException: Unable to read data from the transport connection: The connection was closed.
发送邮件代码
第一段代码
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("sender@example.com"); message.To.Add("recipient@example.com"); 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("xxxx@example.com", "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("sender@example.com"); message.To.Add("recipient@example.com"); 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("xxxx@example.com", "password"); smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; smtpClient.Send(message); return true; }
排查细节
- 确认服务器信息和凭据无误;
- 本地机器及InterServer Plesk生产环境部署后均无法运行;
- 更换多种邮件服务商无效(最初Outlook可用,现已失效);
- 用相同设置和凭据通过外部SMTP测试工具可成功发送邮件;
- 尝试过主流解决方案(如改用587端口),但主机要求必须用465,且测试工具用587也失败,故方案无效。
最终解决
本地机器问题为防火墙拦截邮件发送请求,生产环境问题为凭据存在错误,目前均已修复。
内容的提问来源于stack exchange,提问作者March
相关产品推荐
相关产品推荐

