SendGrid在发送电子邮件时抛出InvalidApiRequestException

SendGrid在发送电子邮件时抛出InvalidApiRequestException

我正在使用此代码:

 public Task SendEmailAsync(string email, string subject, string message) { // Plug in your email service here to send an email. var myMessage = new SendGrid.SendGridMessage(); myMessage.AddTo(email); myMessage.From = new MailAddress("varshney@shobhit.com", "Shobhit", System.Text.Encoding.Default); myMessage.Subject = subject; myMessage.Text = message; myMessage.Html = message; var credentials = new NetworkCredential( Options.SendGridUser, Options.SendGridKey); // Create a Web transport for sending email. var transportWeb = new SendGrid.Web(credentials); // Send the email. if (transportWeb != null) { return transportWeb.DeliverAsync(myMessage); } else { return Task.FromResult(0); } } 

堆栈跟踪是:

 InvalidApiRequestException: Bad Request Check `Errors` for a list of errors returned by the API. SendGrid.ErrorChecker.CheckForErrors(HttpResponseMessage response, Stream stream) SendGrid.ErrorChecker.d__1.MoveNext() --- End of stack trace from previous location where exception was thrown --- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) System.Runtime.CompilerServices.TaskAwaiter.GetResult() SendGrid.Web.d__7.MoveNext() --- End of stack trace from previous location where exception was thrown --- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) System.Runtime.CompilerServices.TaskAwaiter.GetResult() MessageBoard.Controllers.AccountController.d__9.MoveNext() in AccountController.cs await _emailSender.SendEmailAsync(model.Email, "Confirm your account", --- End of stack trace from previous location where exception was thrown --- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() Microsoft.AspNet.Mvc.Controllers.ControllerActionExecutor.d__8`1.MoveNext() --- End of stack trace from previous location where exception was thrown --- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() Microsoft.AspNet.Mvc.Controllers.ControllerActionInvoker.d__6.MoveNext() --- End of stack trace from previous location where exception was thrown --- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() Microsoft.AspNet.Mvc.Controllers.FilterActionInvoker.d__53.MoveNext() --- End of stack trace from previous location where exception was thrown --- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() Microsoft.AspNet.Mvc.Controllers.FilterActionInvoker.d__44.MoveNext() --- End of stack trace from previous location where exception was thrown --- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) System.Runtime.CompilerServices.TaskAwaiter.GetResult() Microsoft.AspNet.Mvc.Infrastructure.MvcRouteHandler.d__6.MoveNext() --- End of stack trace from previous location where exception was thrown --- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) System.Runtime.CompilerServices.TaskAwaiter.GetResult() Microsoft.AspNet.Routing.Template.TemplateRoute.d__27.MoveNext() --- End of stack trace from previous location where exception was thrown --- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) System.Runtime.CompilerServices.TaskAwaiter.GetResult() Microsoft.AspNet.Routing.RouteCollection.d__9.MoveNext() --- End of stack trace from previous location where exception was thrown --- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) System.Runtime.CompilerServices.TaskAwaiter.GetResult() Microsoft.AspNet.Builder.RouterMiddleware.d__4.MoveNext() --- End of stack trace from previous location where exception was thrown --- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) System.Runtime.CompilerServices.TaskAwaiter.GetResult() Microsoft.AspNet.IISPlatformHandler.IISPlatformHandlerMiddleware.d__8.MoveNext() --- End of stack trace from previous location where exception was thrown --- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) System.Runtime.CompilerServices.TaskAwaiter.GetResult() Microsoft.AspNet.Diagnostics.Entity.MigrationsEndPointMiddleware.d__5.MoveNext() --- End of stack trace from previous location where exception was thrown --- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) System.Runtime.CompilerServices.TaskAwaiter.GetResult() Microsoft.AspNet.Diagnostics.Entity.DatabaseErrorPageMiddleware.d__6.MoveNext() --- End of stack trace from previous location where exception was thrown --- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() Microsoft.AspNet.Diagnostics.Entity.DatabaseErrorPageMiddleware.d__6.MoveNext() --- End of stack trace from previous location where exception was thrown --- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) System.Runtime.CompilerServices.TaskAwaiter.GetResult() Microsoft.AspNet.Diagnostics.DeveloperExceptionPageMiddleware.d__7.MoveNext() 

确保您使用的是SendGrid C#Library版本6.3.x或更高版本。 以前的库版本中存在错误。

对于您的凭据,您使用的是Sendgrid用户名和密码吗? 或者你的API密钥? 从您的变量名称看来,您正在传递API密钥。 请尝试传递密码:

Options.SendGridUser Options.SendGridPassword

我面临同样的问题。 在我的情况下,根本原因是电子邮件地址中的一些德语字符 要记录确切的错误,请尝试在try / catch块下面添加。

  try { // Create a Web transport for sending email. var transportWeb = new SendGrid.Web(credentials); // Send the email. if (transportWeb != null) { return transportWeb.DeliverAsync(myMessage); } } catch (InvalidApiRequestException exception) { if (exception.Errors != null) { foreach (var error in exception.Errors) { // Log error } } } 

在没有任何软件包的情况下轻松使用sendgrid API(除了newtonsoft json)。 在我的示例中,我使用模板; 您可以使用取消注释内容字段的内容

1)创建您的类

 public class MailObject { public ICollection personalizations { get; set; } public Email from { get; set; } public string template_id { get; set; } //public ICollection content { get; set; } } public class MailPersonalizations { public ICollection to { get; set; } public string subject { get; set; } public Dictionary substitutions { get; set; } } public class MailContent { public string type { get; set; } public string value { get; set; } } public class Email { public string email { get; set; } public string name { get; set; } } 

2)创建MailObject并使用HttpClient发送它

 public async Task SendEmailAsync(string email, string subject, string message, string url = "", string buttonText = "") { //Create a mail object var mailObject = new MailObject { personalizations = new List(), from = new Email { email = "no-reply@passion4it.be", name = "No-Reply Passion4IT" }, template_id = "cc84680c-a569-428b-ab26-9618584bc9ae" }; //create the mail personalization var personalization = new MailPersonalizations(); personalization.to = new List(); personalization.to.Add(new Email { email = email}); personalization.subject = subject; //Substitutions personalization.substitutions = new Dictionary(); personalization.substitutions.Add("-url-", url); personalization.substitutions.Add("-title-", subject); personalization.substitutions.Add("-custtext-", message); personalization.substitutions.Add("-buttonText-", buttonText); mailObject.personalizations.Add(personalization); //Adding to the mail object //SEND EMAIL USING SENDGRID API using(var client = new HttpClient()) { var jsonMail = JsonConvert.SerializeObject(mailObject);//convert object client.DefaultRequestHeaders.Accept.Clear(); //Clear headers client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); //Add Accept type client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "YOUR API KEY"); //Add Authorization var response = await client.PostAsync("https://api.sendgrid.com/v3/mail/send", new StringContent(jsonMail, Encoding.UTF8, "application/json")); //Send the mail } return; //Closed }