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 | 服务器选择策略(可选) |