Indy9添加附件后无法正确发送HTML邮件问题求助
解决Delphi7 Indy发送带附件的HTML邮件问题
在Delphi7自带的Indy版本(多为Indy9)中,MIME邮件结构的处理逻辑比新版本更严格,直接将HTML文本和附件并列放入MessageParts无法被邮件客户端正确解析。需要采用嵌套MIME结构实现:外层用multipart/mixed容纳正文容器和附件,正文部分用multipart/alternative同时提供HTML和纯文本版本(纯文本作为兼容 fallback)。
修正后的代码示例
var MailMessage: TIdMessage; slAttachments: TStringList; I: Integer; AltPart: TIdMultipart; PlainText, HtmlText: TIdText; begin // 初始化邮件基础信息 MailMessage := TIdMessage.Create(nil); try MailMessage.From.Address := msFromAddress; MailMessage.Recipients.EMailAddresses := sToAddress; MailMessage.Subject := sSubject; // 外层设置为multipart/mixed,用于容纳正文容器和附件 MailMessage.ContentType := 'multipart/mixed'; // 创建multipart/alternative容器,用于存放纯文本和HTML正文 AltPart := TIdMultipart.Create(MailMessage.MessageParts); AltPart.ContentType := 'multipart/alternative'; // 添加纯文本版本(可选但推荐,兼容不支持HTML的客户端) PlainText := TIdText.Create(AltPart.MessageParts, nil); PlainText.ContentType := 'text/plain; charset=utf-8'; PlainText.Body.Text := '请使用支持HTML的邮件客户端查看此邮件'; // 添加HTML版本 HtmlText := TIdText.Create(AltPart.MessageParts, nil); HtmlText.ContentType := 'text/html; charset=utf-8'; HtmlText.Body.Text := sMsg; // 你的HTML内容 // 添加附件 slAttachments := TStringList.Create; try // 假设slAttachments已填充附件路径 for I := 0 to slAttachments.Count - 1 do begin with TIdAttachment.Create(MailMessage.MessageParts, slAttachments[I]) do begin ContentType := 'application/pdf'; end; end; finally slAttachments.Free; end; // 此处补充TIdSMTP发送邮件的逻辑 finally MailMessage.Free; end; end;
关键说明
- 必须嵌套
multipart/alternative:老Indy不会自动将单独的text/html识别为邮件正文,需要把正文内容放在multipart/alternative容器中,让邮件客户端选择显示HTML或纯文本版本。 - 编码指定:添加
charset=utf-8避免中文乱码问题。 - 避免直接设置
MailMessage.Body:当使用MessageParts自定义MIME结构时,直接设置Body会干扰MIME解析,导致正文显示异常。
内容的提问来源于stack exchange,提问作者Adriaan
相关产品推荐
相关产品推荐

