TIdMessage SaveToFile сохраняет письмо со знаками вопроса
От: AkhramovichSA Россия http://craft.mos-com.net/
Дата: 25.01.09 15:53
Оценка:
Есть приложение, почтовый клиент которое отправляет и принимает письма, написанное на 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;
}
http://craft.mos-com.net/
builder c++ indy10 tidmessage savetofile кодировка
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.