跳到主要内容

IGeekFan.FreeKit.Email

基于 MailKit 的邮件发送,支持单服务器和多服务器轮询。

功能概览

功能说明
邮件发送基于 MailKit 的 SMTP 邮件
多服务器支持多邮件服务器轮询容错

安装

dotnet add package IGeekFan.FreeKit.Email

单服务器模式

services.AddEmailSender(configuration);
{
"MailKitOptions": {
"Host": "smtp.qq.com",
"Port": 465,
"EnableSsl": true,
"DisplayName": "我的应用",
"UserName": "xxx@foxmail.com",
"Password": "授权码"
}
}

多服务器轮询

多个服务器按顺序尝试,第一个失败自动切换下一个:

{
"MailKitOptions": {
"Servers": [
{
"Name": "QQ",
"Host": "smtp.qq.com",
"Port": 465,
"EnableSsl": true,
"DisplayName": "我的应用",
"UserName": "xxx@foxmail.com",
"Password": "授权码"
},
{
"Name": "163",
"Host": "smtp.163.com",
"Port": 465,
"EnableSsl": true,
"DisplayName": "我的应用",
"UserName": "xxx@163.com",
"Password": "授权码"
}
]
}
}

回调配置

services.AddEmailSender(r =>
{
r.Host = "smtp.qq.com";
r.Port = 465;
r.EnableSsl = true;
r.DisplayName = "我的应用";
r.UserName = "xxx@foxmail.com";
r.Password = "授权码";
});

发送邮件

场景:注册验证码

public class AccountService : IScopedDependency
{
private readonly IEmailSender _emailSender;

public AccountService(IEmailSender emailSender) => _emailSender = emailSender;

public async Task SendVerifyCode(string email, string nickname)
{
var message = new MimeMessage();
message.To.Add(new MailboxAddress(nickname, email));
message.Subject = "验证码";

int code = new Random().Next(100000, 999999);
message.Body = new TextPart("html")
{
Text = $@"{nickname} 您好,验证码:{code},5分钟内有效。"
};

await _emailSender.SendAsync(message);
}
}

场景:发送通知邮件

public async Task SendOrderNotification(string email, string orderNo)
{
var message = new MimeMessage();
message.To.Add(new MailboxAddress("", email));
message.Subject = $"订单 {orderNo} 已发货";
message.Body = new TextPart("html")
{
Text = $@"您的订单 {orderNo} 已发货,请注意查收。"
};

await _emailSender.SendAsync(message);
}

自定义服务器提供器

从 Redis、数据库读取配置,支持限额轮询:

public class RedisEmailServerProvider : IEmailServerProvider
{
public async Task<List<MailKitOptions>> GetServersAsync(CancellationToken ct)
{
// 从 Redis 读取,跳过超额服务器
}

public Task OnSendSuccessAsync(MailKitOptions server, CancellationToken ct)
{
// 计数递增
return Task.CompletedTask;
}

public Task OnSendFailureAsync(MailKitOptions server, CancellationToken ct)
{
// 熔断处理
return Task.CompletedTask;
}
}

// 注册
services.AddEmailSender<RedisEmailServerProvider>(configuration);

接口说明

接口说明
IEmailSender发送邮件主接口
IEmailServerProvider服务器选择策略(可选)

相关文档