我知道如何添加模板
msg.SetTemplateId("d-xxxxxxxxxxxxxxxx");
但是我如何将 Register.cs 中的
{HtmlEncoder.Default.Encode(callbackUrl)}
添加到 Sendgrid 的电子邮件动态模板中?
我已经实现了电子邮件服务并通过我的帐户激活链接接收来自 SendGrid 的电子邮件。
电子邮件控制器:
public class SendGridEmailSender : IEmailSender
{
public Task SendEmailAsync(string email, string subject, string htmlMessage)
{
var sendGridKey = @"APIKEY";
return Execute(sendGridKey, subject, htmlMessage, email);
}
public Task Execute(string apiKey, string subject, string message, string email)
{
var client = new SendGridClient(apiKey);
var msg = new SendGridMessage()
{
From = new SendGrid.Helpers.Mail.EmailAddress("[email protected]", "Webmaster"),
Subject = subject,
PlainTextContent = message,
HtmlContent = message
};
msg.AddTo(new SendGrid.Helpers.Mail.EmailAddress(email));
//msg.SetTemplateId("d-xxxxxxxxxxxxxxxx");
// Disable click tracking.
// See https://sendgrid.com/docs/User_Guide/Settings/tracking.html
msg.SetClickTracking(false, false);
return client.SendEmailAsync(msg);
}
}
注册.cs
public class RegisterModel : PageModel
{
private readonly SignInManager<ApplicationUser> _signInManager;
private readonly UserManager<ApplicationUser> _userManager;
private readonly ILogger<RegisterModel> _logger;
private readonly IEmailSender _emailSender;
public RegisterModel(
UserManager<ApplicationUser> userManager,
SignInManager<ApplicationUser> signInManager,
ILogger<RegisterModel> logger,
IEmailSender emailSender)
{
_userManager = userManager;
_signInManager = signInManager;
_logger = logger;
_emailSender = emailSender;
}
[TempData]
public string confirmLink { get; set; }
[BindProperty]
public InputModel Input { get; set; }
public string ReturnUrl { get; set; }
public IList<AuthenticationScheme> ExternalLogins { get; set; }
public class InputModel
{
[Required]
[Display(Name = "UserName")]
public string UserName { get; set; }
[Required]
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Required]
[Display(Name = "Last Name")]
public string LastName { get; set; }
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
public async Task OnGetAsync(string returnUrl = null)
{
ReturnUrl = returnUrl;
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
}
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = Input.UserName, Email = Input.Email, FirstName = Input.FirstName, LastName = Input.LastName };
var result = await _userManager.CreateAsync(user, Input.Password);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with password.");
await _userManager.AddToRoleAsync(user, Models.Roles.Basic.ToString());
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = user.Id, code = code, returnUrl = returnUrl },
protocol: Request.Scheme);
//
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
$"Please confirm your account <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
if (_userManager.Options.SignIn.RequireConfirmedAccount)
{
return RedirectToPage("RegisterConfirmation", new { email = Input.Email, returnUrl = returnUrl });
}
else
{
return LocalRedirect(returnUrl);
}
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
// If we got this far, something failed, redisplay form
return Page();
}
}
让 Sendgrid 动态模板为您发挥魔力。 从 SendgridEmailSender 中,将生成的回调URL 作为字符串参数传递。然后
将变量传递到 sendgrid 上的动态模板
var msg = new SendGridMessage()
{
From = new SendGrid.Helpers.Mail.EmailAddress("[email protected]", "Webmaster"),
Subject = subject,
PlainTextContent = message,
HtmlContent = message,
//this line passes key-value pairs to sendgrid
new Personalization{ TemplateData=new {callbackURL=callbackURL} }
};
从 Sendgrid Console 编辑您的动态模板 Html 以包含此行
Please confirm your account <a href="{{callbackUrl}}">clicking here</a>.");
这将以干净的方式将生成的callbackURL传输到sendgrid中的动态模板
我的解决方案是使用存储在 Azure 中的 SendGrid Saas 中的模板。当您创建新的 SendGridMessage 时,个性化已经初始化,因此无需添加新的个性化。 (“name”和“emailvalidationurl”是我在 SendGrid 模板中使用的 2 个占位符)。
var msg = new SendGridMessage
{
TemplateId = "d-111111111111111",
};
msg.AddTo(new EmailAddress(sendGridActivationEmailDto.Email));
msg.SetFrom(new EmailAddress("[email protected]", " Admin"));
msg.SetSubject(emailSubject);
msg.Personalizations[0].TemplateData = new { name = "Test", emailValidationUrl = "your-callback-url"};
var response = await _sendGridClient.SendEmailAsync(msg).ConfigureAwait(false);
if (response.IsSuccessStatusCode)
{
_logger.LogInformation($"The activation email for user: {sendGridActivationEmailDto?.UserName} was successfully sent.");
}
else
{
var message = await response.Body.ReadAsStringAsync();
_logger.LogError($"The activation email for user: {sendGridActivationEmailDto?.UserName} could not be sent. Reason: {message}");
}