如何使用SmtpClient发送含不同称呼的模板邮件
实现针对每个收件人替换的批量邮件发送
核心思路
因为仅需替换<username>这一个占位符,其余内容统一,所以可以只加载一次基础模板,然后对每个收件人单独做占位符替换,再发送邮件,避免重复加载模板提升效率。
具体实现步骤
- 调用
GetEmailBody()获取完整的基础邮件模板内容(这一步只执行一次)
- 调用
- 遍历所有收件人列表,对每个收件人执行:
- a. 基于基础模板,替换其中的
<username>为当前收件人的用户名 - b. 构造对应收件人的
EmailOption实体,设置收件人地址、替换后的邮件内容等信息 - c. 调用
SendEmail()方法发送邮件
代码示例(基于C#)
假设你的现有类结构大致如下:
public class EmailService { // 获取邮件模板内容 public string GetEmailBody() { // 现有逻辑:从文件/数据库读取模板,返回带<username>占位符的内容 return "您好<username>,这是一封测试邮件..."; } // 替换占位符 public string UpdatePlaceHolders(string template, Dictionary<string, string> placeholders) { // 现有逻辑:遍历占位符字典替换模板中的对应内容 foreach (var placeholder in placeholders) { template = template.Replace($"<{placeholder.Key}>", placeholder.Value); } return template; } // 发送邮件 public void SendEmail(EmailOption option) { // 现有逻辑:使用SmtpClient发送邮件 using (var client = new SmtpClient()) { // 设置SMTP参数、构造MailMessage并发送 } } } public class EmailOption { public string ToEmail { get; set; } public string EmailBody { get; set; } public string Subject { get; set; } // 其他邮件属性:发件人、附件等 }
那么批量发送的方法可以这样扩展:
public void SendBulkPersonalizedEmail(List<(string ToEmail, string UserName)> recipients, string subject) { // 1. 只加载一次基础模板 string baseTemplate = GetEmailBody(); // 2. 遍历每个收件人处理 foreach (var recipient in recipients) { // 仅替换<username>占位符 var placeholders = new Dictionary<string, string> { { "username", recipient.UserName } }; string personalizedBody = UpdatePlaceHolders(baseTemplate, placeholders); // 构造当前收件人的邮件选项 var emailOption = new EmailOption { ToEmail = recipient.ToEmail, EmailBody = personalizedBody, Subject = subject // 其他通用属性(如发件人)可以在这里统一设置 }; // 发送邮件 SendEmail(emailOption); } }
关键说明
- 模板复用:基础模板只加载一次,避免重复IO操作(比如重复读取文件/数据库),提升批量发送的效率
- 针对性替换:每个收件人只替换
<username>,其余内容保持和基础模板一致,完全匹配需求 - 扩展性:如果后续需要增加其他个性化占位符,只需要在
placeholders字典中添加对应的键值对即可,不需要修改核心逻辑
内容的提问来源于stack exchange,提问作者Dhanyanjay Singh
相关产品推荐
相关产品推荐

