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

本文关键字:net io connectionclosed 数据 读取 传输 连接 SendGrid | 更新日期: 2023-09-27 18:22:35

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

发送邮件失败。System.IO.IOException:无法从中读取数据传输连接:netio_connectionclosed。在System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[]缓冲区,Int32偏移量、Int32读取、布尔读取行)System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader调用者,布尔oneLine)System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader调用者)在System.Net.Mail.CheckCommand.Send(SmtpConnection conn,字符串&响应)System.Net.MailCommand.Send(SmtpConnection连接,Byte[]命令,来自的MailAddress,布尔值allowUnicode)System.Net.Mail.SmtpTransport.SendMail(MailAddress sender,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,布尔ccToSender,String[]ccTo,String[]ccToNames,String主题,字符串主体,布尔值isHtml,字符串SMTPServer,字符串电子邮件用户名,字符串电子邮件密码,字符串电子邮件端口,字符串SystemEmailAddress,字符串SystemEmailName,字符串&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

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

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

对于那些在通过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块中捕获的异常!

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

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

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

对我们来说,这个非描述性错误是由于我们的sendgrid电子邮件api订阅达到了发送限制。我建议先检查一下你的sendgrid帐户,然后再修改网站设置。

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

我也有同样的错误,但这是因为我在NetworkCredential 中包含了一个域参数

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