В моем проекте я пытаюсь извлечь вложения из файлов .eml.
При нормальных условиях (кодировка ISO) это работает. Но в особых обстоятельствах он дал мне неправильное имя файла для вложения.
Вот как выглядит MessagePart в моем примере:
------=_Part_315_1401515384.1585891801067
Content-Type: application/octet-stream;
name="=?UTF-8?Q?Report=5F2020-3=5FCustomerA with some spaces in between.csv?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="=?UTF-8?Q?Report=5F2020-3=5FCustomerA with some spaces in between.csv?="
UGFydG5lcjtNYW5kYW50ZW5uYW1lO05hbWU7RmlybWE7U3RyYd9lO1Bvc3RsZWl0emFobDtPcnQ7
TGFuZDtQcm9kdWt0bGluaWU7S3VuZGVuc3RhdHVzO0RhdHVtIFJlZ2lzdHJpZXJ1bmc7QmVnaW5u
IEthdWY7S/xuZGlndW5nIGf8bHRpZyBhYjtBbnphaGwgQmVudXR6ZXI7QW56YWhsIE1vYmlsZSBz
eW5jO05ldHRvIFJlY2hudW5nc2JldHJhZyBpbiBFdXJvO1Byb3Zpc2lvbnNzdHVmZTtQcm92aXNp
b25zYW50ZWlsIGluIEV1cm8NCg==
------=_Part_315_1401515384.1585891801067--
Пока что ничего впечатляющего. Но по какой-то причине я не получаю правильное имя файла из этого вложения.
Вот мой код для получения имени файла этого файла и сохранения его во временную папку:
function foo(MyMail: TIdMessage; SavePathWithoutBackSlash : string): boolean;
var
i : Integer;
lfilename: string;
begin
for i := 0 to Pred(MyMail.MessageParts.Count) do
begin
if (MyMail.MessageParts.Items[i] is TIdAttachmentFile) then
begin
lFilename := TIdAttachmentFile(MyMail.MessageParts.Items[i]).FileName;
TIdAttachmentFile(MyMail.MessageParts.Items[i]).SaveToFile(SavePathWithoutBackSlash + '\' + lFilename);
end;
end;
end;
end;
Я много пробовал с кодировками, но, похоже, ничто не оказывает влияния.
Я ожидаю, что строка выглядит так: path/Report_2020-3_CustomerA.csv
Что я получаю: path/=?UTF-8?Q?Report=5F2020-3=5FCustomerA.csv?=
Как правильно сохранить вложение?