IdMessage Кодировка-кракозябра

KaiKristo

Вопрос избит, но! Ни одно из найденных мной решений не действует. Суть: Есть почтовый клиент, шлет письмо с мыла Х на мыло Y. (оба mail.ru). Вместо заголовка печатается ??????.
void send_msg (void)
{
    Form1->IdMessage1->Body->Assign(Form1->Memo1->Lines);//Текст письма из мемо - отображается корректно
    Form1->IdMessage1->From->Text = "[removed_email]";//от кого письмо
    Form1->IdMessage1->Subject = "Пример заголовка";//Заголовок письма - отображается не корректно - ???????
    Form1->IdMessage1->Recipients->EMailAddresses = "[removed_email]";//Адрес получателя
 
    Form1->IdSMTP1->Host = "smtp.mail.ru";//адрес СМТП сервака
    Form1->IdSMTP1->Username = "Y";//Логин
    Form1->IdSMTP1->Password = "Password";//Пароль
    Form1->IdSMTP1->Port = 465;// порт SSL
    Form1->IdSMTP1->AuthType = satDefault;//с авторизацией
 
    Form1->IdSSLIOHandlerSocketOpenSSL1->MaxLineAction = maException;
    Form1->IdSSLIOHandlerSocketOpenSSL1->Destination = Form1->IdSMTP1->Host+":"+IntToStr(Form1->IdSMTP1->Port);
    Form1->IdSSLIOHandlerSocketOpenSSL1->Host = Form1->IdSMTP1->Host;
    Form1->IdSSLIOHandlerSocketOpenSSL1->Port = Form1->IdSMTP1->Port;
    Form1->IdSSLIOHandlerSocketOpenSSL1->DefaultPort=0;
    Form1->IdSSLIOHandlerSocketOpenSSL1->SSLOptions->Method=sslvTLSv1;
    Form1->IdSSLIOHandlerSocketOpenSSL1->SSLOptions->Mode=sslmUnassigned;
    Form1->IdSSLIOHandlerSocketOpenSSL1->SSLOptions->VerifyDepth = 0;
 
    Form1->IdSMTP1->IOHandler=Form1->IdSSLIOHandlerSocketOpenSSL1;
    Form1->IdSMTP1->UseTLS=utUseExplicitTLS;
 
    try //обработка исключений
    {
        try
        {
            if (Form1->IdSMTP1->Connected())
                Form1->IdSMTP1->Disconnect();
            Form1->IdSMTP1->ReadTimeout = 15000;
            Form1->IdSMTP1->Connect();
            Form1->IdSMTP1->Send(Form1->IdMessage1);
        }
        catch (Exception &exception)
        {
            Form1->IdSMTP1->Disconnect();
            MessageDlg("Application, may not connected", mtError, TMsgDlgButtons() << mbYes, 0);
            Abort;
        }
        // My Code Here
    }
    catch (Exception &exception)
    {
        Application->ShowException(&exception);
        Form1->IdSMTP1->Disconnect();
    }
    return;
}
Просьба помочь Версия билдера: XE6
3 ответа

KaiKristo

Посмотри эти темы, в них есть решение Отправка почты на mail.ru Не могу убрать ошибки с отправкой


KaiKristo

        Form1->IdMessage1->Body->Assign(Form1->Memo1->Lines);//тут мы берем текст из Memo
    Form1->IdMessage1->From->Text = "[removed_email]";//от кого письмо (если сервер не проверяет, можно левый адрес)
    Form1->IdMessage1->ContentType = "text/plain";
    Form1->IdMessage1->CharSet = "UTF-8";
    Form1->IdMessage1->ContentTransferEncoding = "base64";
    Form1->IdMessage1->Subject = "Пример заголовка";//Заголовок письма
    Form1->IdMessage1->Recipients->EMailAddresses = "[removed_email]";//Адрес получателя
 
    Form1->IdSMTP1->Host = "smtp.mail.ru";//адрес СМТП сервака
    Form1->IdSMTP1->Username = "[removed_email]";//Логин
    Form1->IdSMTP1->Password = "Password";//Пароль
    Form1->IdSMTP1->Port = 465;// порт SSL
    Form1->IdSMTP1->AuthType = satDefault;//с авторизацией
 
    Form1->IdSSLIOHandlerSocketOpenSSL1->MaxLineAction = maException;
    Form1->IdSSLIOHandlerSocketOpenSSL1->Destination = Form1->IdSMTP1->Host+":"+IntToStr(Form1->IdSMTP1->Port);
    Form1->IdSSLIOHandlerSocketOpenSSL1->Host = Form1->IdSMTP1->Host;
    Form1->IdSSLIOHandlerSocketOpenSSL1->Port = Form1->IdSMTP1->Port;
    Form1->IdSSLIOHandlerSocketOpenSSL1->DefaultPort=0;
    Form1->IdSSLIOHandlerSocketOpenSSL1->SSLOptions->Method=sslvTLSv1;
    Form1->IdSSLIOHandlerSocketOpenSSL1->SSLOptions->Mode=sslmUnassigned;
    Form1->IdSSLIOHandlerSocketOpenSSL1->SSLOptions->VerifyDepth = 0;
 
    Form1->IdSMTP1->IOHandler=Form1->IdSSLIOHandlerSocketOpenSSL1;
    Form1->IdSMTP1->UseTLS=utUseExplicitTLS;
 
    try //дальше собственно отправка и обработка кое каких исключений
    {
        try
        {
            if (Form1->IdSMTP1->Connected())
                Form1->IdSMTP1->Disconnect();
            Form1->IdSMTP1->ReadTimeout = 15000;
            Form1->IdSMTP1->Connect();
            Form1->IdSMTP1->Send(Form1->IdMessage1);
        }
        catch (Exception &exception)
        {
            Form1->IdSMTP1->Disconnect();
            MessageDlg("Application, may not connected", mtError, TMsgDlgButtons() << mbYes, 0);
            Abort;
        }
        // My Code Here
    }
    catch (Exception &exception)
    {
        Application->ShowException(&exception);
        Form1->IdSMTP1->Disconnect();
    }
    return;
}
void __fastcall TForm1::IdMessage1InitializeISO(System::WideChar &VHeaderEncoding,
          UnicodeString &VCharSet)
{
VCharSet = "UTF-8";
 
}
Вот рабочий код, спасибо пользователю _Dimon_
    Form1->IdMessage1->Body->Assign(Form1->Text->Lines);//тут мы берем текст из Memo
    Form1->IdMessage1->From->Text = Form1->Login->Text;//от кого письмо (если сервер не проверяет, можно левый адрес)
    Form1->IdMessage1->ContentType = "text/plain";
    Form1->IdMessage1->CharSet = "UTF-8";
    Form1->IdMessage1->ContentTransferEncoding = "base64";
    Form1->IdMessage1->Subject = Form1->Subject->Text;//Заголовок письма
    Form1->IdMessage1->Recipients->EMailAddresses = Form1->Recipients->Text;//Адрес получателя
      if (Form1->IdSMTP1->Connected()==false)
      {
    Form1->IdSMTP1->Host = "smtp.mail.ru";//адрес СМТП сервака
    Form1->IdSMTP1->Username = Form1->Login->Text;//Логин
    Form1->IdSMTP1->Password = Form1->Password->Text;//Пароль
    Form1->IdSMTP1->Port = 465;// порт SSL
    Form1->IdSMTP1->AuthType = satDefault;//с авторизацией
 
    Form1->IdSSLIOHandlerSocketOpenSSL1->MaxLineAction = maException;
    Form1->IdSSLIOHandlerSocketOpenSSL1->Destination = Form1->IdSMTP1->Host+":"+IntToStr(Form1->IdSMTP1->Port);
    Form1->IdSSLIOHandlerSocketOpenSSL1->Host = Form1->IdSMTP1->Host;
    Form1->IdSSLIOHandlerSocketOpenSSL1->Port = Form1->IdSMTP1->Port;
    Form1->IdSSLIOHandlerSocketOpenSSL1->DefaultPort=0;
    Form1->IdSSLIOHandlerSocketOpenSSL1->SSLOptions->Method=sslvTLSv1;
    Form1->IdSSLIOHandlerSocketOpenSSL1->SSLOptions->Mode=sslmUnassigned;
    Form1->IdSSLIOHandlerSocketOpenSSL1->SSLOptions->VerifyDepth = 0;
 
    Form1->IdSMTP1->IOHandler=Form1->IdSSLIOHandlerSocketOpenSSL1;
    Form1->IdSMTP1->UseTLS=utUseExplicitTLS;
    }
    try //дальше собственно отправка и обработка кое каких исключений
    {
        try
        {
            if (Form1->IdSMTP1->Connected())
                Form1->IdSMTP1->Disconnect();
            Form1->IdSMTP1->ReadTimeout = 1500;
            Form1->IdSMTP1->Connect();
            Form1->IdSMTP1->Send(Form1->IdMessage1);
        }
        catch (Exception &exception)
        {
            Form1->IdSMTP1->Disconnect();
            MessageDlg("Application, may not connected", mtError, TMsgDlgButtons() << mbYes, 0);
            Abort;
        }
        // My Code Here
    }
    catch (Exception &exception)
    {
        Application->ShowException(&exception);
        Form1->IdSMTP1->Disconnect();
    }
 
    return;
}
void __fastcall TForm1::IdMessage1InitializeISO(System::WideChar &VHeaderEncoding,
          UnicodeString &VCharSet)
{
VCharSet = "UTF-8";
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{
if (CheckBox1->Checked==true) {
Password->PasswordChar='*';
}
else
Password->PasswordChar=0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    if (Form1->IdSMTP1->Connected())
    IdSMTP1->Disconnect();
}
Внес изменения дабы не ругалась на еще одну отправку


KaiKristo

Аналогичная проблема. Но у меня знаки вопроса в теме письма появлялись в готовом, построенном проекте (Build). А на этапе разработки все нормально. (RAD Studio 10 Seattle). При этом если в Project->Options->Packages->Runtime Packages поставить Link with runtime packages в true для Release версии, то знаки вопроса пропадают, текст отображается корректно. Кучу ответов по этой теме перечитал, все перепробовал, ничего не помогло, кроме вот этого:
void __fastcall TForm1::IdMessage1InitializeISO(System::WideChar &VHeaderEncoding, UnicodeString &VCharSet) 
{ 
   VCharSet = "UTF-8"; 
}