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

C#发送100MB邮件附件时出现System.OutOfMemoryException问题求助

解决C#发送大邮件附件时的System.OutOfMemoryException异常

咱们先理清问题根源:你碰到的System.OutOfMemoryException和你在web.config里加的配置没关系——那些maxRequestLength和maxAllowedContentLength是用来限制客户端向服务器上传文件的请求大小的,而你现在是服务器本地读取文件作为邮件附件发送,这些配置完全不影响这个场景。真正的问题是:默认的Attachment构造函数会把整个文件一次性加载到内存中,100MB的文件加上.NET运行时的内存开销,很容易就触发内存不足的异常,12MB的文件内存吃得下,所以能正常发送。

核心解决方案:流式处理大文件

改用FileStream来创建附件,让邮件客户端从流中逐步读取文件内容,而不是一次性把整个文件加载到内存里。修改后的代码如下:

using (var sendemail = new SmtpClient())
{
    // 此处填写SMTP主机、收件人地址等配置代码
    sendemail.Timeout = 500000;

    // 使用FileStream流式读取大文件,避免内存过载
    using (var fileStream = new FileStream(@"C:\data.zip", FileMode.Open, FileAccess.Read))
    {
        // 显式指定附件的文件名和MIME类型,确保邮件客户端正确识别
        var attachment = new Attachment(fileStream, "data.zip", MediaTypeNames.Application.Zip);
        msg.Attachments.Add(attachment);
        sendemail.Send(msg);
    }
}

额外优化建议

  • 如果你的项目基于.NET Framework 4.5及以上版本,建议使用SendMailAsync异步发送邮件,这样既不会阻塞主线程,也能让.NET的内存管理更高效:
    // 替换sendemail.Send(msg);为异步版本
    await sendemail.SendMailAsync(msg);
    
  • 如果你是在IIS上运行的Web应用,检查一下应用程序池的内存限制:打开IIS管理器 → 应用程序池 → 你的应用池 → 高级设置,确保“私有内存限制”不要设置得太小,避免应用池因为内存占用过高被回收。
  • 可以考虑给附件设置合适的TransferEncoding,比如TransferEncoding.Base64(这是邮件附件的标准编码方式),进一步优化传输效率:
    attachment.TransferEncoding = TransferEncoding.Base64;
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:31:24