发送网格状态=等待激活[已解决]

时间:2020-07-26 13:13:48

标签: asp.net-mvc asp.net-core sendgrid sendgrid-api-v3

在管理员通过按钮提交后,我需要完成一项需要发送电子邮件确认的任务,但是我不明白我在哪里写错了以及为什么电子邮件没有发送。

我在发送网格(这是一个Gmail帐户)上验证了发件人,并将其复制到appsettings json

 "SendGridKey": "SG.rrFAGo83SbqRvVZxxxxxxxxxxxxxxxxx"

我的代码如下:

EmailSender.cs

public class EmailSender : IEmailSender
    {
        public EmailOptions Options { get; set; }
        public EmailSender(IOptions<EmailOptions> emailOptions)
        {
            Options = emailOptions.Value;
        }

        public Task SendEmailAsync(string email, string subject, string htmlMessage)
        {
            return Execute(Options.SendGridKey, subject, htmlMessage, email);
        }

        private Task Execute(string sendGridKey, string subject, string htmlMessage, string email)
        {
            var client = new SendGridClient(sendGridKey);
            var msg = new SendGridMessage()
            {
                From = new EmailAddress("admin@vmfhotel.com", "VMF Hotel"),
                Subject = subject,
                PlainTextContent = htmlMessage,
                HtmlContent = htmlMessage,
            };
            msg.AddTo(new EmailAddress(email));

            try
            {
                return client.SendEmailAsync(msg);
            }
            catch (Exception ex)
            {

            }

            return null;

        }

    }

在startup.cs中,我添加了:

//email service
            services.AddSingleton<IEmailSender, EmailSender>();
            services.Configure<EmailOptions>(Configuration);

我在控制器中的方法是异步的

public async Task <IActionResult> Change(int id)
        {
            var rsvItem = await _db.Reservation.FindAsync(id);

            rsvItem.Status = "Approved";

            await _db.SaveChangesAsync();

            //email sender for confirmation email
            string message = $"Hi {rsvItem.ClientName}," +
                $"<p>Your reservation details at Hotel are:</p>" +
                $"<p>Name:{rsvItem.ClientName}</p>" +
                $"<p>Check in Date: {rsvItem.CheckInDate}</p>" +
                $"<p>Check out Date: {rsvItem.CheckOutDate}</p>" +
                $"<i>Bla bla bla </i>";

            await _emailSender.SendEmailAsync(rsvItem.ClientEmail, "Reservation Confirmed", message);
            
            return RedirectToAction("Index");
        } 

我没有任何错误,但是当我尝试调试时说:

+       SendGrid.BaseClient.SendEmailAsync returned Id = 453, Status = WaitingForActivation, Method = "{null}", Result = "{Not yet computed}"   System.Runtime.CompilerServices.AsyncTaskMethodBuilder<SendGrid.Response>.AsyncStateMachineBox<SendGrid.BaseClient.<SendEmailAsync>d__22>

我在git上阅读了一篇文章,我认为我需要让私有任务执行异步

 private async Task<Response> Execute(string sendGridKey, string subject, string htmlMessage, string email)

 try
            {
                return await client.SendEmailAsync(msg);
            }

I changed the                 From = new EmailAddress(" valid email@gmail.com", "VMF Hotel"),

使用有效的Gmail帐户

我检查了发送网格,但有一个请求,但没有发送

问题出在哪里?

任何建议都将不胜感激,并提前谢谢您!

1 个答案:

答案 0 :(得分:0)

怎么样:

return await Execute(Options.SendGridKey, subject, htmlMessage, email);