我最近因为最近将项目升级到.net 4.5.2而发送了一封通过SendGrid发送电子邮件的例外
发送邮件失败。 System.IO.IOException:无法从中读取数据 传输连接:net_io_connectionclosed。在 System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte []缓冲区, Int32 offset,Int32 read,Boolean readLine)at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller,Boolean oneLine)at 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(MailAddress sender, MailAddressCollection收件人,String deliveryNotify,布尔值 allowUnicode,SmtpFailedRecipientException&例外) System.Net.Mail.SmtpClient.Send(MailMessage消息)at System.Net.Mail.SmtpClient.Send(MailMessage消息)at SendGridMail.Transport.SMTP.SmtpWrapper.Send(MailMessage mime)at at SendGridMail.Transport.SMTP.Deliver(ISendGrid消息)at ReACT.Classes.Business.Helpers.Email.Send(String [] to,String [] toNames,Boolean ccToSender,String [] ccTo,String [] ccToNames,String subject,String body,Boolean isHtml,String SMTPServer,String EmailUserName,String EmailPassword,String EmailPort,String SystemEmailAddress,String SystemEmailName,String& FriendlyException, 字符串和放大器; TechnicalException)
用于使用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
答案 0 :(得分:11)
对于那些在通过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块中捕获的异常!
答案 1 :(得分:5)
我有同样的问题。我的用户名错误。我以为这是我为此创建的ApiKey,甚至尝试了带域和不带域的电子邮件。解决方案是 SMTP用户名是“ apikey” ,就像该字符串一样,而不是您的apikey,内部标识符或您提供的“友好”名称。恰好是“ apikey”的6个字母。
答案 2 :(得分:1)
对我们来说 - 这个非描述性错误是由于达到了我们的 sendgrid 电子邮件 API 订阅的发送限制。我建议您先检查您的 sendgrid 帐户,然后再处理网站设置。
答案 3 :(得分:0)
我注意到服务正在发送大量消息并使用azure free account plain中可用的所有25.000 /月消息。 为了解决这个问题,我创建了一个新帐户并修复了服务以发送较少数量的邮件。
答案 4 :(得分:0)
我遇到了同样的错误,但这是因为我在NetworkCredential
中包含了一个域参数答案 5 :(得分:0)
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
答案 6 :(得分:0)
我遇到了同样的问题,但这与在将我的 SMTP 和 API V3 代码升级到基于密钥的身份验证之前在我的 sendgrid 帐户中启用 2FA 有关。
如果您在执行其他操作之前启用 2FA,则会破坏身份验证。
答案 7 :(得分:0)
在我们的例子中,这是一个网络问题。我们必须启用公司的防火墙,以允许从我们的服务到 SendGrid/Twilio 的 Web 套接字连接,因为我们必须切换到的新 C# 客户端 (SendGridClient) 使用套接字。之前我们使用了使用 SMTP/HTTP 的 C# 通用 MailClient。