Kentico 13技术疑问:如何为营销邮件添加BCC?
营销邮件添加BCC的实现方案
问题描述
需要为营销邮件添加BCC收件人,尝试以下代码未生效:
public override void Init() { EmailInfo.TYPEINFO.Events.Insert.Before += Email_Insert_Before; } private void Email_Insert_Before(object sender, ObjectEventArgs e) { var email = e.Object as EmailInfo; email.EmailBcc = "admin@company.com"; EmailInfo.Provider.Set(email); }
代码失效原因
- 事件时机不匹配:
Insert.Before仅在邮件记录插入数据库时触发,但营销邮件(如营销自动化、批量邮件活动中的邮件)通常是发送时动态构建实例,而非直接复用数据库中的EmailInfo记录,因此修改数据库条目无法影响实际发送的邮件。 - 冗余操作干扰流程:在
Insert.Before事件中手动调用EmailInfo.Provider.Set(email)会触发重复保存逻辑,可能覆盖系统原有处理,导致修改不生效。
可行解决方案
方案1:监听邮件发送全局前置事件(推荐)
通过全局邮件发送前置事件直接修改待发送邮件对象,覆盖所有渠道的营销邮件:
public override void Init() { // 注册邮件发送前的全局监听事件 EmailSender.BeforeSendEmail += EmailSender_BeforeSendEmail; } private void EmailSender_BeforeSendEmail(object sender, BeforeSendEmailEventArgs e) { // 自定义判断逻辑:识别是否为营销邮件(示例:通过主题、发件人域名等) bool isMarketingEmail = e.Message.Subject.Contains("营销") || e.Message.From.Address.EndsWith("@your-market-domain.com"); if (isMarketingEmail) { // 添加BCC收件人 e.Message.Bcc.Add(new System.Net.Mail.MailAddress("admin@company.com")); } }
方案2:修正原有数据库插入事件代码(仅适用于直接插入EmailInfo触发发送的场景)
如果营销邮件确实通过插入EmailInfo记录触发发送,可移除冗余的保存操作:
public override void Init() { EmailInfo.TYPEINFO.Events.Insert.Before += Email_Insert_Before; } private void Email_Insert_Before(object sender, ObjectEventArgs e) { var email = e.Object as EmailInfo; if (email != null) { // 直接修改对象属性,系统会自动处理后续保存 email.EmailBcc = "admin@company.com"; } }
注意事项
- 营销邮件场景优先选择方案1,可覆盖所有发送渠道的邮件;方案2仅适用于特定的数据库触发发送流程。
- 识别营销邮件的逻辑需根据业务调整,比如通过邮件模板ID、营销活动ID等精准标识,避免误添加BCC到非营销邮件。
内容的提问来源于stack exchange,提问作者dilip thakuri
相关产品推荐
相关产品推荐

