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

Delphi 7中如何在SMTP邮件正文中嵌入图片?

Delphi 7 + Indy 9 嵌入图片到HTML邮件的正确实现方法

要在HTML邮件里嵌入本地图片,不能直接使用本地磁盘路径,必须把图片作为内嵌附件添加到邮件中,再通过cid:协议在HTML里引用附件的Content-ID。以下是修改后的完整可运行代码:

procedure TfmMail.SendMail;
var
  IdMensaje: TIdMessage;
  smtp: TIdSMTP;
  IdAttachment: TIdAttachmentFile; // Indy 9中使用TIdAttachmentFile处理文件附件
  HtmlBody: string;
begin
  IdMensaje := TIdMessage.Create(nil);
  try
    IdMensaje.Clear;
    // 核心设置:将邮件设为多部分关联类型,支持内嵌资源
    IdMensaje.ContentType := 'multipart/related';
    IdMensaje.From.Text := '发件人名称 <your-email@domain.com>'; // 遵循邮件地址规范格式
    IdMensaje.Subject := '邮件主题';

    // 构建HTML正文,用cid标记引用内嵌图片
    HtmlBody := '<html><body>';
    HtmlBody := HtmlBody + '<p>greeting</p>';
    // cid值需与附件的ContentID对应,此处设为my_embedded_image
    HtmlBody := HtmlBody + '<p><img src="cid:my_embedded_image"></p>';
    HtmlBody := HtmlBody + '<p>Other text to body</p>';
    HtmlBody := HtmlBody + '</body></html>';

    // 将HTML内容作为单独部分添加到邮件中
    with TIdText.Create(IdMensaje.MessageParts, nil) do
    begin
      Body.Text := HtmlBody;
      ContentType := 'text/html; charset=utf-8'; // 指定编码避免乱码
    end;

    // 添加内嵌图片附件
    IdAttachment := TIdAttachmentFile.Create(IdMensaje.MessageParts, 'C:\Foo\image.png');
    // 设置ContentID,必须包含尖括号,与HTML中的cid对应
    IdAttachment.ContentID := '<my_embedded_image>';
    // 标记为内嵌资源,而非普通下载附件
    IdAttachment.Disposition := 'inline';

    // 补充SMTP发送逻辑(原代码缺失部分)
    smtp := TIdSMTP.Create(nil);
    try
      smtp.Host := 'smtp.yourdomain.com'; // 替换为你的SMTP服务器地址
      smtp.Port := 25; // 非SSL端口,SSL场景用465或587
      // 若需身份认证,取消以下注释并填写账号信息
      // smtp.AuthenticationType := atLogin;
      // smtp.Username := 'your-email-account';
      // smtp.Password := 'your-email-password';
      smtp.Connect;
      smtp.Send(IdMensaje);
      smtp.Disconnect;
    finally
      smtp.Free;
    end;
  finally
    IdMensaje.Free;
  end;
end;

关键注意事项:

  • 不能直接将邮件ContentType设为text/html,必须改为multipart/related,这是支持内嵌资源的多部分邮件标准类型。
  • 附件的ContentID必须包含尖括号,HTML中的cid:引用要去掉尖括号,两者需严格对应。
  • 附件的Disposition设为inline,明确告知邮件客户端该资源是内嵌显示,而非可下载的普通附件。
  • 原代码直接修改IdMensaje.Body.Text的方式不适用于多部分邮件,需通过TIdText将HTML内容添加到MessageParts集合中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:54:24