使用FluentEmail发送邮件时后续邮件To收件人不断累加如何解决
问题原因
核心原因是FluentEmail默认注入的IFluentEmail实例生命周期为单例,你在FluentEmailService中注入的是全局唯一的IFluentEmail对象,每次调用To()方法都是往该实例的收件人集合中追加数据,不会自动清空上一次的收件人记录,多次调用后自然会出现收件人重复累加的情况。
修复方案
推荐使用IFluentEmailFactory每次创建全新的邮件实例,避免复用同一对象导致的属性残留,修改步骤如下:
- 调整FluentEmailService的依赖注入项,将注入
IFluentEmail改为注入IFluentEmailFactory - 每次执行发送逻辑前,先通过工厂创建新的IFluentEmail实例再进行后续操作
修改后的邮件服务代码示例:
public class FluentEmailService : IFluentEmailService { private readonly IFluentEmailFactory _emailFactory; private readonly ILogger<FluentEmailService> _logger; public FluentEmailService(ILogger<FluentEmailService> logger, IFluentEmailFactory emailFactory) { _logger = logger; _emailFactory = emailFactory; } public async Task<SendResponse> SendEmailAsync<TModel>(string subject, string razorTemplatePath, TModel model, string semicolonSeparatedEmailRecipients) { // 每次创建新的邮件实例,无历史属性残留 var fluentEmail = _emailFactory.Create(); var sendResponse = await fluentEmail .To(semicolonSeparatedEmailRecipients) .Subject(subject) .UsingTemplateFromFile(razorTemplatePath, model) .SendAsync(); return sendResponse; } }
补充说明
原有ConfigureServices中的注册代码不需要修改,FluentEmail在调用AddFluentEmail方法时已经默认注册了IFluentEmailFactory的实现,直接注入使用即可。
如果不想使用工厂模式,也可以在每次发送完成后手动清空IFluentEmail实例的收件人集合,但这种方式容易遗漏清理逻辑,稳定性远不如每次创建新实例的方案。
内容的提问来源于stack exchange,提问作者Ash K
相关产品推荐
相关产品推荐

