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

