C# Azure Function如何内存生成CSV作为邮件附件
无落盘内存生成CSV实现方案
CsvHelper本身不依赖文件系统,只需要将原代码中写入文件的流替换为内存流,即可实现完全内存态的CSV生成,适配Azure Function无本地磁盘依赖的运行场景。
核心改造代码
using var memoryStream = new MemoryStream(); // 传入leaveOpen: true参数,避免StreamWriter释放时连带关闭内存流 using (var writer = new StreamWriter(memoryStream, Encoding.UTF8, leaveOpen: true)) using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { // 原有CSV写入逻辑完全不需要改动 foreach (var row in content) { foreach (var col in row) { csv.WriteField(col); } csv.NextRecord(); } // 主动刷写Writer缓冲区,确保所有CSV内容都写入内存流 writer.Flush(); } // 将内存流指针重置到起始位置,后续读取流内容时才能拿到完整数据 memoryStream.Position = 0;
邮件附件对接方式
拿到上述生成好的memoryStream后,可以直接作为附件流传入邮件发送逻辑,不需要做任何磁盘写入操作:
- 如果使用.NET原生
System.Net.Mail类库发信,直接构造附件即可:
var mailMessage = new MailMessage(); // 传入内存流、附件文件名、MIME类型 var csvAttachment = new Attachment(memoryStream, "错误记录导出.csv", "text/csv"); mailMessage.Attachments.Add(csvAttachment); // 后续执行邮件发送逻辑即可
- 如果使用MailKit、SendGrid等第三方邮件SDK,所有主流SDK都支持直接传入Stream对象作为附件源,调用对应附件构造方法传入流即可。
Azure Function运行注意事项
- 消费计划Azure Function的本地临时磁盘有存储配额限制,内存生成CSV的方式完全规避了磁盘配额不足、文件读写权限异常、临时文件残留等问题。
- 内存流的释放时机要放在邮件发送完成之后,建议用
using声明包裹从流生成到邮件发送完成的全链路逻辑,避免内存泄漏。 - 如果CSV内容包含非英文字符,记得在初始化
StreamWriter时指定UTF-8编码,避免客户端打开附件出现乱码。
内容的提问来源于stack exchange,提问作者PPPP
相关产品推荐
相关产品推荐

