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配置如图所示:
尝试发送邮件时出现异常:
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>
额外检查项
- Gmail账号权限:如果开启了两步验证,必须使用应用专用密码代替普通密码;未开启两步验证的话,需要在Gmail设置中允许「低安全性应用访问」(注意此选项有安全风险,建议优先用应用密码)。
- 端口与加密方式对应:除了465+SSL,也可以用587端口+TLS(
EnableSsl仍设为true),两种配置都能正常连接Gmail服务器。 - 防火墙/代理限制:检查服务器或本地防火墙是否拦截了465/587端口的出站流量,必要时联系运维开放端口。
内容的提问来源于stack exchange,提问作者Ibrahim Shaikh
相关产品推荐
相关产品推荐

