当前位置:首页>IT那点事>ASP.NET Core实现邮件发送功能实战教程

ASP.NET Core实现邮件发送功能实战教程

今天我们来详细介绍如何在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邮件模板,包含验证码显示、使用说明等信息。模板代码见原文。

五、注意事项

  1. 确保SMTP配置信息正确,包括服务器地址、端口号等
  2. 验证码建议设置合理的有效期(示例中为5分钟)
  3. 注意处理邮件发送的异常情况
  4. 建议在生产环境中使用加密存储SMTP密码

六、测试验证

完成以上步骤后,您可以通过Postman或其他API测试工具测试邮件发送功能是否正常工作。

本教程详细介绍了在ASP.NET Core中实现邮件发送功能的完整过程。通过这个实现,您可以轻松地在项目中集成邮件发送功能,用于验证码发送、通知提醒等场景。

如果您在实现过程中遇到任何问题,欢迎在评论区讨论交流。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
有新私信 私信列表
搜索

本站承接WordPress建站仿站、二次开发、主题插件定制等PHP开发服务!