You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

发送邮件时抛出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,需确认:

    • 未开启两步验证时,是否启用了“不太安全的应用访问”(该方式已逐步淘汰)
    • 开启两步验证时,是否使用了专用应用密码而非原账户密码
      错误凭据会被服务器直接拒绝并关闭连接。
  • 文件路径转义错误
    原路径拼接未正确转义,可能导致文件读取失败,间接引发连接异常。建议用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:30:50