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

Excel VBA通过CDO发送Gmail时内嵌图片无法显示问题求助

解决CDO.Message邮件内嵌图片显示为附件的问题

你的问题核心是没有正确标记附件为HTML邮件的内嵌资源,直接用AddAttachment会把文件识别为普通附件,而非内嵌到邮件内容里的关联资源。以下是两种可行的解决方法:

方法1:使用AddRelatedBodyPart(推荐)

CDO.Message提供了专门用于添加HTML内嵌资源的AddRelatedBodyPart方法,它会自动将资源标记为内嵌,不会显示为独立附件。

把你代码中的AddAttachment行替换为:

NewMail.AddRelatedBodyPart "C:\Users\bradb\OneDrive\Desktop\SWC-Signature.png", "SWC-Signature.png", 0

第二个参数就是HTML中cid:对应的标识,和你现有代码里的<img src='cid:SWC-Signature.png'>完全匹配即可。

方法2:修正AddAttachment的用法

如果坚持用AddAttachment,需要手动设置附件的ContentID和显示方式为inline(内嵌):

Dim imgAttachment As Object
Set imgAttachment = NewMail.AddAttachment("C:\Users\bradb\OneDrive\Desktop\SWC-Signature.png")
' 设置ContentID,注意要加<>
imgAttachment.Fields("urn:schemas:mailheader:content-id") = "<SWC-Signature.png>"
imgAttachment.Fields.Update
' 设置附件显示方式为内嵌
imgAttachment.Configuration.Fields.Item("urn:schemas:mailheader:content-disposition") = "inline"
imgAttachment.Configuration.Fields.Update

此时HTML中的cid可以写成cid:SWC-Signature.png(无需<>),和设置的ContentID对应。

完整修改后的代码(方法1示例)

Dim NewMail As Object
Dim mailConfig As Object
Dim fields As Variant
Dim msConfigURL, StrBody As String

On Error GoTo Err:

' late binding
Set NewMail = CreateObject("CDO.Message")
Set mailConfig = CreateObject("CDO.Configuration")

' 加载默认配置
mailConfig.Load -1

Set fields = mailConfig.fields

StrBody = "Hello " & TextBox2.Value & ", <p> " & _
            "请确认你的队伍选择和平均分组,<br>" & _
            "如果发现错误,请回复正确信息。<p>" & _
            "队伍: " & ComboBox1.Value & ", <br> " & _
            "平均成绩: " & TextBox9.Value

' 设置邮件属性
With NewMail
    .From = "brad.bylls@swcbowl.com"  ' 发件人邮箱
    .To = TextBox7.Value
    .CC = ""
    .BCC = ""
    .Subject = "40 Frame Game Tournament Confirmation  " & Format(Date, "m/d/yy")
    ' 添加内嵌图片资源
    .AddRelatedBodyPart "C:\Users\bradb\OneDrive\Desktop\SWC-Signature.png", "SWC-Signature.png", 0
    .HTMLBody = "<HTML><BODY style=font-size:18pt; font-family:Arial;>" & StrBody & _
    "<img src='cid:SWC-Signature.png' width='375'>" & _
    "<p>谢谢<br>Brad Bylls<br>赛事经理</p></BODY></HTML>"
End With

msConfigURL = "http://schemas.microsoft.com/cdo/configuration"

With fields
    .Item(msConfigURL & "/smtpusessl") = True             ' 启用SSL认证
    .Item(msConfigURL & "/smtpauthenticate") = 1          ' 启用SMTP认证
    .Item(msConfigURL & "/smtpserver") = "smtp.gmail.com" ' SMTP服务器地址
    .Item(msConfigURL & "/smtpserverport") = 465          ' SMTP端口
    .Item(msConfigURL & "/sendusing") = 2                 ' 使用默认发送设置
    .Item(msConfigURL & "/sendusername") = "brad.bylls@swcbowl.com" ' 邮箱账号
    .Item(msConfigURL & "/sendpassword") = "**** **** **** ****"
    .Update                                               ' 更新配置
End With
NewMail.Configuration = mailConfig
NewMail.Send

Err:
' 错误处理逻辑
If Err.Number <> 0 Then
    MsgBox "邮件发送失败:" & Err.Description, vbCritical
End If

注:你代码中的enable_html = True是无效语句,CDO.Message没有该属性,直接设置HTMLBody就会自动识别为HTML格式邮件,可删除该行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 05:39:56