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

Posted

技术标签:

【中文标题】SendGrid 无法从传输连接读取数据:net_io_connectionclosed【英文标题】:SendGrid Unable to read data from the transport connection: net_io_connectionclosed 【发布时间】:2016-02-21 21:23:13 【问题描述】:

自从最近将项目升级到 .net 4.5.2 后,我通过 SendGrid 发送电子邮件时遇到异常

发送邮件失败。 System.IO.IOException:无法从中读取数据 传输连接:net_io_connectionclosed。在 System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(字节 [] 缓冲区, Int32 偏移,Int32 读取,布尔读取线)在 System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader 调用者,布尔 oneLine)在 System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader 调用者)在 System.Net.Mail.CheckCommand.Send(SmtpConnection conn, 字符串和响应)在 System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] 命令, MailAddress from, Boolean allowUnicode) at System.Net.Mail.SmtpTransport.SendMail(邮件地址发件人, MailAddressCollection 收件人,字符串 deliveryNotify,布尔值 allowUnicode、SmtpFailedRecipientException& 异常)在 System.Net.Mail.SmtpClient.Send(MailMessage 消息)在 System.Net.Mail.SmtpClient.Send(MailMessage 消息)在 SendGridMail.Transport.SMTP.SmtpWrapper.Send(MailMessage mime) 在 SendGridMail.Transport.SMTP.Deliver(ISendGrid 消息)在 ReACT.Classes.Business.Helpers.Email.Send(String[] to, String[] toNames, Boolean ccToSender, String[] ccTo, String[] ccToNames, String 主题,字符串正文,布尔 ishtml,字符串 SMTPServer,字符串 EmailUserName,字符串 EmailPassword,字符串 EmailPort,字符串 SystemEmailAddress, String SystemEmailName, String& FriendlyException, 字符串&技术异常)

使用 SendGrid 服务通过 SMTP 发送电子邮件的代码如下 -

            SendGridMail.SendGrid vEmailMessage = SendGridMail.SendGrid.GetInstance(vMailMessage.From, vMailMessage.To.ToArray(), vMailMessage.CC.ToArray(), new MailAddress[0], vMailMessage.Subject, vMailMessage.Body, vMailMessage.Body);

            NetworkCredential vCredentials = new NetworkCredential(this.ApplicationSettings.EmailUserName, this.ApplicationSettings.EmailPassword);
            var vTransport = SMTP.GetInstance(vCredentials);

            //Send email message
            vTransport.Deliver(vEmailMessage);

凭据正确并确认工作正常。这个问题从 .net 框架升级后才开始出现,不幸的是,我们无法降级回目标 .net 4

【问题讨论】:

【参考方案1】:

对于那些在通过 SendGrid 发送电子邮件时遇到相同异常的人,事实证明,一项新功能正在将错误密码传递给 SendGrid API,从而导致AuthenticationFailedException: 535 Authentication failed: Bad username / password

我在下载Wireshark 后发现了这一点,查找并检查了 SendGrid 数据包以发现在某种情况下发送到 API 的数据不正确。然后,SendGrid API 返回了一个相当有用的 AuthenticationFailedException 异常,但是当这个异常在代码中的 try catch 块中被捕获时,实际的异常被屏蔽并以上述net_io_connectionclosed IOException 的形式出现。

我修复了我们新应用程序中的错误,问题就消失了。如果只有 SendGrid API 抛出的实际异常是 try catch 块中捕获的异常!

【讨论】:

你是如何解决这个问题的? 我发现问题是由不正确的密码引起的 - 存储的密码是正确的,但是从存储中检索它的逻辑有问题,一旦解决,并且传递了正确的密码,一切正常 有趣的是我们的问题是 sendgrid 本身,我们的凭据是正确的,我们可以使用它们进入 sendgrid,但是我们创建了一个快速的小 C# smtp 邮件程序,但它不起作用,我们创建了一个新的 sendgrid 帐户它对我们有用。 我们有一个错误,用完了我们所有的电子邮件配额!我在查看app.sendgrid.com 门户时发现了这个。 我遇到了这个问题,因为我盲目地按照 Sendgrid c# 教程使用 Environment.GetEnvironmentVariable 来检索 api 密钥,实际上我应该使用 ConfigurationManager.AppSettings 来从网络上检索它。我正在使用的配置文件。【参考方案2】:

我遇到了同样的问题。我输入了错误的用户名。我以为这是我为此创建的 ApiKey,我什至尝试了带域和不带域的电子邮件。解决方案是 SMTP 用户名是“apikey”,就像在那个确切的字符串中一样,不是您的 apikey,不是内部标识符,也不是您给它的“友好”名称。只是“apikey”的确切 6 个字母。

【讨论】:

在我的例子中,我使用的是旧的用户名/密码范式,它突然似乎不再受 SendGrid 的支持。更改为“apikey”作为用户名和密钥本身作为密码解决了这个问题。【参考方案3】:
const string username="apikey";
string pass = "xxxxxxxxxxxxxxxxxxxxx" // login sendgrid.com => create ApiKey
NetworkCredential vCredentials = new NetworkCredential("apikey", pass);

我已遵循本指南 链接:https://sendgrid.com/docs/API_Reference/SMTP_API/integrating_with_the_smtp_api.html

【讨论】:

【参考方案4】:

对我们来说 - 这个无法描述的错误是由于我们的 sendgrid 电子邮件 api 订阅达到了发送限制。我建议在搞乱网站设置之前先检查你的 sendgrid 帐户。

【讨论】:

【参考方案5】:

我确实注意到一项服务正在发送大量消息,并使用了 azure 免费帐户中所有可用的每月 25.000 条消息。 为了解决这个问题,我创建了一个新帐户并修复了该服务以发送更少的消息。

【讨论】:

【参考方案6】:

我遇到了同样的错误,但这是因为我在 NetworkCredential 中包含了域参数

【讨论】:

【参考方案7】:

我遇到了同样的问题,但这与在将我的 SMTP 和 API V3 代码升级到基于密钥的身份验证之前在我的 sendgrid 帐户中启用 2FA 有关。

如果您在执行其他操作之前启用 2FA,则会破坏身份验证。

【讨论】:

【参考方案8】:

在我们的例子中,这是一个网络问题。我们必须启用公司的防火墙以允许从我们的服务到 SendGrid/Twilio 的 Web 套接字连接,因为我们必须切换到的新 C# 客户端 (SendGridClient) 使用套接字。以前我们使用 C# 通用 MailClient,它使用 SMTP/HTTP。

【讨论】:

以上是关于SendGrid 无法从传输连接读取数据:net_io_connectionclosed的主要内容,如果未能解决你的问题,请参考以下文章

为啥我收到“无法从传输连接读取数据”

azure blob storage-无法从传输连接读取数据:现有连接被远程主机强行关闭

关于云服务器中发送邮件,出现无法从传输连接中读取数据:

如何从 VB.NET 中的 USB 端口获取数据

提交时出现 SMTP 邮件服务器 (sendgrid) 错误

无法使用 Spark 连接器从 GreenPlum 读取