SmtpException:无法从传输连接读取数据:net_io_connectionclosed

我正在使用SmtpClient库来发送电子邮件使用以下内容:

 SmtpClient client = new SmtpClient(); client.Host = "hostname"; client.Port = 465; client.DeliveryMethod = SmtpDeliveryMethod.Network; client.UseDefaultCredentials = false; client.EnableSsl = true; client.Credentials = new NetworkCredential("User", "Pass); client.Send("from@hostname", "to@hostname", "Subject", "Body"); 

代码在我的testing环境中工作正常,但是当我使用生产SMTP服务器时,代码失败,出现SmtpException “发送邮件失败”。 内部IOException “无法从传输连接读取数据:net_io_connectionclosed”。

我已经确认防火墙不是问题。 端口在客户端和服务器之间打开就好了。 我不知道还有什么可以抛出这个错误。

编辑:超级Redux版本

尝试端口587而不是465.端口465在技术上已被弃用。


经过一堆包嗅探,我发现了它。 首先,这里是简短的回答:

.NET SmtpClient 支持通过STARTTLSencryption。 如果设置了EnableSsl标志,则服务器必须用STARTTLS响应EHLO,否则会引发exception。 有关更多详细信息,请参阅MSDN文档。

其次,对于那些未来偶然发现这个问题的人来说,这是一个快速的SMTP历史课程:

当天,当服务想要提供encryption时,他们被分配了不同的端口号,并且在那个端口号上,他们立即启动了一个SSL连接。 随着时间的推移,他们意识到浪费一个服务的两个端口号是愚蠢的,他们devise了一种服务方式,允许在同一个端口上使用STARTTLS进行明文和encryption。 通信将使用明文开始,然后使用STARTTLS命令升级到encryption连接。 STARTTLS成为SMTPencryption的标准。 不幸的是,当一个新标准实施的时候,总会发生这样的情况,所有的客户端和服务器都是兼容的。

在我的情况下,我的用户试图将软件连接到强制即时SSL连接的服务器,这是Microsoft在.NET中不支持的传统方法。

改变端口从465到587,它会工作。

您可能还需要更改Gmail帐户中的“不太安全的应用程序”设置。 EnableSsl,使用端口587并启用“不太安全的应用程序”。 如果你谷歌不太安全的应用程序部分有谷歌帮助页面,将您链接到您的帐户页面的权利。 这是我的问题,但一切正在工作,感谢上面的所有答案。

您的SMTP库是否支持encryption连接? 邮件服务器可能希望安全的TLS连接,并因此在没有TLS握手的情况下closures连接

对于任何人在这个post中寻找解决scheme,你已经通过Azure设置SMTP sendgrid。

用户名不是您在azure中创buildsendgrid对象时设置的用户名。 find你的用户名

  • 点击您在azure的sendgrid对象,然后点击pipe理。 它会带你到SendGrid网站。
  • 确认你的电子邮件,然后复制在那里显示的用户名..这是一个自动生成的用户名。
  • 将SendGrid的用户名放入web.config文件的SMTP设置中。

希望这可以帮助!

如果您在同一个盒子上使用SMTP服务器,并且您的SMTP被绑定到IP地址而不是“任何分配”,则可能会失败,因为它尝试使用SMTP当前不工作的IP地址(如127.0.0.1)上。

如果上述所有的解决scheme都不适合你,那么尝试更新下面的文件到你的服务器(通过发布我的意思是,之前的构build将是有益的)。

 bin-> projectname.dll 

更新后你会看到这个错误。 正如我已经解决这个解决scheme。

试试这个:这是我用来发送电子邮件给多个用户的代码。

  public string gmail_send() { using (MailMessage mailMessage = new MailMessage(new MailAddress(toemail), new MailAddress(toemail))) { mailMessage.Body = body; mailMessage.Subject = subject; try { SmtpClient SmtpServer = new SmtpClient(); SmtpServer.Credentials = new System.Net.NetworkCredential(email, password); SmtpServer.Port = 587; SmtpServer.Host = "smtp.gmail.com"; SmtpServer.EnableSsl = true; mail = new MailMessage(); String[] addr = toemail.Split(','); // toemail is a string which contains many email address separated by comma mail.From = new MailAddress(email); Byte i; for (i = 0; i < addr.Length; i++) mail.To.Add(addr[i]); mail.Subject = subject; mail.Body = body; mail.IsBodyHtml = true; mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure; // mail.ReplyTo = new MailAddress(toemail); mail.ReplyToList.Add(toemail); SmtpServer.Send(mail); return "Mail Sent"; } catch (Exception ex) { string exp = ex.ToString(); return "Mail Not Sent ... and ther error is " + exp; } } }