企服版框架中邮件收发套件
License
—
Deps
2
Install Size
—
Vulns
✓ 0
Published
Feb 26, 2026
$ dotnet add package TJC.Cyclops.EMailKitCyclops.EmailKit是企服版框架中的专业邮件处理套件,提供了完整的邮件收发解决方案。该项目基于MailKit库构建,支持SMTP邮件发送、POP3和IMAP邮件接收等核心功能,为企业级应用提供了稳定可靠的邮件通信能力。通过统一的接口和灵活的配置,Cyclops.EmailKit使开发者能够轻松集成邮件功能,实现通知、报表、通信等业务需求。
可以通过以下方式安装Cyclops.EmailKit包:
NuGet包管理器:
Install-Package TJC.Cyclops.EmailKit
.NET CLI:
dotnet add package TJC.Cyclops.EmailKit
在应用程序中配置邮件服务:
// 在配置文件中(appsettings.json)
{
"EMailOptions": {
"SmtpHost": "smtp.example.com",
"SmtpPort": 587,
"SmtpUsername": "username@example.com",
"SmtpPassword": "password",
"SmtpUseSsl": true,
"Pop3Host": "pop.example.com",
"Pop3Port": 995,
"Pop3Username": "username@example.com",
"Pop3Password": "password",
"Pop3UseSsl": true,
"ImapHost": "imap.example.com",
"ImapPort": 993,
"ImapUsername": "username@example.com",
"ImapPassword": "password",
"ImapUseSsl": true,
"Timeout": 60,
"MaxRetryCount": 3
}
}
// 在应用程序启动时
public void ConfigureServices(IServiceCollection services)
{
// 从配置中绑定邮件选项
services.Configure<EMailOptions>(Configuration.GetSection("EMailOptions"));
// 注册邮件工厂
services.AddSingleton<EMailFactory>();
// 注册邮件服务
services.AddScoped<IMailService, MailService>();
}
public class MailService : ITransient
{
private readonly EMailFactory _emailFactory;
public MailService(EMailFactory emailFactory)
{
_emailFactory = emailFactory;
}
public async Task SendTextEmailAsync(string to, string subject, string body)
{
// 获取SMTP客户端
var smtpClient = await _emailFactory.GetClientAsync(EnumClientType.SMTP);
// 创建邮件消息
var msgInput = new MsgInput
{
To = new List<UserAddress> { new UserAddress { Email = to } },
Subject = subject,
Body = body,
IsBodyHtml = false
};
// 发送邮件
await smtpClient.SendAsync(msgInput);
}
}
public async Task SendHtmlEmailAsync(string to, string subject, string htmlBody)
{
var smtpClient = await _emailFactory.GetClientAsync(EnumClientType.SMTP);
var msgInput = new MsgInput
{
To = new List<UserAddress> { new UserAddress { Email = to } },
Subject = subject,
Body = htmlBody,
IsBodyHtml = true
};
await smtpClient.SendAsync(msgInput);
}
public async Task SendEmailWithAttachmentAsync(string to, string subject, string body, string filePath)
{
var smtpClient = await _emailFactory.GetClientAsync(EnumClientType.SMTP);
var msgInput = new MsgInput
{
To = new List<UserAddress> { new UserAddress { Email = to } },
Subject = subject,
Body = body,
IsBodyHtml = true,
Attachments = new List<Attachment>
{
new Attachment
{
FileName = Path.GetFileName(filePath),
FileContent = await File.ReadAllBytesAsync(filePath),
ContentType = MimeTypes.GetMimeType(filePath)
}
}
};
await smtpClient.SendAsync(msgInput);
}
public async Task<List<Message>> ReceiveEmailsPop3Async(int maxCount = 10)
{
var pop3Client = await _emailFactory.GetClientAsync(EnumClientType.POP3) as EMailPop3;
if (pop3Client == null) throw new InvalidOperationException("POP3 client not available");
// 获取邮件数量
var count = await pop3Client.GetMessageCountAsync();
// 限制获取数量
count = Math.Min(count, maxCount);
var messages = new List<Message>();
// 获取最近的邮件
for (int i = 1; i <= count; i++)
{
var message = await pop3Client.GetMessageAsync(i);
messages.Add(message);
}
return messages;
}
public async Task<List<Message>> ReceiveUnreadEmailsImapAsync(string folderName = "INBOX", int maxCount = 10)
{
var imapClient = await _emailFactory.GetClientAsync(EnumClientType.IMAP) as EMailImap;
if (imapClient == null) throw new InvalidOperationException("IMAP client not available");
// 选择邮件文件夹
await imapClient.SelectFolderAsync(folderName);
// 搜索未读邮件
var unreadMessages = await imapClient.SearchUnreadMessagesAsync(maxCount);
return unreadMessages;
}
public async Task SendEmailWithCustomConfigAsync(string to, string subject, string body)
{
// 创建自定义配置
var customOptions = new EMailOptions
{
SmtpHost = "custom-smtp.example.com",
SmtpPort = 465,
SmtpUsername = "custom@example.com",
SmtpPassword = "custom-password",
SmtpUseSsl = true,
Timeout = 30
};
// 使用自定义配置获取客户端
var smtpClient = await _emailFactory.GetClientAsync(EnumClientType.SMTP, customOptions);
var msgInput = new MsgInput
{
To = new List<UserAddress> { new UserAddress { Email = to } },
Subject = subject,
Body = body,
IsBodyHtml = false
};
await smtpClient.SendAsync(msgInput);
}
public async Task SendTemplatedEmailAsync(string to, string templateName, Dictionary<string, string> replacements)
{
// 加载邮件模板
var templateBody = await LoadTemplateAsync(templateName);
// 替换模板变量
var body = ReplaceTemplateVariables(templateBody, replacements);
var smtpClient = await _emailFactory.GetClientAsync(EnumClientType.SMTP);
var msgInput = new MsgInput
{
To = new List<UserAddress> { new UserAddress { Email = to } },
Subject = replacements.ContainsKey("Subject") ? replacements["Subject"] : "Notification",
Body = body,
IsBodyHtml = true
};
await smtpClient.SendAsync(msgInput);
}
public async Task SendBulkEmailsAsync(List<string> recipients, string subject, string body)
{
var smtpClient = await _emailFactory.GetClientAsync(EnumClientType.SMTP);
foreach (var recipient in recipients)
{
try
{
var msgInput = new MsgInput
{
To = new List<UserAddress> { new UserAddress { Email = recipient } },
Subject = subject,
Body = body,
IsBodyHtml = true
};
await smtpClient.SendAsync(msgInput);
// 添加延迟避免触发邮件服务器限制
await Task.Delay(1000);
}
catch (Exception ex)
{
Logger.Error($"Failed to send email to {recipient}: {ex.Message}", ex);
// 继续处理下一个收件人
}
}
}
public async Task EnqueueEmailAsync(string to, string subject, string body)
{
// 将邮件信息保存到队列数据库或消息队列
var emailQueueItem = new EmailQueueItem
{
To = to,
Subject = subject,
Body = body,
CreatedAt = DateTime.Now,
Status = EmailQueueStatus.Pending
};
await _dbContext.EmailQueue.AddAsync(emailQueueItem);
await _dbContext.SaveChangesAsync();
}
// 后台任务处理邮件队列
public async Task ProcessEmailQueueAsync(CancellationToken stoppingToken)
{
var smtpClient = await _emailFactory.GetClientAsync(EnumClientType.SMTP);
while (!stoppingToken.IsCancellationRequested)
{
// 获取待发送的邮件
var pendingEmails = await _dbContext.EmailQueue
.Where(e => e.Status == EmailQueueStatus.Pending)
.OrderBy(e => e.CreatedAt)
.Take(10)
.ToListAsync();
foreach (var email in pendingEmails)
{
try
{
var msgInput = new MsgInput
{
To = new List<UserAddress> { new UserAddress { Email = email.To } },
Subject = email.Subject,
Body = email.Body,
IsBodyHtml = email.IsHtml
};
await smtpClient.SendAsync(msgInput);
// 更新邮件状态
email.Status = EmailQueueStatus.Sent;
email.SentAt = DateTime.Now;
}
catch (Exception ex)
{
Logger.Error($"Failed to send queued email {email.Id}: {ex.Message}", ex);
// 更新失败状态
email.Status = EmailQueueStatus.Failed;
email.ErrorMessage = ex.Message;
email.RetryCount++;
// 如果重试次数未达到上限,设置为可重试
if (email.RetryCount < 3)
{
email.Status = EmailQueueStatus.RetryPending;
email.NextRetryAt = DateTime.Now.AddMinutes(5 * email.RetryCount);
}
}
}
await _dbContext.SaveChangesAsync();
// 等待下一次处理
await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
}
}
SMTP服务器配置:使用前请确保SMTP服务器配置正确,特别是端口和SSL/TLS设置
邮件发送频率限制:注意控制邮件发送频率,避免触发邮件服务器的限制机制
敏感信息保护:邮件配置中的密码等敏感信息应妥善保管,建议使用配置中心或密钥管理服务
附件大小限制:注意邮件服务器可能对附件大小有限制,大文件建议使用链接替代
编码处理:发送中文或其他非ASCII字符时,注意编码设置
异常处理:邮件发送可能因网络问题失败,建议添加重试机制
内存管理:处理大量邮件或大附件时,注意内存使用情况,及时释放资源
性能优化:对于批量邮件操作,考虑使用异步方法和并发处理
安全考虑:使用SSL/TLS加密连接,避免明文传输邮件内容和凭据
日志记录:记录邮件发送状态和结果,便于问题排查和业务追踪
保留所有权利