Anders
Anders

Reputation: 12570

SendGrid Tutorial resulting in Bad Request

I apologize if this is a dupe question, but I have not found any solid information about this issue either on this site or on others.

With that being said, I am working on an MVC 5 web application. I am following this tutorial over on ASP.net.

public async Task SendAsync(IdentityMessage message)
{
    await configSendGridasync(message);
}

private async Task configSendGridasync(IdentityMessage message)
{
    var myMessage = new SendGridMessage();
    myMessage.AddTo(message.Destination);
    myMessage.From = new System.Net.Mail.MailAddress(
                        "[email protected]", "Your Contractor Connection");
    myMessage.Subject = message.Subject;
    myMessage.Text = message.Body;
    myMessage.Html = message.Body;

    var credentials = new NetworkCredential(
         Properties.Resources.SendGridUser,
         Properties.Resources.SendGridPassword,
         Properties.Resources.SendGridURL // necessary?
         );

    // Create a Web transport for sending email.
    var transportWeb = new Web(credentials);

    // Send the email.
    if (transportWeb != null)
    {
        await transportWeb.DeliverAsync(myMessage);
    }
    else
    {
        Trace.TraceError("Failed to create Web transport.");
        await Task.FromResult(0);
    }
}

Each time it gets to the await transportWeb.SendAsync(myMessage) line in the above method, this error shows up in the browser:


Server Error in '/' Application.

Bad Request

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Exception: Bad Request

Line 54:             if (transportWeb != null)
Line 55:             {
Line 56:                 await transportWeb.DeliverAsync(myMessage);
Line 57:             }
Line 58:             else
Line 59:             {
Line 60:                 Trace.TraceError("Failed to create Web transport.");
Line 61:                 await Task.FromResult(0);
Line 62:             }

I signed up for a free account over at https://sendgrid.com/, using the "Free Package Google", giving me 25,000 monthly credits. The account has been provisioned.

I have tried a bunch of things so far including: disabling SSL, putting username/password directly in the code instead of pulling them from the Resources.resx file, specifying the SMTP server inside the NetworkCredential object, and also tried changing DeliverAsync(...) to Deliver().

I tried explicitly setting the subject instead of using message.Subject, as this post suggested. I also tried HttpUtility.UrlEncode on the callbackUrl generated in the Account/Register method as suggested here. Same results, unfortunately.

Does anyone happen to have some insight as to what might be causing this to not function correctly?

Upvotes: 10

Views: 16446

Answers (9)

danicode
danicode

Reputation: 887

I had the same problem and the problem was that I had the same email on TO and BCC field. Hope it helps others..

Upvotes: 0

Devanathan.S
Devanathan.S

Reputation: 1472

I also faced this issue. solved by adding textcontent and htmlcontent. Before i was sending empty string.now its working code below

var client = new SendGridClient(_apiKey);
            var from = new EmailAddress(_fromEmailAddress, _fromName);
            var to = new EmailAddress("[email protected]", "dev");
            var textcontent = "This is to test the mail functionality";
            var htmlcontent = "<div>Devanathan Testing mail</div>";
            var subject = "testing by sending mail";
            var msg = MailHelper.CreateSingleEmail(from, to, subject, textcontent, htmlcontent);
            var response = await client.SendEmailAsync(msg);

Upvotes: 2

Rausta
Rausta

Reputation: 51

I had created an SendGrid account via Azure, I fixed this by setting these values in my Web.Config file:

<add key="mailAccount" value="azure_************@azure.com" />
<add key="mailPassword" value="[My Azure Password]" />

to my azure username and password. the username I found from the Azure Dashboard, I navigated to SendGrid Accounts >> [Clicked the Resource I had Created] >> Configurations. The password was the same one I set up the Azure account with.

Upvotes: 2

Ahmed Bahtity
Ahmed Bahtity

Reputation: 571

The company domain you have registered in SendGrid should be used to call the MailAddress API. Thus, if your company web site you are registering in SendGrid is www.###.com you should use:

var from = MailAddress("info@###.com", "Your Contractor Connection") 

Upvotes: -1

mjallhvit
mjallhvit

Reputation: 11

I got the same error. All I had to do was to copy the appsettings in webconfig(see below) and paste it into the OTHER webconfig file (there are 2 of them in asp.net project).

<add key="webpages:Version" value="3.0.0.0" />
<add key="mailAccount" value="xxUsernamexx" />
<add key="mailPassword" value="Password" />

Upvotes: 1

Paceman
Paceman

Reputation: 2165

I had the same problem, happened to have misspelled the name of the config value for the mailAccount (put mainAccount instead of the mailAccount).

        NetworkCredential credential = new NetworkCredential(ConfigurationManager.AppSettings["mailAccount"], ConfigurationManager.AppSettings["mailPassword"]);
        Web transportWeb = new Web(credential);

The config value was coming back as null but the exception wasnt raised and the empty username was assigned instead. Basically, put the breakpoint on the line "Web transportWeb = new Web(credential);" and see what username/password you are actually passing in credential, and see also the nevada_scout's answer.

Upvotes: -1

nevada_scout
nevada_scout

Reputation: 983

Check that you are using the correct "username" as the "mailAccount" setting.

This should be your sendgrid username, NOT the email address of the account you are trying to send from.

Upvotes: 2

Anders
Anders

Reputation: 12570

I ended up using the built-in SmtpClient to get this working. Here is the code that I am using:

private async Task configSendGridasync(IdentityMessage message)
{
    var smtp = new SmtpClient(Properties.Resources.SendGridURL,587);

    var creds = new NetworkCredential(Properties.Resources.SendGridUser, Properties.Resources.SendGridPassword);

    smtp.UseDefaultCredentials = false;
    smtp.Credentials = creds;
    smtp.EnableSsl = false;

    var to = new MailAddress(message.Destination);
    var from = new MailAddress("[email protected]", "Your Contractor Connection");

    var msg = new MailMessage();

    msg.To.Add(to);
    msg.From = from;
    msg.IsBodyHtml = true;
    msg.Subject = message.Subject;
    msg.Body = message.Body;

    await smtp.SendMailAsync(msg);
}

Even though it doesn't use SendGrid's C# API, the messages still show up on my SendGrid dashboard.

Upvotes: 7

FrankO
FrankO

Reputation: 2562

It might be a problem with your credentials.

If you signed up with SendGrid through Windows Azure, then you need to do the following:

  1. Log in to your Azure Portal
  2. Navigate to the Marketplace
  3. Locate and click on the SendGrid application
  4. Down at the bottom, click on Connection Info
  5. Use the Username and Password listed.

I was initially under the impression that I was to use my Azure account password until I found this. Hope this corrects your problem like it did for me.

Upvotes: 6

Related Questions