Delphi - TIdAttachment,从附件的文件名中删除路径

时间:2012-03-12 18:03:37

标签: delphi indy email-attachments

我使用Indy 10和TIdAttachment通过Delphi程序生成带附件的电子邮件。文件位置/名称作为//server/files/attachments/MyAttachment.pdf存储在数据库表中。我将文件附加到电子邮件中,如下所示:

   // Add each attachment in Attachments
    for Attachment in Attachments do begin
      // Make sure file name exists before trying to add
     if FileExists(Attachment) then
       TIdAttachmentFile.Create(MessageParts, Attachment);
    end;

当我发送电子邮件时,附件名称为

'__server_files_attachments_MyAttachment.pdf'

有没有办法删除文件路径,以便在收件人收到电子邮件时附件显示为“MyAttachment.pdf”?

我尝试使用ExtractFileName()但没有运气。我不认为它作为路径&文件名作为一个字符串来自数据库。

修改

我还尝试按如下方式提取文件名:

function GetFileName(FullPath: string): string;
var
   StrFound: TStringList;
begin
    StrFound := TStringList.Create();
    ExtractStrings(['/'], [' '], PChar(FullPath), StrFound);
    result := StrFound[StrFound.Count - 1];
end;

这会返回'MyAttachment.pdf',但这会导致Delphi在文件夹中查找不在'// server / files / attachments'中的文件。似乎除非我在调用TIdAttachmentFile.Create()后重命名附件,否则我无法更改文件名。

编辑 - 解决方案

使用Remy的评论显示解决方案(并使用上面的GetFileName()):

// Add each attachment in Attachments
for Attachment in Attachments do begin
  // Make sure file name exists before trying to add
  if FileExists(Attachment) then begin
     with TIdAttachmentFile.Create(MessageParts, Attachment) do begin
       Filename := GetFileName(Attachment);
     end;
  end;
end;

3 个答案:

答案 0 :(得分:2)

Windows可能会将'/'识别为路径分隔符,但RTL不会。本地路径和UNC路径必须使用'\'。您需要将文件名字符串从'/'规范化为'\',然后再将其传递给Indy,例如UnixPathToDosPath()

答案 1 :(得分:2)

您可以使用您希望附件具有的文件名创建TIdAttachmentFile。构造完成后,将附件的StoredPathName属性设置为完整路径。

var
  a: TIdAttachmentFile;
  FileName: string;

...

  FileName := ExtractFilePath(AttachmentPath);
  a := TIdAttachmentFile.Create(MessageParts, FileName);
  a.StoredPathName := AttachmentPath;

答案 2 :(得分:0)

对TIdAttachment.Create的调用包括它自己的ExtractFilename调用,因此您不需要提前调用它 - 它需要该路径来查找您的文件。

我认为你处在catch-22中,你需要发送TidAttachment.Create它理解的路径,因为它使用完整路径添加你的文件,然后它根据你的需要为你提取文件名包含在您的邮件中。我不认为它的工作方式与您想要的一样,因为它无法正确执行ExtractFilename部分。因此,不是提取文件名,而是以TIdAttachment.Create可以理解的方式形成路径。

在这种情况下,我会尝试映射驱动器,并将驱动器映射用作:

Z:\ files \ _ attachments \ MyAttachment.pdf = //server/files/attachments/MyAttachment.pdf

只需预先处理您的附件,用Z:\和/ with \替换//服务器,然后尝试。

编辑考虑雷米的评论: 交换/字符到\ chars

\\服务器\文件\附件\ myattachment.pdf

然后调用TIdAttachment.Create