SendGrid throwing InvalidApiRequestException in sending email

这一生的挚爱 提交于 2019-12-23 03:08:14

问题


SendGrid is throwing an InvalidApiRequestException when sending an email.

I am using this code:

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);
    }
}

Stack Trace is:

InvalidApiRequestException: Bad Request Check `Errors` for a list of errors returned by the API.
SendGrid.ErrorChecker.CheckForErrors(HttpResponseMessage response, Stream stream)
SendGrid.ErrorChecker.<CheckForErrorsAsync>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.<DeliverAsync>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.<Register>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.<CastToObject>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.<InvokeActionAsync>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.<InvokeActionFilterAsync>d__53.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
Microsoft.AspNet.Mvc.Controllers.FilterActionInvoker.<InvokeAsync>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.<RouteAsync>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.<RouteAsync>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.<RouteAsync>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.<Invoke>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.<Invoke>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.<Invoke>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.<Invoke>d__6.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
Microsoft.AspNet.Diagnostics.Entity.DatabaseErrorPageMiddleware.<Invoke>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.<Invoke>d__7.MoveNext()

回答1:


Make sure you are using SendGrid C# Library version 6.3.x or later. There was a bug in the previous library version.




回答2:


For your credentials, are you using your Sendgrid username and password? Or your API key? From your variable names it appears you are passing your API key. Try passing your password instead:

Options.SendGridUser Options.SendGridPassword




回答3:


I was facing same issue. In my case root cause was some German characters in email address. To log exact error try adding below try/catch block.

            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
                    }
                } 
            }



回答4:


Easy to consume the sendgrid API without any packages (Except newtonsoft json). In my sample, I use templates; You can use content with outcommenting the content field

1) Create your Classes

public class MailObject
    {
        public ICollection<MailPersonalizations> personalizations { get; set; }
        public Email from { get; set; }
        public string template_id { get; set; }
        //public ICollection<MailContent> content { get; set; }
    }

public class MailPersonalizations
    {
        public ICollection<Email> to { get; set; }
        public string subject { get; set; }
        public Dictionary<string, string> 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) Create your MailObject and send it with 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<MailPersonalizations>(),
                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<Email>();
            personalization.to.Add(new Email { email = email});
            personalization.subject = subject;
            //Substitutions
            personalization.substitutions = new Dictionary<string, string>();
            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
        }


来源:https://stackoverflow.com/questions/34842671/sendgrid-throwing-invalidapirequestexception-in-sending-email

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!