powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема с кодировкой в теме отправляемого письма.
25 сообщений из 26, страница 1 из 2
Проблема с кодировкой в теме отправляемого письма.
    #39668636
ROLpogo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте, ребята!
Никак не могу разобраться как мне отправить письмо по SMTP, чтобы в теме письма был русский текст вместо "???????".
Пишу на Embarcadero XE7, используя Indy 10-й версии. Буду очень признателен за помощь.

Вот моя процедура отправки:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
struct SSMTPMail
{
  AnsiString   sHost,
               sMailBoxName,
               sFromName,
               sPassword,
               sRecipientList,
               sSubject,
               sBody;
  int          iPort;
  bool         bSSL,
               bShowError;

  SSMTPMail()
  {
    iPort      = 0;
    bSSL       = false;
    bShowError = true;
  }
};


bool SendSMTPMail(const SSMTPMail *pSSM)
{
  Screen->Cursor = crHourGlass;
  bool bRes = true;

  TIdSMTP                      *pIdSMTP  = new TIdSMTP;
  TIdSSLIOHandlerSocketOpenSSL *pHandler = new TIdSSLIOHandlerSocketOpenSSL;
  TIdMessage                   *pMessage = new TIdMessage;

  pIdSMTP->Host     = pSSM->sHost;
  pIdSMTP->Port     = pSSM->iPort;
  pIdSMTP->Username = pSSM->sMailBoxName;
  pIdSMTP->Password = pSSM->sPassword;

  if (pSSM->bSSL)
  {
    pHandler->Destination = pIdSMTP->Host + ":" + IntToStr(pIdSMTP->Port);
    pHandler->Host        = pIdSMTP->Host;
    pHandler->Port        = pIdSMTP->Port;
    pHandler->SSLOptions->Method = sslvSSLv3;

    pIdSMTP->IOHandler = pHandler;
    pIdSMTP->UseTLS    = utUseImplicitTLS;
  }

  pMessage->CharSet                    = "windows-1251";
  pMessage->ContentType                = L"text/plain; charset=windows-1251";
  pMessage->From->Text                 = pSSM->sFromName;
  pMessage->Recipients->EMailAddresses = pSSM->sRecipientList;
  pMessage->Subject                    = pSSM->sSubject;

  pMessage->Body->Text = pSSM->sBody;

  try
  {
    pIdSMTP->Connect();
    pIdSMTP->Send(pMessage);
  }
  catch(Exception &e)
  {
    bRes = false;

    if (pSSM->bShowError)
      Application->MessageBox(String("Ошибка при отправке письма: " + e.Message).c_str(), L"Внимание!", MB_ICONSTOP);
  }

  pIdSMTP->Disconnect();
  delete pMessage;
  delete pHandler;
  delete pIdSMTP;
  Screen->Cursor = crDefault;
  return bRes;
}
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668640
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам долго мучался с этой проблемой в итоге закатал текст темы писма в BASE64 и передал как "SUBJECT:=?windows-1251?B?%сюда вставляем BASE64 закодированный заголовок%?=\r\n"
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668666
ROLpogo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum, что-то не срослось.

Попробовал сделать так:
Код: plaintext
1.
  pMessage->Subject = "?windows-1251?B?%0KLQtdGB0YLQvtCy0L7QtSDQv9C40YHRjNC80L4=%?=\r\n";


Получил в теме письма такой текст: ?windows-1251?B?%0KLQtdGB0YLQvtCy0L7QtSDQv9C40YHRjNC80L4=%?=\r\n
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668735
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
%% - убери вначале и в конце строки
?windows-1251?B?0KLQtdGB0YLQvtCy0L7QtSDQv9C40YHRjNC80L4=?=\r\n
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668737
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ROLpogoCerebrum, что-то не срослось.

Потом что надо же и голову задействовать иногда, а не только копи-паст. В том числе она
(голова) пригождается при чтении RFC на MIME.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668743
ROLpogo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum,
?windows-1251?B?0KLQtdGB0YLQvtCy0L7QtSDQv9C40YHRjNC80L4=?=\r\n
тоже не спасает. Выводит в теме: ?windows-1251?B?0KLQtdGB0YLQvtCy0L7QtSDQv9C40YHRjNC80L4=?=\r\n.
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668754
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тебе даю код для чистого взаимодействия по SMTP протоколу без посредников.

Ты используешь объект TIdMessage, который принимает только сам текст заголовка, без его метаданных. Метаданные он прикручивает сам. Тебе нужно либо перейти на использование SMTP протокола без посредников, либо научиться настраивать этот TIdMessage так, чтобы он понял, что ты отправляешь в заголовке BASE64 строку и ему надо оборачивать ее в соответствующие метаданные, которые в конечном итоге должны привести к строке

"SUBJECT:=?windows-1251?B?0KLQtdGB0YLQvtCy0L7QtSDQv9C40YHRjNC80L4=?=\r\n"

которую он будет пулять SMTP серверу.

Возможно даже, что после того, как ты скажешь TIdMessage: отравляй заголовок в BASE64, тебе не придется конвертировать ее вручную, TIdMessage сделает это сам на основе исходной строки. Я хз как работает этот TIdMessage, но пока у тебя получается двойное оборачивание строки темы письма в метаданные, поэтому на выходе ты и получаешь строку в метаданных без их обработки.
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668755
ROLpogo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Голову пытаемся задействовать, но в библиотеке есть баг какой-то чувствуется мне.
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668758
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ROLpogoГолову пытаемся задействовать, но в библиотеке есть баг какой-то чувствуется мне.

Ну так задействуй её для чтения исходников в поисках этого бага.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668761
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668768
ROLpogo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Пробовал, но не силен в паскале я.
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668772
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ROLpogoно не силен в паскале я.

bеgin-end вместо фигурных скобок сбивают с толку?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668779
ROLpogo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Догадливый.
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668839
Когда то давно пробовал Indy. Не понравилось.
Перешел на libcurl.
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668844
ROLpogo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum,

До того как написать пост гуглил 3 дня. Этот пример тоже видел и он не спасает.
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668846
ROLpogo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соискатель С++,

Чувствую, всё к этому и идет.
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668854
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ROLpogoCerebrum,

До того как написать пост гуглил 3 дня. Этот пример тоже видел и он не спасает.
При раскодировке твоей BASE64 строки декодером Лебедева я получаю


Если сам декодер не тупит, то получается что ты передаешь строку UTF8, сконвертированную в BASE64, но почтовому клиенту говоришь, что передаешь Win1251 (читай ANSI) сконвертированную в BASE64, то чему тут удивляться, что он не может ее обработать нормально?
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668886
ROLpogo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum,
Подставляя вот такой Subject ничего не меняется.
=?UTF-8?B?0KLQtdGB0YLQvtCy0L7QtSDQv9C40YHRjNC80L4=?=\r\n
Тема так и отображается:
=?UTF-8?B?0KLQtdGB0YLQvtCy0L7QtSDQv9C40YHRjNC80L4=?=\r\n
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668888
ROLpogo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если посмотреть внутрь письма на mail.ru, то там такие строки:
Subject:
=?KOI8-R?B?PT9VVEYtOD9CPzBLTFF0ZEdCMFlMUXZ0Q3kwTDdRdFNEUXY5QzQwWUhSak5D?=
=?KOI8-R?B?ODBMND0/PQ==?=
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668960
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ROLpogoCerebrum,
Подставляя вот такой Subject ничего не меняется.
=?UTF-8?B?0KLQtdGB0YLQvtCy0L7QtSDQv9C40YHRjNC80L4=?=\r\n
Тема так и отображается:
=?UTF-8?B?0KLQtdGB0YLQvtCy0L7QtSDQv9C40YHRjNC80L4=?=\r\n
если ты пользуешься классом TIdMessage, то зачем передаешь тему письма в виде готовой строки c метаданными? Класс TIdMessage сам все сконвертирует и подставит как надо, ты только скажи ему как именно. Для этого и используется Msg->ContentTransferEncoding. Возможно надо что-то еще использовать, но это уже читай документацию по TIdMessage.

Код: plaintext
1.
2.
3.
4.
5.
6.
TIdMessage *Msg = new TIdMessage(IdSMTP);
Msg->Subject = WinToWin1251Q(L"Тестовое письмо");
// НЕ нужно передавать в Msg->Subject =?UTF-8?B?0KLQtdGB0YLQvtCy0L7QtSDQv9C40YHRjNC80L4=?=\r\n, я же объяснил уже,
// что это для прямых вызовов по протоколу SMTP строка, если ты сам захочешь пулять данные в сокет почтового сервера
// а ты пуляешь не сам, следовательно строку ты собирать не должен - ее должен собрать TIdMessage!  
Msg->ContentTransferEncoding = L"base64";


Если хочешь отправлять данные сам, то изучай протокол SMTP. Организовать отправку простого текстового сообщения в нем не сложно, намного сложнее будет прикручивать SSL
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668976
ROLpogo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum, это тоже пробовал.
Msg->ContentTransferEncoding = L"base64";
Тема: ???????? ??????

Склоняюсь к тому, что в Indy 10 не предусмотрена отправка русского текста в теме.
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39668990
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ROLpogoCerebrum, это тоже пробовал.
Msg->ContentTransferEncoding = L"base64";
Тема: ???????? ??????

Склоняюсь к тому, что в Indy 10 не предусмотрена отправка русского текста в теме.
Что за почтовый клиент?
Он тоже может тупить
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39669054
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ROLpogo, нужный Content-Type выставил?
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39669219
ROLpogo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо! Проблему удалось решить добавлением хидера вместо штатного сабжекта:
Код: plaintext
1.
2.
  pMessage->Subject = "";
  pMessage->ExtraHeaders->AddValue("Subject", EncodeHeader(UTF8Encode(UnicodeString(pSSM->sSubject)), "C", 'B', "UTF-8"));
...
Рейтинг: 0 / 0
Проблема с кодировкой в теме отправляемого письма.
    #39669955
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ROLpogo,

У Инди есть событие OnMessageInitializeISO(var VHeaderEncoding: Char; var VCharSet: string);. В обработчике ставишь:

VHeaderEncoding='B';
VCharSet = "UTF-8";

Фсе.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема с кодировкой в теме отправляемого письма.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]