【问题标题】:Send Grid Status =Waiting for activationSendgrid 状态 = 等待激活
【发布时间】:2020-07-26 13:13:48
【问题描述】:

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

我在发送网格上验证了发件人(它是一个 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 上阅读了一篇文章,我认为我需要将私有 Task Execute 设为异步

 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 帐户

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

问题出在哪里?

非常感谢任何建议,并提前感谢您!

【问题讨论】:

  • 我也有同样的问题,你知道是什么问题吗?
  • 来自 OP 的编辑评论:You cannot send emails with send grid to Yahoo mail.
  • 请不要在标题中添加像[RESOLVED] 这样的额外噪音。如果你已经解决了,写一个答案并接受它。

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


【解决方案1】:

怎么样:

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

【讨论】:

    【解决方案2】:

    不会起作用,因为主机发送网格不允许发送邮件给发件人邮件发送邮件。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    • 这是对上一个答案的评论吗?还是对原始问题的新答案?如果是后者,解决办法是什么?
    猜你喜欢
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2015-09-26
    相关资源
    最近更新 更多