You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor注册页无按钮触发SendEmailAsync实现邮箱验证方案咨询

实现注册自动发送验证邮件(替代SendGrid方案)

一、自动触发邮件的核心逻辑

在注册流程中,用户提交表单并通过验证后,无需额外按钮触发,直接在用户创建成功的逻辑后调用SendEmailAsync方法。示例代码(ASP.NET Core 身份框架场景):

public async Task<IActionResult> Register(RegisterViewModel model)
{
    if (!ModelState.IsValid) return View(model);

    var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
    var createResult = await _userManager.CreateAsync(user, model.Password);
    
    if (createResult.Succeeded)
    {
        // 生成邮箱验证链接
        var confirmationToken = await _userManager.GenerateEmailConfirmationTokenAsync(user);
        var callbackUrl = Url.Action(
            "ConfirmEmail", 
            "Account", 
            new { userId = user.Id, code = confirmationToken }, 
            HttpContext.Request.Scheme
        );

        // 自动发送验证邮件
        await _emailSender.SendEmailAsync(
            model.Email, 
            "工单服务 - 邮箱验证", 
            $"请点击以下链接完成邮箱验证:<a href='{callbackUrl}'>验证邮箱</a>"
        );

        return RedirectToAction("Index", "Home");
    }

    foreach (var error in createResult.Errors)
    {
        ModelState.AddModelError(string.Empty, error.Description);
    }
    return View(model);
}

二、替代SendGrid的SendEmailAsync实现方案

方案1:.NET原生SMTP客户端(支持Gmail/QQ邮箱等)

直接使用System.Net.Mail命名空间下的API,配置对应邮箱的SMTP参数即可:

public class SmtpEmailSender : IEmailSender
{
    private readonly IConfiguration _config;

    public SmtpEmailSender(IConfiguration config) => _config = config;

    public async Task SendEmailAsync(string email, string subject, string htmlMessage)
    {
        var settings = _config.GetSection("SmtpSettings");
        var fromAddr = new MailAddress(settings["FromEmail"], "工单服务");
        var toAddr = new MailAddress(email);

        using var smtpClient = new SmtpClient
        {
            Host = settings["Host"],
            Port = int.Parse(settings["Port"]),
            EnableSsl = bool.Parse(settings["EnableSsl"]),
            Credentials = new NetworkCredential(settings["Username"], settings["Password"]),
            UseDefaultCredentials = false,
            DeliveryMethod = SmtpDeliveryMethod.Network
        };

        using var mailMessage = new MailMessage(fromAddr, toAddr)
        {
            Subject = subject,
            Body = htmlMessage,
            IsBodyHtml = true
        };

        await smtpClient.SendMailAsync(mailMessage);
    }
}

配置示例(appsettings.json):

"SmtpSettings": {
  "FromEmail": "your-service-email@gmail.com",
  "Host": "smtp.gmail.com",
  "Port": "587",
  "EnableSsl": "true",
  "Username": "your-service-email@gmail.com",
  "Password": "your-app-specific-password" // Gmail需用应用专用密码(开启两步验证后生成)
}

方案2:MailKit(更可靠的第三方邮件库)

MailKit是.NET生态中更稳定、功能更完善的邮件处理库,推荐用于生产环境:

  1. 安装NuGet包:Install-Package MailKit
  2. 实现IEmailSender:
public class MailKitEmailSender : IEmailSender
{
    private readonly IConfiguration _config;

    public MailKitEmailSender(IConfiguration config) => _config = config;

    public async Task SendEmailAsync(string email, string subject, string htmlMessage)
    {
        var settings = _config.GetSection("SmtpSettings");
        var mimeMessage = new MimeMessage();
        
        mimeMessage.From.Add(new MailboxAddress("工单服务", settings["FromEmail"]));
        mimeMessage.To.Add(new MailboxAddress("", email));
        mimeMessage.Subject = subject;

        mimeMessage.Body = new TextPart("html") { Text = htmlMessage };

        using var smtpClient = new SmtpClient();
        await smtpClient.ConnectAsync(
            settings["Host"], 
            int.Parse(settings["Port"]), 
            SecureSocketOptions.StartTls
        );
        await smtpClient.AuthenticateAsync(settings["Username"], settings["Password"]);
        await smtpClient.SendAsync(mimeMessage);
        await smtpClient.DisconnectAsync(true);
    }
}

配置和SMTP方案一致,MailKit对异常处理、复杂邮件内容的兼容性更好。

方案3:Mailgun API(云邮件服务替代方案)

如果不想维护SMTP服务器,Mailgun是SendGrid的常用替代云服务:

  1. 注册Mailgun账号,获取API密钥和验证域名
  2. 安装NuGet包:Install-Package Mailgun
  3. 实现代码:
public class MailgunEmailSender : IEmailSender
{
    private readonly IConfiguration _config;

    public MailgunEmailSender(IConfiguration config) => _config = config;

    public async Task SendEmailAsync(string email, string subject, string htmlMessage)
    {
        var settings = _config.GetSection("MailgunSettings");
        var client = new MailgunClient(settings["Domain"], settings["ApiKey"]);
        
        await client.SendEmailAsync(
            settings["FromEmail"],
            subject,
            null, // 可选纯文本内容
            htmlMessage,
            new List<string> { email }
        );
    }
}

配置示例(appsettings.json):

"MailgunSettings": {
  "Domain": "your-verified-domain.mailgun.org",
  "ApiKey": "your-mailgun-api-key",
  "FromEmail": "noreply@your-verified-domain.mailgun.org"
}

三、注册服务到依赖注入容器

在Program.cs中注册你选择的邮件发送服务:

// 示例:注册MailKit实现
builder.Services.AddScoped<IEmailSender, MailKitEmailSender>();

// 若使用SMTP则替换为:
// builder.Services.AddScoped<IEmailSender, SmtpEmailSender>();

// 若使用Mailgun则替换为:
// builder.Services.AddScoped<IEmailSender, MailgunEmailSender>();

内容的提问来源于stack exchange,提问作者Aaron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:05:36