MVC Azure SendGrid - PullRequest
       7

MVC Azure SendGrid

0 голосов
/ 14 октября 2018

У меня есть метод действия контроллера, когда запускаются данные записи в методе ForgotPassword:

[ValidateAntiForgeryToken]
    public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = await UserManager.FindByNameAsync(model.Email);
            if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id)))
            {
                // Don't reveal that the user does not exist or is not confirmed
                return View("ForgotPasswordConfirmation");
            }

            string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
            var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
            await UserManager.SendEmailAsync(user.Id, "Reset Password", "Please reset your password by clicking <a href=\"" + callbackUrl + "\">here</a>");
            return RedirectToAction("ForgotPasswordConfirmation", "Account");
        }

        // If we got this far, something failed, redisplay form
        return View(model);

    }

файл web.config

    <appSettings>
      <add key="webpages:Version" value="3.0.0.0" />
      <add key="SendGridUsername" value="XXXXXXXXXXXXXXXXXXXXXX" />
      <add key="SendGridPassword" value="XXXXXXXXXXXXXX" />
      <add key="SendGridApiKey" value="XXXXXXXXXXXXXXXXXXXXXXXXXXXX" />
    </appSettings>

Мой файл IdentityConfig выглядит следующим образом:

 public class EmailService : IIdentityMessageService
{
    public async Task SendAsync(IdentityMessage message)
    {
        await configSendGridasync(message);
    }

    // Use NuGet to install SendGrid (Basic C# client lib) 
    private async Task configSendGridasync(IdentityMessage message)
    {
        var myMessage = new SendGridMessage();
        myMessage.AddTo(message.Destination);
        myMessage.From = new System.Net.Mail.MailAddress(
                            "Joe@contoso.com", "Joe S.");
        myMessage.Subject = message.Subject;
        myMessage.Text = message.Body;
        myMessage.Html = message.Body;

        var credentials = new NetworkCredential(
                   ConfigurationManager.AppSettings["SendGridUsername"],
                   ConfigurationManager.AppSettings["SendGridPassword"]
                   );

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

}

Однако письмо не отправлено, что я делаю неправильно и как я могу это исправить, следуя инструкциям из сообщения Рика Андерсона на MSDN.

1 Ответ

0 голосов
/ 14 октября 2018

Вы используете устаревшую версию sendgrid C # SDK, которая указывает на V2 API.Текущая версия API - V3.Документ, за которым вы следите, не обновляется.В настоящее время я занимаюсь обновлением документа.Вам нужно добавить нижеприведенное пространство имен в вашем сервисе -

using SendGrid;
using SendGrid.Helpers.Mail; //optional if you want to use the MailHelper class

, а затем использовать приведенный ниже код в вашем методе configSendGridasync -

private async Task configSendGridasync(IdentityMessage message)
    {
        var apiKey = Convert.ToString(ConfigurationManager.AppSettings["SendGridApiKey"]);
        var client = new SendGridClient(apiKey);
        var myMessage = new SendGridMessage();
        myMessage.AddTo(new EmailAddress(message.Destination));
        myMessage.SetFrom(new EmailAddress("Joe@contoso.com", "Joe S."));
        myMessage.SetSubject(message.Subject);
        myMessage.AddContent(MimeType.Text, message.Body);
        myMessage.AddContent(MimeType.Html, message.Body);
          try
           {
              var response = await client.SendEmailAsync(msg);
           }
           catch(Exception err)
           {

            Trace.TraceError("Failed to create Web transport: ."+err.message);
            await Task.FromResult(0);
          }  
    }

Вам необходимо установить пакет Sendgrid из nuget, используяприведенная ниже команда перед написанием кода -

Install-Package Sendgrid -Version 9.10.0 

Полный код подобен приведенному ниже -

using SendGrid;
using SendGrid.Helpers.Mail;

 public class EmailService : IIdentityMessageService
{
    public async Task SendAsync(IdentityMessage message)
    {
        await configSendGridasync(message);
    }

    // Use NuGet to install SendGrid (Basic C# client lib) 
    private async Task configSendGridasync(IdentityMessage message)
        {
            var apiKey = Convert.ToString(ConfigurationManager.AppSettings["SendGridApiKey"]);
            var client = new SendGridClient(apiKey);
            var myMessage = new SendGridMessage();
            myMessage.AddTo(new EmailAddress(message.Destination));
            myMessage.SetFrom(new EmailAddress("Joe@contoso.com", "Joe S."));
            myMessage.SetSubject(message.Subject);
            myMessage.AddContent(MimeType.Text, message.Body);
            myMessage.AddContent(MimeType.Html, message.Body);
              try
               {
                  var response = await client.SendEmailAsync(msg);
               }
               catch(Exception err)
               {

                Trace.TraceError("Failed to create Web transport: ."+err.message);
                await Task.FromResult(0);
              }  
        }

}

Вот ссылка на пример кода:

https://github.com/sendgrid/sendgrid-csharp/blob/master/USE_CASES.md

...