使用ASP.NET发送附带已调整尺寸图片的邮件
解决将处理后的图片作为邮件附件的问题
嘿,我来帮你搞定这个问题!你现在的核心问题是还在使用原上传文件的流创建附件,而不是你通过Graphics处理后的缩放图片。而且Graphics对象本身不是可直接保存/作为附件的图片资源,你需要把处理后的newImage(也就是那个200x200的Bitmap)转换成流,再用这个流来创建邮件附件。另外保存到本地失败大概率是权限或者目录不存在的问题,我也一起给你解决。
问题分析
你当前代码里的Attachment myAttachment = new Attachment(FileUpload1.FileContent, fileName);还是在引用原上传文件的内容,完全没用到你缩放后的newImage。而且直接用g.Save()是行不通的,因为g是绘图上下文,不是图片本身,你应该调用newImage.Save()。
修改后的完整代码
using (var bmp = new Bitmap(FileUpload1.PostedFile.InputStream)) using (var newImage = new Bitmap(200, 200)) using (var g = Graphics.FromImage(newImage)) { // 绘制缩放后的图片 g.DrawImage(bmp, 0, 0, 200, 200); // 将处理后的图片保存到内存流中 using (var ms = new MemoryStream()) { newImage.Save(ms, ImageFormat.Jpeg); // 指定保存格式,这里用JPEG ms.Seek(0, SeekOrigin.Begin); // 重置流的位置到开头,否则附件会是空的 // 创建处理后的图片作为附件 string fileName = $"resized_{Path.GetFileName(FileUpload1.PostedFile.FileName)}"; var myAttachment = new Attachment(ms, fileName, "image/jpeg"); mail.Attachments.Add(myAttachment); } } // 关于本地保存失败的解决方法: // 1. 先检查目标目录是否存在,不存在则创建 string savePath = @"c:\Temp"; if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); } // 2. 确保程序有该目录的写入权限(如果是IIS运行,要给IIS_IUSRS用户权限) newImage.Save(Path.Combine(savePath, "test.jpg"), ImageFormat.Jpeg);
关键注意点
- 用
using语句包裹所有实现IDisposable的对象(Bitmap、Graphics、MemoryStream等),避免资源泄漏。 - 保存到
MemoryStream后必须调用ms.Seek(0, SeekOrigin.Begin),因为保存后流的指针会停在末尾,不重置的话读取不到内容。 - 创建
Attachment时指定MIME类型(image/jpeg),确保邮件客户端能正确识别附件类型。 - 本地保存失败时,优先检查:
- 目标目录是否存在(用
Directory.CreateDirectory确保存在) - 运行程序的账户是否有该目录的写入权限(比如IIS站点的应用池账户)
- 目标目录是否存在(用
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

