如何为动态SendGrid模板设置变量?

问题描述 投票:0回答:2

我知道如何添加模板

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();
    }
}
c# asp.net-core asp.net-core-mvc sendgrid
2个回答
2
投票

让 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中的动态模板


0
投票

我的解决方案是使用存储在 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}");
                }
© www.soinside.com 2019 - 2024. All rights reserved.