Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема с кодировкой в теме отправляемого письма. / 25 сообщений из 26, страница 1 из 2
03.07.2018, 10:36
    #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
03.07.2018, 10:41
    #39668640
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с кодировкой в теме отправляемого письма.
Сам долго мучался с этой проблемой в итоге закатал текст темы писма в BASE64 и передал как "SUBJECT:=?windows-1251?B?%сюда вставляем BASE64 закодированный заголовок%?=\r\n"
...
Рейтинг: 0 / 0
03.07.2018, 11:18
    #39668666
ROLpogo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с кодировкой в теме отправляемого письма.
Cerebrum, что-то не срослось.

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


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

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

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

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

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

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

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

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

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

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

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

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

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


Если сам декодер не тупит, то получается что ты передаешь строку UTF8, сконвертированную в BASE64, но почтовому клиенту говоришь, что передаешь Win1251 (читай ANSI) сконвертированную в BASE64, то чему тут удивляться, что он не может ее обработать нормально?
...
Рейтинг: 0 / 0
03.07.2018, 15:34
    #39668886
ROLpogo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с кодировкой в теме отправляемого письма.
Cerebrum,
Подставляя вот такой Subject ничего не меняется.
=?UTF-8?B?0KLQtdGB0YLQvtCy0L7QtSDQv9C40YHRjNC80L4=?=\r\n
Тема так и отображается:
=?UTF-8?B?0KLQtdGB0YLQvtCy0L7QtSDQv9C40YHRjNC80L4=?=\r\n
...
Рейтинг: 0 / 0
03.07.2018, 15:36
    #39668888
ROLpogo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с кодировкой в теме отправляемого письма.
Если посмотреть внутрь письма на mail.ru, то там такие строки:
Subject:
=?KOI8-R?B?PT9VVEYtOD9CPzBLTFF0ZEdCMFlMUXZ0Q3kwTDdRdFNEUXY5QzQwWUhSak5D?=
=?KOI8-R?B?ODBMND0/PQ==?=
...
Рейтинг: 0 / 0
03.07.2018, 16:35
    #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
03.07.2018, 16:50
    #39668976
ROLpogo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с кодировкой в теме отправляемого письма.
Cerebrum, это тоже пробовал.
Msg->ContentTransferEncoding = L"base64";
Тема: ???????? ??????

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

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

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

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

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


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