使用MailKit BodyBuilder嵌入图片却变为附件的问题求助
问题解决:内嵌图片变附件的原因及修复
你的代码核心问题是HTML里的CID引用没有使用实际生成的ContentId值,而是写了变量名的字符串字面量,导致邮件客户端无法匹配到内嵌资源,只能把图片当成附件处理。
修正步骤:
- 先添加图片资源并生成ContentId,再用这个实际的ID构建HTML内容,确保
<img>的cid:后面是真实的资源ID。 - 其实
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
相关产品推荐
相关产品推荐

