【问题标题】:Indy9 does not correctly send HTML when attachments are added添加附件时 Indy9 无法正确发送 HTML
【发布时间】:2023-02-06 15:43:00
【问题描述】:

我们有一个用 Delphi 7 编写的 Windows 服务,它发送包含 HTML 的电子邮件。在我添加附件之前,这工作得很好。添加附件后,HTML 不再显示为 HTML,而是显示为纯文本。

经过一些研究,我发现我必须将邮件内容类型设置为multipart/mixed,但这似乎没有任何改变。我还发现几篇文章表明在添加多种内容类型时必须使用 MessageParts,如下所示:

对于附件,我有以下工作正常的代码。

for I := 0 to slAttachments.Count -1 do
begin
  with TIdAttachment.Create(MailMessage.MessageParts, slAttachments[I]) do
  begin
    ContentType := 'application/pdf';
  end;
end;

如下所示使用 TIdText 在发送后将电子邮件正文留空。调试显示 sMsg 包含正确的 HTML,但它不会随电子邮件一起发送。

MailText := TIdText.Create(MailMessage.MessageParts, nil);
MailText.ContentType := 'text/html';
MailText.Body.Text := sMsg;

如果我直接设置 MailMessage 正文,html 将显示为纯文本。

MailMessage.Body.Text := sMsg;

完整代码:

//setup mail message
MailMessage.From.Address              := msFromAddress;
MailMessage.Recipients.EMailAddresses := sToAddress;
MailMessage.Subject                   := sSubject;
MailMessage.ContentType               := 'multipart/mixed';

// Add Attachments
for I := 0 to slAttachments.Count -1 do
begin
  with TIdAttachment.Create(MailMessage.MessageParts, slAttachments[I]) do
  begin
    ContentType := 'application/pdf';
  end;
end;

// Add HTML
MailText := TIdText.Create(MailMessage.MessageParts, nil);
MailText.ContentType := 'text/html';
MailText.Body.Text := sMsg;

如何发送附件并同时显示 HTML?相同的代码在 Delphi 10 中可以正常工作。由于某些依赖关系,我无法将此项目升级到 Delphi 10。由于重大更改,Indy 也无法升级。

【问题讨论】:

  • Delphi 7 使用 Indy 版本。默认情况下为 9,即非常老的。您可以尝试从标准的 Delphi 7 安装中排除 Indy 9,并将最新的 Indy 10 安装到 Delphi 7。期待一些重大变化。
  • 你读过 Indy 网站上的 HTML Messages 了吗?使用TIdMessage.MessageParts'multipart/mixed' 是正确的,副手代码看起来不错,但是为什么要在 HTML 前面而不是后面添加 PDF?从理论上讲,应该工作,但在实践我会把 HTML 放在前面。
  • 我已经阅读了其中的一部分,但是没有像我应该的那样正确。那是我获得附件等代码的地方。我不知道应该如何构建包含附件和 HTML 的电子邮件。我将尝试交换它,看看会发生什么。我也会阅读整篇文章。
  • @RemyLebeau 我似乎已经明白了。我不确定它为什么有效。因此,正如您所建议的,我先放置 HTML,然后再放置附件。这并没有改变任何东西。仍然收到一封只有附件的空电子邮件。然后我添加了一个带有“测试消息”正文的纯文本 TIdText 和后记另一个 TIdText 但这次是 HTML。查看电子邮件,好像第一个 TIdText 没有被添加或发送。只有第二个。我怀疑这是 Indy10 中修复的 Indy9 错误。

标签: delphi html-email delphi-7 email-attachments


【解决方案1】:

这似乎是 Indy9 中的一个错误,其中第一个 TIdText 在添加附件时被忽略。添加一个普通的 TIdText 似乎已经解决了这个问题。

  1. 添加纯文本 TIdText。
  2. 将 HTML TIdText 添加到您需要的 html 正文中。
  3. 添加附件。

    下面的测试和工作代码。第一个包含纯文本的 TIdText 似乎被忽略了,但是当删除它时,html 被忽略了。

    // Set content type for the mail message
    MailMessage.ContentType := 'multipart/mixed';
    
    // Plain text body
    With TIdText.Create(MailMessage.MessageParts, nil) do
    begin
      ContentType := 'text/plain';
      Body.Text := 'This gets ignored for some reason'; // Doesn't have to be empty
    end;
    
    // HTML (HTML body to send)
    With TIdText.Create(MailMessage.MessageParts, nil) do
    begin
      ContentType := 'text/html';
      Body.Text := '<h1>Hello World</h1>';
    end;
    
    // Attachments
    for I := 0 to slAttachments.Count -1 do
    begin
      with TIdAttachment.Create(MailMessage.MessageParts, slAttachments[I]) do
      begin
        ContentType := 'application/pdf';
      end;
    end;
    
    // Send the mail
    smpt.Send(MailMessage);
    

【讨论】:

    猜你喜欢
    • 2020-05-21
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    相关资源
    最近更新 更多