C#向管理员列表发邮件异常:删除用户后邮件未送达
问题:用户删除账户时管理员收不到通知邮件
功能需求
我要实现的功能很简单:当用户从站点删除账户时,向该站点的管理员列表发送邮件通知。
相关代码
EmailService
public MailMessage SendRemoveUserCompanyEmail(User user, List<User> admins, Company company, bool onParallelThread = true) { MailMessage mail = new MailMessage(); mail.From = new MailAddress(_configurationService.EmailFrom); foreach (string email in admins.Select(u => u.Email)) { mail.To.Add(email); } mail.Subject = $"{_configurationService.AppName} - Closed account"; mail.IsBodyHtml = true; SetupImageEmail(mail, _TEMPLATE_MAIL_RESET_PASSWORD_IMAGE, out string imageContentID); string mailMessage = _fileService.GetTemplateMail(_TEMPLATE_MAIL_REMOVE_USER_COMPANY); mailMessage = mailMessage.Replace("##IMAGE_URL##", imageContentID); mailMessage = mailMessage.Replace("##COMPANY_NAME##", company.Name); mailMessage = mailMessage.Replace("##USER_NAME##", user.Name); mailMessage = mailMessage.Replace("##USER_SURNAME##", user.Surname); mailMessage = mailMessage.Replace("##PORTAL_URL##", _configurationService.BaseDomainClient); mailMessage = mailMessage.Replace("##PORTAL_NAME##", _configurationService.AppName); mail.Body = mailMessage; this.SendEmail(mail, onParallelThread); return mail; }
UserService
public void DeleteUserCompany(User user, bool sendRejectMessage) { int? FK_Company = user.FK_Company; user.FK_Company = null; user.Company = null; user.Status = Status.FREE; UpdateEntityProperties(user, true, new string[] { "FK_Company", "Company", "Status" }); Company company = null; if (FK_Company.HasValue) { company = _companyService.Get(FK_Company.Value); } if (sendRejectMessage) { _emailService.SendStopCollaborationEmail(user, company); _notificationService.SendNotification("Collaborazione interrotta Centro di assistenza", "Closed account", FK_Company, null, new List<int> { user.ID }); } else { if (FK_Company.HasValue) { List<User> admins = _ctx.Users.Where(u => u.FK_Company == FK_Company && u.Role == Role.ADMIN).ToList(); _emailService.SendRemoveUserCompanyEmail(user, admins, company); } } }
问题现状
目前的问题是管理员收不到邮件:MailMessage的To列表已正确填充,返回的mail对象中To字段显示正常,但最终管理员并未收到邮件。已确认邮箱地址无误,且邮件未被标记为垃圾邮件。
排查建议
- 检查
SendEmail方法的异步逻辑:如果用了Task.Run这类异步方式,有没有未捕获的异常?异步线程的异常会导致发送失败但主线程无感知,建议在异步方法里添加异常捕获和日志记录。 - 验证SMTP配置:确认SMTP服务器地址、端口、认证信息(用户名/密码)是否正确,是否需要启用SSL,有些服务器要求必须用SSL连接。
- 检查邮件模板内容:查看
_TEMPLATE_MAIL_REMOVE_USER_COMPANY模板是否包含触发反垃圾机制的内容,比如过多的外部链接、敏感词汇,或者HTML结构不规范(比如未闭合标签)。 - 测试同步发送:调用
SendRemoveUserCompanyEmail时传入onParallelThread=false,用同步方式发送邮件,排除异步线程的问题。 - 检查
SetupImageEmail方法:内嵌图片的过程中是否导致邮件格式损坏?比如图片资源不存在、ContentID设置错误,部分邮件客户端会因为格式问题拒收邮件。 - 添加发送日志:在
SendEmail方法中记录SMTP服务器的响应信息、发送状态,比如是否成功提交邮件,服务器返回的错误码是什么,这能直接定位问题所在。
内容的提问来源于stack exchange,提问作者Jany
相关产品推荐
相关产品推荐

