使用Mailkit发送Xlsio生成的Excel附件时格式无效问题求助
问题分析与解决方案
核心问题
- 格式与扩展名不匹配:你用
ExcelSaveType.SaveAsXLS生成的是旧版二进制Excel(.xls格式),但文件名和ContentType都配置为.xlsx,导致系统识别错误。 - Stream位置未重置:Workbook保存到Stream后,指针停留在末尾,后续读取时无法获取完整文件内容。
- 附件加载方式冗余易出错:
MimeEntity.Load搭配ReadAsBytes()的操作没必要,且容易因Stream状态问题导致数据损坏。
修复步骤
1. 统一Excel格式与扩展名
如果要生成.xlsx文件,修改保存类型为ExcelSaveType.SaveAsXLSX,同时重置Stream指针:
FileStream stream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite); // 用SaveAsXLSX匹配.xlsx扩展名 workbook.SaveAs(stream, ExcelSaveType.SaveAsXLSX); // 重置Stream指针到开头,确保后续读取完整内容 stream.Position = 0; FileAttachementDto file = new() { FileName = fileName, // 确保fileName后缀为.xlsx File = stream };
如果需要保留.xls格式,需将文件名后缀改为.xls,并把ContentType调整为application/vnd.ms-excel。
2. 简化附件添加逻辑
直接通过BodyBuilder.Attachments.Add方法添加,无需额外的MimeEntity.Load操作:
// 再次确认Stream指针在开头 myFile.File.Position = 0; // 添加附件,自动匹配对应ContentType bodyBuilder.Attachments.Add(myFile.FileName, myFile.File);
也可手动指定ContentType(需与文件格式严格匹配):
myFile.File.Position = 0; var contentType = new ContentType("application", "vnd.openxmlformats-officedocument.spreadsheetml.sheet"); bodyBuilder.Attachments.Add(myFile.FileName, myFile.File, contentType);
关键注意事项
- 必须保证保存格式、文件名后缀、ContentType三者一致:
- .xlsx对应:
ExcelSaveType.SaveAsXLSX+application/vnd.openxmlformats-officedocument.spreadsheetml.sheet - .xls对应:
ExcelSaveType.SaveAsXLS+application/vnd.ms-excel
- .xlsx对应:
- 任何从Stream读取数据的操作前,都要执行
Position = 0,避免读取空内容或不完整数据。
内容的提问来源于stack exchange,提问作者Vincent Ducroquet
相关产品推荐
相关产品推荐

