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

C#脚本向大型邮件分发列表发件失败,无错误信息求排查

针对大邮件分发列表发送失败问题的解决方案

一、获取详细失败原因的方法

  • 增强异常捕获细节:当前代码仅捕获异常的Message属性,SMTP相关错误的核心信息(如服务器状态码、内部异常堆栈)都被遗漏。修改异常捕获逻辑,打印完整错误内容:
    catch (SmtpException sex)
    {
        string errorDetails = $"SMTP错误: {sex.Message}\n状态码: {sex.StatusCode}\n内部异常: {sex.InnerException?.ToString()}";
        Console.WriteLine(errorDetails);
        mailStatus += $"FAILED to send mail - {errorDetails}\n";
    }
    catch (Exception ex)
    {
        string errorDetails = $"通用错误: {ex.Message}\n堆栈跟踪: {ex.StackTrace}\n内部异常: {ex.InnerException?.ToString()}";
        Console.WriteLine(errorDetails);
        mailStatus += $"FAILED to send mail - {errorDetails}\n";
    }
    
  • 改用异步发送捕获更多响应:同步Send方法在网络延迟或服务器静默拒绝场景下可能吞掉错误,异步方式能监听完整的发送状态:
    // 替换原同步Send代码块
    using (var smtp = new System.Net.Mail.SmtpClient(mailClient))
    {
        var resetEvent = new System.Threading.ManualResetEvent(false);
        smtp.SendCompleted += (sender, e) =>
        {
            if (e.Error != null)
            {
                string errorDetails = $"异步发送失败: {e.Error.Message}\n堆栈: {e.Error.StackTrace}\n内部异常: {e.Error.InnerException?.ToString()}";
                Console.WriteLine(errorDetails);
                mailStatus += $"FAILED to send mail - {errorDetails}\n";
            }
            else if (e.Cancelled)
            {
                Console.WriteLine("发送被取消");
                mailStatus += "FAILED to send mail - 发送被取消\n";
            }
            else
            {
                Console.WriteLine("邮件发送成功");
            }
            resetEvent.Set();
        };
        smtp.SendAsync(message, null);
        resetEvent.WaitOne(); // 等待发送流程结束
    }
    
  • 查询服务器端日志:联系邮件管理员,调取服务器针对你的发件地址的SMTP日志。服务器会记录收件人数量超限、分发列表展开失败、反垃圾规则拦截等细节,这些信息客户端无法直接获取。

二、关于服务器收件数量限制的可能性

是的,多数邮件服务器会区分客户端(如Outlook)发件和程序/脚本发件的限制策略:

  • Outlook通常使用MAPI/Exchange协议,服务器对这类客户端的收件人上限设置较高;而你的代码使用SMTP协议,服务器可能设置了更低的单封邮件收件人阈值(比如20个),刚好28人的分发列表触发了限制。
  • 验证方法:把28人的收件列表拆分成多个小批次(比如每10个一组)分别发送。如果小批次能成功发送,即可确认是数量限制导致的问题。

三、额外排查点

  • 检查分发列表处理逻辑:Outlook发送时会自动展开分发列表为单个收件人,而你的代码如果直接将分发列表地址作为单个收件人发送,服务器在展开列表时可能触发限制。可尝试手动展开分发列表为单个邮箱地址后再发送。
  • 验证邮件整体大小:如果附件较大,加上28个收件人可能导致邮件总大小超过服务器限制,可移除附件后测试发送。

内容的提问来源于stack exchange,提问作者Michele

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:37:03