VBA发送Outlook邮件时图片无法嵌入正文仅显示为附件的问题
问题解决:邮件内嵌图片显示为附件的修正方案
你的代码核心问题是内嵌图片的CID(内容ID)未正确关联附件,加上几处冗余/错误操作导致图片无法嵌入正文,以下是修正后的代码及说明:
错误点分析
- 重复创建Outlook邮件对象,属于冗余操作
- 仅添加图片附件但未指定其ContentID,HTML中的
cid:无法匹配到附件 - HTMLBody拼接时错误追加了原邮件的默认内容(如签名),打乱了结构
修正后的代码
Public Sub CommandButton8_Click() ' 发送确认邮件 Dim outApp As Object Dim OutMail As Object Dim Attchmnt As String, strbody As String Dim imgAttachment As Object Dim cid As String ' 初始化Outlook对象 Set outApp = CreateObject("Outlook.Application") Set OutMail = outApp.CreateItem(0) Attchmnt = "c:\Users\bradb\OneDrive\Desktop\SWC-Logo.png" cid = "SWC-Logo.png" ' 要和HTML中的cid完全一致 ' 构建邮件正文HTML strbody = "<BODY style='font-size:18pt;font-family:Calibri'>" & _ "Hello " & Registration.TextBox2.Value & ", <p>" & _ "Please verify your squad selection and average division,<br>" & _ "And please reply with correct information if an error is found.<p>" & _ "Squad: " & Registration.ComboBox1.Value & " <br> " & _ "Average: " & Registration.TextBox9.Value & " <br> " & _ "Division: " & Registration.TextBox10.Value & " <p> " & _ "Thank You.<br>" & _ "<img src=""cid:" & cid & """ height=69 width=216><br>" & _ "Brad Bylls <br>" & _ "Tournament Manager</BODY>" With OutMail .To = Registration.TextBox7.Value .CC = "" .BCC = "" .Subject = "Tournament Confirmation" ' 添加图片附件并设置ContentID Set imgAttachment = .Attachments.Add(Attchmnt, 1) ' 1=olByValue ' 设置附件的ContentID,匹配HTML中的cid imgAttachment.PropertyAccessor.SetProperty "http://schemas.microsoft.com/mapi/proptag/0x3712001F", cid .HTMLBody = strbody & .HTMLBody ' 把默认签名(如果有)加到正文末尾 .Send MsgBox "邮件已发送" End With ' 释放对象 Set OutMail = Nothing Set outApp = Nothing Set imgAttachment = Nothing End Sub
关键修改说明
- 指定ContentID:通过
PropertyAccessor.SetProperty为图片附件设置唯一的ContentID,确保HTML中的cid:能精准匹配到该附件,让邮件客户端识别为内嵌图片而非普通附件 - 移除冗余的邮件对象创建:删除重复的
Set OutMail = outApp.CreateItem(0),避免覆盖之前的对象 - 调整HTML结构:把图片标签直接整合到strbody中,逻辑更清晰;最后追加
.HTMLBody保留Outlook默认签名(不需要可以去掉) - 变量声明修正:原代码中
Attchmnt未显式声明为String,修正为Dim Attchmnt As String, strbody As String,避免变体类型潜在问题
额外提示
如果OneDrive路径导致图片无法读取,可以先把图片复制到本地非同步文件夹,再修改路径测试,避免同步延迟影响附件加载。
内容的提问来源于stack exchange,提问作者BradB
相关产品推荐
相关产品推荐

