【问题标题】:MVC Azure SendGridMVC Azure 发送网格
【发布时间】:2018-10-14 16:09:15
【问题描述】:

当触发将数据发布到 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);
        }
    }

}

但是没有发送电子邮件,我做错了什么以及如何解决这个问题,因为我已按照 Rick Andersons 在 msdn 上发布的说明进行操作。

【问题讨论】:

  • 你有什么错误吗?你能告诉我们堆栈跟踪吗
  • 没有错误,就好像发送了电子邮件,当我检查 sendGrid 网站仪表板发送的电子邮件为 0
  • 你能告诉我们你得到的回应吗?
  • 没有错误信息
  • 可能是 SendGrid 的配置问题。

标签: c# model-view-controller sendgrid


【解决方案1】:

您正在使用指向 V2 api 的过时版本的 sendgrid C# SDK。当前的 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);
          }  
    }

在编写代码之前,您需要使用以下命令从 nuget 安装 Sendgrid 包 -

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

【讨论】:

  • 我没有收到任何电子邮件。请确认我的 webconfig 中应该包含什么
  • @user2713535 你只需要 V3 api 的 API 密钥
  • @user2713535 还有EmailAddress 类不是来自System.Net.Mail 它来自Sendgrid
  • 这种情况下怎么可能邮件不送达?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多