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
相关产品推荐
相关产品推荐

