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

使用MailKit BodyBuilder嵌入图片却变为附件的问题求助

问题解决:内嵌图片变附件的原因及修复

你的代码核心问题是HTML里的CID引用没有使用实际生成的ContentId值,而是写了变量名的字符串字面量,导致邮件客户端无法匹配到内嵌资源,只能把图片当成附件处理。

修正步骤:

  1. 先添加图片资源并生成ContentId,再用这个实际的ID构建HTML内容,确保<img>的cid:后面是真实的资源ID。
  2. 其实LinkedResources默认就是内嵌类型,不需要手动设置ContentDisposition = Inline(当然设置也没问题,不是关键问题)。

修正后的完整代码:

Dim clsSMTP = New MailKit.Net.Smtp.SmtpClient
clsSMTP.Connect("smtp.gmail.com", 587, False)
clsSMTP.Authenticate("xxxxxxxx@gmail.com", "xxxxxxxxxx")

' 先初始化BodyBuilder并添加图片资源,获取ContentId
Dim bdyBuild = New BodyBuilder
Dim strPathIntro = "C:/Users/xxx/xxxxx/Images/xxxxxxxxxx.jpg"
Dim mptIntro = bdyBuild.LinkedResources.Add(strPathIntro)
mptIntro.ContentId = MimeKit.Utils.MimeUtils.GenerateMessageId()

' 用实际生成的ContentId构建HTML内容
Dim strMessage = "<!DOCTYPE html><html><body style='font-family:Verdana,Arial,Tahoma,Calibri,Neue Helvetica;font-size:11pt;font-weight:normal;font-style:italic'>" _
& "<table><tr><td style='width:300px'><img src='cid:" & mptIntro.ContentId & "' style='width:300px'/></td><td>    </td>" _
& "<td><h1 style='font-size:16pt;font-weight:bold;'>Time for an Advent Study</h1></td></tr></table>"

Dim strMember = "Me"
Dim strAttendeeEmail = "me@att.net"

Dim mmgSpecial As New MimeMessage()
mmgSpecial.From.Add(New MailboxAddress("xxx xxxxx xxxxx", "xxxxxxxxx@gmail.com"))
mmgSpecial.To.Add(New MailboxAddress(strMember, strAttendeeEmail))
mmgSpecial.Subject = "Study Ideas"
bdyBuild.HtmlBody = strMessage
mmgSpecial.Body = bdyBuild.ToMessageBody()

clsSMTP.Send(mmgSpecial)
clsSMTP.Disconnect(True) ' 记得断开连接

关键说明:

  • 代码顺序调整:先处理图片资源拿到ContentId,再拼接HTML,这样<img src='cid:" & mptIntro.ContentId & "'>才能正确引用到内嵌资源的ID。
  • 原代码中cid:mptIntro.ContentId是字符串,不是变量值,客户端找不到对应CID的资源,就会把图片当作附件显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:35:26