delphi Indy9在添加附件时无法正确发送HTML

nsc4cvqm  于 2023-02-08  发布在  其他
关注(0)|答案(1)|浏览(171)

我们有一个用Delphi7编写的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也无法升级。

goqiplq2

goqiplq21#

这似乎是Indy9中的一个错误,在添加附件时第一个TIDText被忽略。添加纯TIDText似乎修复了这个问题。
1.添加纯文本TIdText。
1.添加HTML TIDText和所需的html主体。
1.添加附件。
测试和工作代码如下。第一个包含纯文本的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
smtp.Send(MailMessage);

相关问题