如何在Blazor托管WebAssembly中实现服务端邮件服务并对接客户端?
Blazor托管WebAssembly邮件服务实现步骤
一、服务端实现邮件发送服务
定义邮件服务接口
在服务端项目中创建接口,规范邮件发送方法:public interface IEmailService { Task SendEmailAsync(string toEmail, string subject, string body); }实现邮件服务
选用MailKit库(需安装MailKit和MimeKitNuGet包)编写实现,从配置文件读取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" }注册服务到依赖注入容器
在服务端的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库实现类型化调用:
- 客户端安装
RefitNuGet包 - 定义API接口:
public interface IEmailApi { [Post("/api/email/send")] Task<ApiResponse<object>> SendEmail([Body] EmailRequest request); } - 在客户端
Program.cs注册:builder.Services.AddRefitClient<IEmailApi>().ConfigureHttpClient(c => c.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)); - 在组件中注入
IEmailApi并调用即可
四、关键注意事项
- 配置安全:生产环境不要明文存储SMTP密码,使用.NET Secret Manager、Azure Key Vault等保密方案
- 输入验证:客户端和服务端都要做输入验证(邮箱格式、必填项),避免无效请求
- 错误处理:添加全局异常处理,给用户友好提示,服务端记录详细日志便于排查
- 跨域问题:托管项目默认同域无需配置CORS;单独部署客户端时,需在服务端配置CORS策略
内容的提问来源于stack exchange,提问作者Georgi Yakov
相关产品推荐
相关产品推荐

