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

.NET 4.7.1+SendGrid SMTP内嵌邮件附件发送异常求助

解决.NET 4.7.1中SendGrid SMTP内嵌附件失效问题

针对切换SendGrid SMTP后遇到的内嵌图片异常问题,核心原因有两点:磁盘文件缓存导致读取旧内容,以及未正确设置附件的ContentId关联HTML中的CID。以下是具体解决方案:

问题1:磁盘文件缓存读取旧内容

你的代码将内嵌附件写入磁盘后再读取,当多请求并发或文件系统存在缓存时,会出现读取到已删除旧图片的情况。直接用内存流处理,完全跳过磁盘IO即可解决该问题。

问题2:SendGrid需要显式关联CID

SendGrid SMTP对内嵌资源的CID匹配要求严格,必须显式设置Attachment.ContentId属性,仅靠文件名匹配无法被正确识别。

修改后的代码片段

替换原代码中内嵌附件的处理逻辑:

foreach (var attachment in attachments.Where(a => a.Inline))
{
    // 直接用内存流处理,跳过磁盘写入
    using (var ms = new MemoryStream(attachment.Content))
    {
        var att = new System.Net.Mail.Attachment(ms, attachment.FileName);
        att.ContentDisposition.Inline = true;
        att.ContentDisposition.DispositionType = DispositionTypeNames.Inline;
        // 显式设置ContentId,和HTML中的cid完全一致
        att.ContentId = attachment.FileName;
        // 可选:设置MIME类型,确保邮件客户端正确识别图片格式
        att.ContentType.MediaType = $"image/{Path.GetExtension(attachment.FileName).TrimStart('.')}";
        message.Attachments.Add(att);
    }
}

额外注意事项

  • 确保HTML中的cid:Email-Logo-USA.jpg和ContentId完全一致(部分邮件客户端区分大小写)
  • 移除原代码中创建目录和写入文件的逻辑,避免不必要的磁盘操作
  • 若问题仍存在,检查SendGrid后台SMTP配置,确认内嵌资源未被过滤

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:02:12