Есть приложение, почтовый клиент которое отправляет и принимает письма, написанное на BDS2008.
Работа с почтой осуществляется через Indy10.
При формировании нового письма через компонент TIdMessage, письмо сначала сохраняется в файл для последующей отправки.
TIdMessage *IdMessageSave = new TIdMessage(NULL);
IdMessageSave->Clear();
IdMessageSave->MessageParts->Clear();
IdMessageSave->CharSet = "koi8-r";
IdMessageSave->AttachmentEncoding = "MIME";
IdMessageSave->ContentType = "text/plain; charset=\"koi8-r\";";
IdMessageSave->Encoding = meMIME;
IdMessageSave->From->Address = WIN_TO_KOI(this->From);
IdMessageSave->Recipients->EMailAddresses = WIN_TO_KOI(this->To);
IdMessageSave->Subject = WIN_TO_KOI(this->Subject);
IdMessageSave->Body->Text = WIN_TO_KOI(this->Body);
IdMessageSave->SaveToFile(this->Path);
IdMessageSave->~TIdMessage();
При миграции на CodeGear RAD Studio 2009 письмо сохраняется в файл, но вместо русских букв отображаются знаки вопроса "??????"
Вот пример сохраненного письма:
From: "aaaa@com.net" <aaaa@com.net>
Subject: ???????? ?????????
To: bbbb@com.net
Content-Type: text/plain; charset="koi8-r";
MIME-Version: 1.0
Date: Sun, 25 Jan 2009 18:39:11 +0300
???? ??????????, ???????? ?????? ??????? ?????????? ? ????????? ??????, ?????????? ?? BDS2008.
?????? ? ?????? ?????????????? ????? Indy10.
??? ???????????? ?????? ?????? ????? ????????? ?IdMessage, ?????? ??????? ??????????? ? ???? ??? ??????????? ????????
Пытался сохранять через поток, результат тот же, в поток уже попадают знаки вопроса
TMemoryStream* buffer = new TMemoryStream();
IdMessageSave->SaveToStream(buffer);
TStringList *mail_raw_str = new TStringList();
buffer->Position = 0;
mail_raw_str->LoadFromStream(buffer);
mail_raw_str->SaveToFile(this->Path);
Поиск в интернете подсказал что проблема сокрыта в Indy в методе TIdMessage::SaveToStream(...).
Собственно вопрос, как исправить данный баг?
PS: Функция WIN_TO_KOI
UnicodeString WIN_TO_KOI(UnicodeString str)
{
UnicodeString res_str;
UnicodeString SKoi = "ЈіёАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя";
UnicodeString SWin = "ёЁTюабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ";
int k;
for(int i = 1; i <= str.Length(); i++)
{
int pos = AnsiPos(str[i], SWin);
if(pos == 0) { res_str += str[i]; }
else { res_str += SKoi[pos]; }
}
return res_str;
}