【问题标题】:Delphi - Using resource in Email rather than imageDelphi - 在电子邮件中使用资源而不是图像
【发布时间】:2022-01-20 11:05:10
【问题描述】:

在 Delphi 中,我使用以下代码在 HTML 中创建电子邮件以在消息中显示签名:

cMsg:= cMsg + ' <img src="BarrysSignature.jpg" '>

这意味着我需要在当前目录中提供.jpg(并将其与可执行文件一起分发)。

我还在程序的其他地方使用了这些相同的签名.jpg 文件,但我已将它们作为资源加载。如果我在电子邮件中使用签名资源而不是外部.jpg 图片,那么电子邮件中会更好。

我已经尝试了几种方法来做到这一点,但无法让它发挥作用。请问有什么想法吗?

【问题讨论】:

  • 请用实际描述替换“几种方式”。

标签: email delphi outlook indy


【解决方案1】:

在 Outlook 中,您需要将资源提取到一个临时文件中,将图像添加为附件,设置其PR_ATTACH_CONTENT_ID MAPI 属性,然后删除该文件。您的 HTML 正文需要通过其内容 ID 引用图像,例如&lt;img src="cid:xyz"&gt;,其中“xyz”是PR_ATTACH_CONTENT_ID 属性的值。

Including Pictures in an Outlook Email

【讨论】:

    【解决方案2】:

    类似于@Dmitry's answer,在 Indy 中,您还需要将图像数据附加到电子邮件(TIdMessage 组件),分配附件的 Content-ID 标头(TIdMessagePart.ContentID 属性),然后参考该 ID 在 HTML 中使用 cid: URL 在需要的地方。

    有关如何执行此操作,请参阅 Indy 网站上的这些博客文章:

    HTML Messages

    New HTML Message Builder class

    不过,我确实想提一件事。在文章中谈到使用TIdAttachmentFile 作为附件的地方,实际上在这种情况下您根本不需要将图像资源保存到临时文件中。您也可以从TIdAttachment 派生您自己的类(我们称之为TIdAttachmentResource),并让它覆盖虚拟OpenLoadStream()CloseLoadStream() 方法以分别将TResourceStream 返回/释放到您的资源数据(请参阅TIdAttachmentFileTIdAttachmentMemory 的源代码示例)。然后您可以根据需要简单地将TIdAttachmentResource 对象添加到TIdMessage.MessageParts 集合中,Indy 将能够直接使用图像资源对电子邮件进行编码,无需文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-26
      • 2017-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      • 2017-06-26
      • 1970-01-01
      相关资源
      最近更新 更多