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

如何在Blazor托管WebAssembly中实现服务端邮件服务并对接客户端?

Blazor托管WebAssembly邮件服务实现步骤

一、服务端实现邮件发送服务

  1. 定义邮件服务接口
    在服务端项目中创建接口,规范邮件发送方法:

    public interface IEmailService
    {
        Task SendEmailAsync(string toEmail, string subject, string body);
    }
    
  2. 实现邮件服务
    选用MailKit库(需安装MailKit和MimeKit NuGet包)编写实现,从配置文件读取SMTP参数:

    public class EmailService : IEmailService
    {
        private readonly IConfiguration _config;
    
        public EmailService(IConfiguration config)
        {
            _config = config;
        }
    
        public async Task SendEmailAsync(string toEmail, string subject, string body)
        {
            var message = new MimeMessage();
            message.From.Add(new MailboxAddress(_config["EmailSettings:SenderName"], _config["EmailSettings:SenderEmail"]));
            message.To.Add(new MailboxAddress("", toEmail));
            message.Subject = subject;
    
            message.Body = new TextPart("html") { Text = body };
    
            using var client = new SmtpClient();
            await client.ConnectAsync(
                _config["EmailSettings:SmtpServer"], 
                int.Parse(_config["EmailSettings:SmtpPort"]), 
                bool.Parse(_config["EmailSettings:UseSsl"])
            );
            await client.AuthenticateAsync(_config["EmailSettings:Username"], _config["EmailSettings:Password"]);
            await client.SendAsync(message);
            await client.DisconnectAsync(true);
        }
    }
    

    在appsettings.json中添加SMTP配置:

    "EmailSettings": {
      "SenderEmail": "your-sender@domain.com",
      "SenderName": "Your App Name",
      "SmtpServer": "smtp.yourprovider.com",
      "SmtpPort": "587",
      "UseSsl": "true",
      "Username": "your-smtp-username",
      "Password": "your-smtp-password"
    }
    
  3. 注册服务到依赖注入容器
    在服务端的Program.cs中添加:

    builder.Services.AddScoped<IEmailService, EmailService>();
    

二、创建服务端API端点

Blazor托管项目的服务端是ASP.NET Core应用,直接创建API控制器暴露邮件发送接口:

[ApiController]
[Route("api/[controller]")]
public class EmailController : ControllerBase
{
    private readonly IEmailService _emailService;

    public EmailController(IEmailService emailService)
    {
        _emailService = emailService;
    }

    [HttpPost("send")]
    public async Task<IActionResult> SendEmail([FromBody] EmailRequest request)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        try
        {
            await _emailService.SendEmailAsync(request.ToEmail, request.Subject, request.Body);
            return Ok();
        }
        catch (Exception ex)
        {
            // 记录日志
            return StatusCode(StatusCodes.Status500InternalServerError, "邮件发送失败");
        }
    }
}

// 请求DTO
public class EmailRequest
{
    [Required]
    [EmailAddress]
    public string ToEmail { get; set; }
    [Required]
    public string Subject { get; set; }
    [Required]
    public string Body { get; set; }
}

三、客户端调用服务端API

Blazor客户端有两种常用调用方式:

方式1:使用原生HttpClient

Blazor托管项目默认已在客户端Program.cs注册HttpClient,直接注入到组件使用:

@inject HttpClient Http
@using YourProject.Shared // 引用EmailRequest所在的共享项目

<button @onclick="SendEmail">发送测试邮件</button>

@code {
    private async Task SendEmail()
    {
        var request = new EmailRequest
        {
            ToEmail = "user@example.com",
            Subject = "测试邮件",
            Body = "<h1>这是来自Blazor客户端的测试邮件</h1>"
        };

        try
        {
            var response = await Http.PostAsJsonAsync("api/email/send", request);
            response.EnsureSuccessStatusCode();
            // 提示用户发送成功
        }
        catch (HttpRequestException ex)
        {
            // 处理错误,显示错误信息
        }
    }
}

方式2:使用类型安全的API客户端(可选)

用Refit库实现类型化调用:

  1. 客户端安装Refit NuGet包
  2. 定义API接口:
    public interface IEmailApi
    {
        [Post("/api/email/send")]
        Task<ApiResponse<object>> SendEmail([Body] EmailRequest request);
    }
    
  3. 在客户端Program.cs注册:
    builder.Services.AddRefitClient<IEmailApi>().ConfigureHttpClient(c => 
        c.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress));
    
  4. 在组件中注入IEmailApi并调用即可

四、关键注意事项

  • 配置安全:生产环境不要明文存储SMTP密码,使用.NET Secret Manager、Azure Key Vault等保密方案
  • 输入验证:客户端和服务端都要做输入验证(邮箱格式、必填项),避免无效请求
  • 错误处理:添加全局异常处理,给用户友好提示,服务端记录详细日志便于排查
  • 跨域问题:托管项目默认同域无需配置CORS;单独部署客户端时,需在服务端配置CORS策略

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:15:50