今天我们来详细介绍如何在ASP.NET Core项目中实现一个完整的邮件发送功能。本教程将带您从配置到测试的完整实现过程。
一、SMTP配置设置
首先,我们需要在appsettings.json
中添加SMTP服务器配置信息:
{
"SmtpSettings": {
"Server": "smtp.example.com",
"Port": 587,
"Username": "your_email@example.com",
"Password": "your_email_password"
}
}
二、邮件服务实现
2.1 创建SMTP配置模型
创建SmtpSettings.cs
类来映射配置信息:
public class SmtpSettings
{
public string Server { get; set; } = null!;
public int Port { get; set; }
public string Username { get; set; } = null!;
public string Password { get; set; } = null!;
}
2.2 实现邮件发送服务
创建EmailService
类封装邮件发送逻辑:
public class EmailService
{
private readonly SmtpSettings _smtpSettings;
public EmailService(IOptions<SmtpSettings> smtpSettings)
{
_smtpSettings = smtpSettings.Value;
}
public async Task SendEmailAsync(string email, string subject, string htmlMessage)
{
var mailMessage = new MailMessage
{
From = new MailAddress(_smtpSettings.Username),
Subject = subject,
Body = htmlMessage,
IsBodyHtml = true
};
mailMessage.To.Add(new MailAddress(email));
using var smtpClient = new SmtpClient(_smtpSettings.Server, _smtpSettings.Port);
smtpClient.Credentials = new NetworkCredential(_smtpSettings.Username, _smtpSettings.Password);
smtpClient.EnableSsl = true;
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
await smtpClient.SendMailAsync(mailMessage);
}
}
2.3 注册服务
在Program.cs
中注册SMTP服务:
builder.Services.Configure<SmtpSettings>(builder.Configuration.GetSection("SmtpSettings"));
三、控制器实现
创建EmailController
实现验证码邮件发送功能:
[Route("[controller]/[Action]")]
[ApiController]
public class EmailController : ControllerBase
{
private readonly EmailService _emailService;
private readonly IUserInfoService _iUserInfoService;
public EmailController(EmailService emailService, IUserInfoService iUserInfoService)
{
_emailService = emailService;
_iUserInfoService = iUserInfoService;
}
[HttpPost]
public async Task<ApiResult> SendEmailValidateCode(EmailLoginSendRequestInput req)
{
if (string.IsNullOrWhiteSpace(req.Email))
{
return ApiResultHelper.Error("邮箱不能为空");
}
var user = await _iUserInfoService.FindAsync(c => c.Email == req.Email);
if (user == null)
{
return ApiResultHelper.Error("邮箱不存在");
}
// 生成验证码
var validateCode = new Random().Next(100000, 999999).ToString();
string emailTemplate = @"
<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""UTF-8"">
<meta name=""viewport""
content=""width=device-width, initial-scale=1.0"">
<title>Document</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f5f5f5;
margin: 0;
padding: 0;
}
.container {
max-width: 600px;
margin: 50px auto;
background-color: #ffffff;
padding: 30px;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
h2 {
color: #333333;
text-align: center;
margin-top: 0;
}
p {
color: #666666;
line-height: 1.6;
}
.code {
font-size: 24px;
font-weight: bold;
color: #007BFF;
margin: 20px 0;
text-align: center;
}
.notice {
color: #999999;
text-align: center;
}
.email {
color: #007BFF;
}
</style>
</head>
<body>
<div class=""container"">
<h2>欢迎使用邮箱登录验证</h2>
<p>您好,<span class=""email"">{{Email}}</span></p>
<p>感谢您选择使用我们的服务。以下是您的邮箱登录验证码,请查收:</p>
<div class=""code"">
<span id=""validateCode"">{{VALIDATE_CODE}}</span>
</div>
<p class=""notice"">请注意,此验证码有效期为5分钟,请在有效期内完成操作。为了保障您的账户安全,请勿向任何人透露此验证码。</p>
<p>如果您没有请求此验证码,请忽略此邮件,可能是有人误输入了您的邮箱地址。</p>
<p>祝您使用愉快!</p>
<p>此致<br>梦博客团队</p>
</div>
</body>
</html>";
// 发送验证码邮件
emailTemplate = emailTemplate.Replace("{{VALIDATE_CODE}}", validateCode);
emailTemplate = emailTemplate.Replace("{{Email}}", req.Email);
var subject = "邮箱登录验证码";
var message = emailTemplate;
MemoryHelper.SetMemory(validateCode, validateCode, 5);
await _emailService.SendEmailAsync(req.Email, subject, message);
return ApiResultHelper.Success("验证码已发送", true);
}
}
四、邮件模板设计
我设计了一个美观的HTML邮件模板,包含验证码显示、使用说明等信息。模板代码见原文。
五、注意事项
- 确保SMTP配置信息正确,包括服务器地址、端口号等
- 验证码建议设置合理的有效期(示例中为5分钟)
- 注意处理邮件发送的异常情况
- 建议在生产环境中使用加密存储SMTP密码
六、测试验证
完成以上步骤后,您可以通过Postman或其他API测试工具测试邮件发送功能是否正常工作。
本教程详细介绍了在ASP.NET Core中实现邮件发送功能的完整过程。通过这个实现,您可以轻松地在项目中集成邮件发送功能,用于验证码发送、通知提醒等场景。
如果您在实现过程中遇到任何问题,欢迎在评论区讨论交流。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。