我使用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;
答案 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