在 Delphi 中生成带有嵌入图像的 HTML 电子邮件

Posted

技术标签:

【中文标题】在 Delphi 中生成带有嵌入图像的 HTML 电子邮件【英文标题】:Generate HTML e-mail with embedded images in Delphi 【发布时间】:2010-12-06 20:35:41 【问题描述】:

谁知道生成带有嵌入图像和替代文本部分的 html 电子邮件的好例子?我需要在 HTML 中生成一些表格报告,并希望嵌入徽标和其他图像。

我相信 Indy 可以通过一些工作来做到这一点,但我希望有人能给我指出一个很好的例子作为起点。我愿意使用 Indy 以外的库和商业解决方案,只要源代码可用。质量和实施时间比成本更重要。该解决方案还需要支持基于 SMTP 的邮件交换器传递。

我的愿望清单上的另一个项目是能够利用 FastReports、TRichView 或类似工具来生成 HTML 消息内容。两者都有可用的 HTML 输出过滤器,但我没有机会进行任何测试。对此主题的任何反馈将不胜感激。

提前致谢!

大卫

【问题讨论】:

【参考方案1】:

阅读 Indy 网站上的以下文章,它们解释了为 HTML 填充 TIdMesaage 的正确方法:

HTML Messages

New HTML Message Builder class

【讨论】:

Indy MessageBuilder 似乎是要走的路。根据示例,我看到的唯一潜在编码问题是正在从磁盘读取文件。我需要使用流,因为数据和图像存在于数据库中。我会检查来源,看看是否支持其他添加图像的方法,如果不支持,则进行必要的调整。 使用 TIdMessage、TIdText 和 TIdAttachmentMemory,您可以使用流构建消息和附件。 TIdMessageBuilderHtml 支持将 TStream 用于与 HTML 相关的附件数据,例如图像。 TIdMessageBuilderHtml.HtmlFiles 属性为文件名和 TStream 数据重载了 Add() 版本。但是,附加不相关的数据目前还不支持 TStream。 我已经更新了 TIdCustomMessageBuilder.Attachments 属性以支持 TStream 数据。 @Remy - 谢谢,这就行了。我想我需要使用 SVN 的最新代码 :)【参考方案2】:

这些天我使用 Clever Component 的电子邮件客户端,虽然不是免费的。

TurboPower Internet (OpenSource) 控件过去对我非常有用。

【讨论】:

谢谢,我已经好几年没看他们的组件了。 Clever Component 的功能确实非常丰富,但价格有点高,除非你真的需要一些高级功能。【参考方案3】:
function data64(const filename:string): ansistring;
// uses Classes, IdGlobalProtocols, EncdDecd;
const
  crlf = #13#10;
begin
  result := '';
  with TIdMimeTable.Create do
  try
    result := 'data:'
      + GetFileMIMEType(filename) + ';';
  finally
    Free;
  end;
  with TMemoryStream.Create do
  try
    LoadFromFile(filename);
    result := result + 'base64,' + crlf
      + EncodeBase64(Memory,Size);
  finally
    Free;
  end;
end;

【讨论】:

【参考方案4】:

我们在几年前尝试过使用 Indy 和嵌入式 cid: 图像,如下所示: https://forums.codegear.com/thread.jspa?threadID=17473

我们从来没有让它稳定,每次都有另一个邮件阅读器出现问题(如果我们让它在 Outlook 中工作,那么 Thunderbird 不接受它,或者 Outlook Express,或者,等等)。

最后,我们使用 .NET 使用 AspNetEmail 完成了它,它就像一个魅力。

--杰罗恩

【讨论】:

你有没有比较过 Indy 生成的邮件和 AspNetEmail 生成的邮件,看看它们之间有什么不同? 几年前我们做到了。但由于项目压力,我们没有做笔记。该项目存在了几年,但现在已经死了。所以今天,它也可以与 Indy 一起使用。【参考方案5】:

这完全取决于您必须能够支持多少不同的远程邮件客户端。我相信支持 SMTP/Mime 的知名 Delphi 库会做得很好,但是当您的一个邮件用户发现他们的收件人看不到格式正确的电子邮件时,它们可能会给您带来支持问题。

我建议您访问 Jacob Palme 的 site,它会让您了解您可能遇到的一些问题。它可能有点过时,但总而言之,无论您如何构建和发送复杂的 MIME 电子邮件,您都会遇到一个或多个无法正确处理语法的邮件客户端。该网站还提供了一些有用的结构示例的链接,您可以检查和测试这些示例。

我并不是要暗示您必须像我们一样采用自己的逻辑:一个好的打包解决方案可能会在绝大多数情况下取得成功。几年前,我们编写了自己的 Delphi 代码来处理这个问题,所以我将把它留给其他人,以便为您提供有关现在货架上的最新信息。

【讨论】:

以上是关于在 Delphi 中生成带有嵌入图像的 HTML 电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

在视图而不是模板中生成带有 Django 静态 url 的图像标签

如何在 Delphi 中将带有图像的 RichText (RTF) 文档转换为 HTML?

在 PHP 中生成带有动态图像的 ODT 文档

如何在JSP网页中生成动态图表

如何在php中生成自定义图像?

如何不在 Python、Django 中生成两次相同的动态图像?