发送邮件时抛出IOException:连接已关闭无法读取传输数据的原因
发送邮件时遇IOException连接关闭错误的原因分析
问题详情
发送邮件时抛出错误:
IOException: Unable to read data from the transport connection: The connection was closed.
实现代码
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12; using var mailMessage = new MailMessage(); mailMessage.To.Add(new MailAddress("hr@menacom-amman.com")); mailMessage.From = new MailAddress("mohammad.jouhari@gmail.com"); mailMessage.Subject = "Test"; mailMessage.IsBodyHtml = true; string pdfFilePath = "C:\\Users\\m_243\\OneDrive\\Desktop\\microsoft documentation\\.net core\\SendEmailTest" + "\\SendEmailTest\\wwwroot\\MohammadJouhariCV.pdf"; byte[] bytes = System.IO.File.ReadAllBytes(pdfFilePath); using var attachment = new Attachment(new MemoryStream(bytes), "MohammadJouhariCV."); mailMessage.Attachments.Add(attachment); NetworkCredential loginInfo = new NetworkCredential("mohammad.jouhari@gmail.com", "password"); _smtpClient.EnableSsl= true; _smtpClient.UseDefaultCredentials = false; _smtpClient.Credentials = loginInfo; _smtpClient.Send(mailMessage);
配置代码
builder.Services.Configure<SmtpOptions>(builder.Configuration.GetSection("Smtp")); // SmtpClient is not thread-safe, hence transient builder.Services.AddTransient(provider => { var smtpOptions = provider.GetService<IOptions<SmtpOptions>>().Value; return new SmtpClient(smtpOptions.Host, smtpOptions.Port) { // Credentials and EnableSsl here when required }; });
SmtpOptions类定义
public class SmtpOptions { public string Host { get; set; } public int Port { get; set; } public string Username { get; set; } public string Password { get; set; } }
可能的原因及修正方案
SMTP客户端配置脱节
DI注册SmtpClient时未设置核心参数(EnableSsl、Credentials),后续手动设置可能导致参数生效时机错误,被服务器断开连接。应直接通过SmtpOptions在DI注册时完成配置:builder.Services.AddTransient(provider => { var smtpOptions = provider.GetService<IOptions<SmtpOptions>>().Value; return new SmtpClient(smtpOptions.Host, smtpOptions.Port) { EnableSsl = true, UseDefaultCredentials = false, Credentials = new NetworkCredential(smtpOptions.Username, smtpOptions.Password) }; });附件文件名格式非法
创建Attachment时文件名"MohammadJouhariCV."缺少扩展名,部分SMTP服务器会拦截格式异常的附件,导致连接关闭。修正为:using var attachment = new Attachment(new MemoryStream(bytes), "MohammadJouhariCV.pdf");SMTP端口与SSL配置不匹配
若使用Gmail等公共SMTP服务,需确认端口与SSL规则对应:- Gmail:smtp.gmail.com + 465(SSL)或587(STARTTLS)
若用587端口,需确保EnableSsl=true,部分场景需额外设置DeliveryMethod = SmtpDeliveryMethod.Network。
- Gmail:smtp.gmail.com + 465(SSL)或587(STARTTLS)
凭据无效或权限不足
若使用Gmail,需确认:- 未开启两步验证时,是否启用了“不太安全的应用访问”(该方式已逐步淘汰)
- 开启两步验证时,是否使用了专用应用密码而非原账户密码
错误凭据会被服务器直接拒绝并关闭连接。
文件路径转义错误
原路径拼接未正确转义,可能导致文件读取失败,间接引发连接异常。建议用Path.Combine拼接路径:string pdfFilePath = Path.Combine( @"C:\Users\m_243\OneDrive\Desktop\microsoft documentation\.net core\SendEmailTest", "SendEmailTest", "wwwroot", "MohammadJouhariCV.pdf");TLS版本不兼容
仅设置TLS1.2可能不被部分服务器支持,可添加多版本支持:System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12 | System.Net.SecurityProtocolType.Tls13;
内容的提问来源于stack exchange,提问作者user123456
相关产品推荐
相关产品推荐

