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

C#中MemoryStream生成CSV邮件附件为空问题求助

问题解决:内存生成CSV邮件附件内容为空

问题核心在于内存流的读取位置未重置,且StreamWriter的缓冲区数据未完全写入内存流。以下是具体修正方案:

关键修改步骤

  • 写完CSV内容后,调用tw.Flush()强制将StreamWriter缓冲区的内容刷入内存流
  • 将内存流的位置重置到起始点(memoryStream.Position = 0),确保Attachment能读取到流中的全部内容

修正后的完整代码

MemoryStream memoryStream = new MemoryStream();
TextWriter tw = new StreamWriter(memoryStream);

tw.WriteLine("test,hello");
tw.WriteLine("1234,543");

// 关键操作:刷新缓冲区并重置流位置
tw.Flush();
memoryStream.Position = 0;

Attachment attachment = new Attachment(memoryStream, new ContentType("text/csv"));
attachment.Name = "test.csv";

var Smtp = new SmtpClient();
Smtp.UseDefaultCredentials = false;
var NetworkCredentials = new NetworkCredential() { UserName = "NOPE@gmail.com", Password = "NO" };
Smtp.Port = 587;
Smtp.EnableSsl = true;
Smtp.Host = "smtp.gmail.com";
Smtp.Credentials = NetworkCredentials;

MailMessage msg = new MailMessage();
msg.From = new MailAddress("NAY@gmail.com");
msg.To.Add("X@gmail.com");
msg.Subject = "subject text";
msg.Body = "Attached is a file.";
msg.Attachments.Add(attachment);
Smtp.Send(msg);

优化建议:使用using语句管理资源

用using包裹StreamWriter和MemoryStream,可自动处理资源释放与缓冲区刷新,代码更安全简洁:

using (var memoryStream = new MemoryStream())
{
    using (var tw = new StreamWriter(memoryStream))
    {
        tw.WriteLine("test,hello");
        tw.WriteLine("1234,543");
        tw.Flush();
        memoryStream.Position = 0;

        Attachment attachment = new Attachment(memoryStream, new ContentType("text/csv"));
        attachment.Name = "test.csv";

        // 邮件发送逻辑...
    }
}

内容的提问来源于stack exchange,提问作者Jeffrey Van Laethem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:55:21