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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:27:52