You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 12:13:10