【发布时间】: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