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

