c# - SmtpException : Unable to read data from the transport connection: net_io_connectionclosed 错误

标签 c# smtp

我正在使用 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");

该代码在我的测试环境中运行良好,但当我使用生产 SMTP 服务器时,该代码失败并显示 SmtpException“发送邮件失败”。带有内部 IOException“无法从传输连接读取数据:net_io_connectionclosed”。

我已经确认防火墙不是问题。该端口在客户端和服务器之间打开得很好。我不确定还有什么会引发此错误。

最佳答案

编辑: super Redux 版本

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


经过大量数据包嗅探后,我弄明白了。首先,这是简短的回答:

.NET SmtpClient 支持通过 STARTTLS 进行加密。如果设置了 EnableSsl 标志,服务器必须用 STARTTLS 响应 EHLO,否则会抛出异常。查看MSDN文档以获取更多详细信息。

其次,为将来偶然发现此问题的人提供快速的 SMTP 历史教训:

过去,当服务还想提供加密时,它们会被分配一个不同的端口号,并在该端口号上立即启动 SSL 连接。随着时间的推移,他们意识到为一个服务浪费两个端口号是愚蠢的,他们为服务设计了一种方法,允许使用 STARTTLS 在同一端口上进行明文和加密。通信将开始使用明文,然后使用 STARTTLS 命令升级到加密连接。 STARTTLS 成为 SMTP 加密的标准。不幸的是,当实现新标准时总是会发生这种情况,即与所有客户端和服务器的兼容性大杂烩。

在我的例子中,我的用户试图将软件连接到强制立即 SSL 连接的服务器,这是 Microsoft 在 .NET 中不支持的旧方法。

关于c# - SmtpException : Unable to read data from the transport connection: net_io_connectionclosed 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20228644/

相关文章:

c# - 在 C# 中的字符串列表中进行高性能 "contains"搜索

c# - 如何将搜索引擎添加到 GeckoFx 网络浏览器?

C# 优化 - 数组/值类型列表和堆栈(游戏)

php - 为 php mail() 函数设置 SMTP 详细信息

python - 使用来自带有 html 正文的 gmail 帐户的 SMTP python 的电子邮件

Magento - 如何启用 SMTP 服务器身份验证和安全传输?

c# - 使用 C# 查找 MX 记录?

c# - 授权具有多个角色的属性

c# - 如何禁用 DataGridView 中的排序?

email - 将 header 添加到将存在于回复中的传出 smtp 消息