使用TIdMessageBuilderHtml设置电子邮件附件名称

Ada*_*son 4 delphi smtp indy

我正在尝试使用Delphi(D10S)将PDF文档附加到电子邮件中,并且我想将名称设置为文件系统上文件名以外的名称.

我找到了以下主题(来自2011年)Remy Lebeau声明您可以通过使用以下Name方法将TIdMessageBuilderAttachment对象附加到电子邮件时设置对象的属性来实现此目的TIdMessageBuilderHtml:

如何命名由TIdMessageBuilderHtml构造的附件文件

然而,听起来很简单,它似乎对我不起作用.电子邮件通过,但附件是原始文件名,而不是我指定的文件名.

以下是我希望按照我的描述进行的代码片段,但无论出于何种原因,它都没有.在这种情况下,我希望文件名通过desired_filename.pdf,但它来自as undesired_filename.pdf.我已删除邮件服务器凭据,原因很明显:

procedure TForm4.Button1Click(Sender: TObject);
var
  FMessageBuilder : TIdMessageBuilderHtml;
  FSMTP : TIdSMTP;
  FMessage : TIdMessage;
  FAttachment : TIdMessageBuilderAttachment;
begin
  FMessage := TIdMessage.Create();
  FMessageBuilder := TIdMessageBuilderHtml.Create;
  FSMTP := TIdSMTP.Create;

  FAttachment := FMessageBuilder.Attachments.Add('c:\undesired_filename.pdf');
  FAttachment.Name := 'desired_filename.pdf';
  FMessageBuilder.FillMessage(FMessage);

  FMessage.Sender.Address := '<Insert Sender Address>';
  FMessage.Sender.Name := '<Insert Sender Name>';
  FMessage.From.Address := '<Insert From Address>';
  FMessage.From.Name := '<Insert From Name>';
  FMessage.Recipients.EMailAddresses := '<Insert Recepient Address>';
  FMessage.Subject := 'Attachment Test';

  FSMTP.Host := '<Insert Mail Host>';
  FSMTP.Username := '<Insert Username>';
  FSMTP.Password := '<Insert Password>';
  FSMTP.Connect;
  FSMTP.Send(FMessage);
  FSMTP.Disconnect;
end;
Run Code Online (Sandbox Code Playgroud)

我在D10S和XE中对此进行了测试,两者都是这样做的.我有什么想法我做错了吗?

fan*_*cco 5

XE4,Indy 10.6.0.4975 上使用TIdMessageBuilderAttachments.Add接受a TStream并将TIdMessageBuilderAttachment.FileName属性设置为所需名称的重载对我来说是个窍门.

stream := TFileStream.Create('c:\undesired_filename.pdf', fmOpenRead);
FAttachment := FMessageBuilder.Attachments.Add(stream, 'application/pdf');
FAttachment.FileName := 'desired_filename.pdf';
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的一个问题是,这种重载会导致输入的"TStream"数据被复制到内存中(`TIdAttachmentMemory`对象被添加到`TIdMessage.MessageParts`集合中),因此这对于大型附件是不可取的. (2认同)