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

C#中使用SMTP服务器发送邮件失败,求问题排查建议

发送邮件服务报错:net_io_connectionclosed

我开发了一个用于向指定用户发送邮件的服务,代码如下:

try
{
    var smtpHost = System.Configuration.ConfigurationManager.AppSettings["SMTP-HOST"].ToString();//smtp.gmail.com
    var fromEmail = System.Configuration.ConfigurationManager.AppSettings["SMTP-USER"].ToString();//My Id
    var toEmail = "ibrahim.shaikh@chromeinfosoft.com";
    var subject = "test";
    var body = "body";
    var smtpPort = System.Configuration.ConfigurationManager.AppSettings["SMTP-PORT"].ToString();//465
    var smtpPassword = System.Configuration.ConfigurationManager.AppSettings["SMTP-PASSWORD"].ToString();//my password

    MailMessage mail = new MailMessage();
    SmtpClient SmtpServer = new SmtpClient(smtpHost);
    using (SmtpClient smtp = new SmtpClient(smtpHost))
    {
        mail.From = new MailAddress(fromEmail);
        mail.To.Add(toEmail);
        mail.Subject = subject;
        mail.IsBodyHtml = true;
        mail.Body = body;
        SmtpServer.EnableSsl = false;
        SmtpServer.Port = Convert.ToInt32(smtpPort);
        SmtpServer.Credentials = new System.Net.NetworkCredential(fromEmail, smtpPassword);

        SmtpServer.Send(mail);
    }
}
catch (Exception ex)
{
    // Log the error
}

配置文件内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="SMTP-HOST" value="smtp.gmail.com"/>
        <add key="SMTP-PORT" value="465"/>
        <add key="SMTP-USER" value="ibrahim.shaikh@chromeinfosoft.com"/>
        <add key="SMTP-SSL" value="N"/>
        <add key="SMTP-PASSWORD" value ="Password"/>
    </appSettings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
</configuration>

我的Outlook配置如图所示:
Outlook邮箱配置

尝试发送邮件时出现异常:

exception: {"Failure sending mail."}

inner exception: {"Unable to read data from the transport connection: net_io_connectionclosed."} System.Exception {System.IO.IOException}

我已确认邮箱账号、密码及端口信息均正确,但仍出现该错误,请问我哪里操作有误?


问题分析与解决

核心问题1:SSL配置不匹配

Gmail的465端口是SSL专属端口,必须启用SSL加密才能建立连接,但你的代码里硬编码了SmtpServer.EnableSsl = false,配置文件里SMTP-SSL也设为N,这直接导致服务器拒绝连接并关闭会话。

核心问题2:SmtpClient实例管理混乱

代码里同时创建了SmtpServer和using块内的smtp两个实例,实际发送用的是未被using包裹的SmtpServer,既没有读取配置的SSL开关,也无法自动释放资源,逻辑冗余且易出问题。

修正后的代码

try
{
    var smtpHost = System.Configuration.ConfigurationManager.AppSettings["SMTP-HOST"].ToString();
    var fromEmail = System.Configuration.ConfigurationManager.AppSettings["SMTP-USER"].ToString();
    var toEmail = "ibrahim.shaikh@chromeinfosoft.com";
    var subject = "test";
    var body = "body";
    var smtpPort = int.Parse(System.Configuration.ConfigurationManager.AppSettings["SMTP-PORT"].ToString());
    var smtpPassword = System.Configuration.ConfigurationManager.AppSettings["SMTP-PASSWORD"].ToString();
    // 读取配置里的SSL开关,统一逻辑
    var enableSsl = System.Configuration.ConfigurationManager.AppSettings["SMTP-SSL"].ToString().Equals("Y", StringComparison.OrdinalIgnoreCase);

    // 用using包裹所有可释放资源,确保自动回收
    using (var mail = new MailMessage())
    using (var smtpServer = new SmtpClient(smtpHost))
    {
        mail.From = new MailAddress(fromEmail);
        mail.To.Add(toEmail);
        mail.Subject = subject;
        mail.IsBodyHtml = true;
        mail.Body = body;
        
        smtpServer.EnableSsl = enableSsl;
        smtpServer.Port = smtpPort;
        smtpServer.Credentials = new System.Net.NetworkCredential(fromEmail, smtpPassword);

        smtpServer.Send(mail);
    }
}
catch (Exception ex)
{
    // 建议记录完整异常信息,方便排查
    Console.WriteLine(ex.ToString());
}

配置文件调整

把SMTP-SSL改为Y,匹配465端口的SSL要求:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="SMTP-HOST" value="smtp.gmail.com"/>
        <add key="SMTP-PORT" value="465"/>
        <add key="SMTP-USER" value="ibrahim.shaikh@chromeinfosoft.com"/>
        <add key="SMTP-SSL" value="Y"/>
        <add key="SMTP-PASSWORD" value ="你的实际密码"/>
    </appSettings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
</configuration>

额外检查项

  1. Gmail账号权限:如果开启了两步验证,必须使用应用专用密码代替普通密码;未开启两步验证的话,需要在Gmail设置中允许「低安全性应用访问」(注意此选项有安全风险,建议优先用应用密码)。
  2. 端口与加密方式对应:除了465+SSL,也可以用587端口+TLS(EnableSsl仍设为true),两种配置都能正常连接Gmail服务器。
  3. 防火墙/代理限制:检查服务器或本地防火墙是否拦截了465/587端口的出站流量,必要时联系运维开放端口。

内容的提问来源于stack exchange,提问作者Ibrahim Shaikh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:50:29