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
相关产品推荐
相关产品推荐

