.Net如何优雅的实现发送邮件服务

使用.NET内置的SmtpClient类

在.NET中,可以通过System.Net.Mail命名空间下的SmtpClient类发送邮件。需要配置SMTP服务器地址、端口、凭据等信息。

具体实现可参考NetCoreKevin的Kevin.Email模块

基于.NET构建的企业级SaaS智能应用架构,采用前后端分离设计,具备以下核心特性:

前端技术:

EmailService实现

csharp 复制代码
using Kevin.Email.dto;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Net.Mime;
using System.Text;
using System.Threading.Tasks;

namespace Kevin.Email
{
    /// <summary>
    /// 邮件服务
    /// </summary>
    public class EmailService : IEmailService, IDisposable
    {
        private readonly EmailSetting _emailSetting;

        private readonly SmtpClient _smtpClient;
        public EmailService(IOptionsMonitor<EmailSetting> config)
        {
            _emailSetting = config.CurrentValue;
            _smtpClient = new(_emailSetting.SmtpServer, _emailSetting.Port);
            _smtpClient.Credentials = new NetworkCredential(_emailSetting.AccountName, _emailSetting.AccountPassword);
            _smtpClient.EnableSsl = true;
            _smtpClient.UseDefaultCredentials = false;
            _smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
        }

        public void Dispose()
        {
            _smtpClient.Dispose();
        }

        /// <summary>
        /// 发送邮件
        /// </summary>
        /// <param name="email"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public async Task<bool> SendEmail(SendEmailDto email)
        {  
            using (MailMessage message = new())
            {
                foreach (var filePath in email.FileList)
                {
                    Attachment data = new(filePath.Key, MediaTypeNames.Application.Octet)
                    {
                        Name = filePath.Value
                    };
                    message.Attachments.Add(data);
                }
                message.From = new(_emailSetting.AccountName, email.FromDisplayName);
                foreach (var toAddress in email.ToAddresses)
                {
                    message.To.Add(new MailAddress(toAddress));
                }
                message.Subject = email.Subject;
                message.Body = email.Body;
                message.BodyEncoding = System.Text.Encoding.UTF8;
                message.IsBodyHtml = email.IsBodyHtml;
                await _smtpClient.SendMailAsync(message);
            }
            return true; 
        }
    }
}
复制代码
var smtpClient = new SmtpClient("smtp.example.com")
{
    Port = 587,
    Credentials = new NetworkCredential("username", "password"),
    EnableSsl = true,
};

var mailMessage = new MailMessage
{
    From = new MailAddress("from@example.com"),
    Subject = "Subject",
    Body = "<h1>Hello</h1>",
    IsBodyHtml = true,
};
mailMessage.To.Add("to@example.com");

smtpClient.Send(mailMessage);

使用MailKit库

MailKit是一个更现代、功能更强大的邮件处理库,支持更多协议和高级功能。

复制代码
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Sender Name", "from@example.com"));
message.To.Add(new MailboxAddress("Recipient Name", "to@example.com"));
message.Subject = "Subject";

var builder = new BodyBuilder();
builder.HtmlBody = "<h1>Hello</h1>";

message.Body = builder.ToMessageBody();

using var client = new SmtpClient();
client.Connect("smtp.example.com", 587, SecureSocketOptions.StartTls);
client.Authenticate("username", "password");
client.Send(message);
client.Disconnect(true);

配置依赖注入

在ASP.NET Core中,可以通过依赖注入方式配置邮件服务。

复制代码
services.AddTransient<IEmailSender, EmailSender>();
services.Configure<EmailSettings>(Configuration.GetSection("EmailSettings"));

实现EmailSender类:

复制代码
public class EmailSender : IEmailSender
{
    private readonly EmailSettings _emailSettings;

    public EmailSender(IOptions<EmailSettings> emailSettings)
    {
        _emailSettings = emailSettings.Value;
    }

    public async Task SendEmailAsync(string email, string subject, string message)
    {
        // 使用MailKit或SmtpClient实现发送逻辑
    }
}

使用FluentEmail库

FluentEmail提供了流畅的API来构建和发送邮件。

复制代码
var email = Email
    .From("from@example.com")
    .To("to@example.com")
    .Subject("Subject")
    .Body("Hello");

email.Send();

处理异步发送

对于Web应用,建议使用异步方式发送邮件以避免阻塞请求线程。

复制代码
public async Task SendEmailAsync(string to, string subject, string body)
{
    using var smtpClient = new SmtpClient("smtp.example.com");
    var mailMessage = new MailMessage("from@example.com", to, subject, body);
    await smtpClient.SendMailAsync(mailMessage);
}

配置邮件模板

使用Razor模板引擎生成邮件内容,保持视图和逻辑分离。

复制代码
var template = "Hello @Model.Name, welcome to our service!";
var result = Razor.Parse(template, new { Name = "John" });
相关推荐
OctShop大型商城源码13 小时前
.NET线上商城源码_C#商城源码_技术赋能下的电商新生态
开发语言·c#·.net·商城系统源码
柠檬苏打z17 小时前
C# SwaggerLoginAuthPlugin 一款给Swagger文档加登录页面的小插件
.net·swagger
追逐时光者18 小时前
2026 年 .NET 客户端常用 MVVM 框架推荐
后端·.net
唐青枫21 小时前
C#.NET YARP 详解:用 ASP.NET Core 打造高性能反向代理网关
c#·.net
李少兄1 天前
解决 java.net.ConnectException: Connection refused 报错
java·开发语言·.net
步步为营DotNet2 天前
深挖.NET 11 中 Native AOT 在边缘计算设备性能与安全的突破应用
安全·.net·边缘计算
码农刚子2 天前
.NET 8 Web开发入门(二):C# 现代语法速成——为 Web API 量身定制
c#·.net
江沉晚呤时2 天前
用 C# 玩转 Scriban:自动生成报告、代码、文本,效率提升 10 倍
数据库·microsoft·c#·.net
.NET修仙日记3 天前
2026 .NET 面试八股文:高频题 + 答案 + 原理(高级核心篇)
面试·职场和发展·c#·.net·.net core·.net 8
唐青枫3 天前
终于不用手搓两级缓存了!C#.NET HybridCache 详解:L1 L2、标签失效与防击穿实战
c#·.net