Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.65/51: Рейтинг темы: голосов - 51, средняя оценка - 4.65
10 / 10 / 1
Регистрация: 16.05.2012
Сообщений: 18
1

Проблема с кодировкой при отправке письма

16.05.2012, 17:34. Показов 9481. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Пишу курсовую на тему "Почтовый клиент" на С++ Builder (EmbarcaderoRAD Studio XE)

Возникла проблема:
При отправке письма Тема и Сам текст письма на mail.ru и других почтовых серверах отображаются неправильно (как вопросы - ?). Английский текст отображается без проблем.

Вот Код:
C++
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
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 IdSMTP1->Host = "smtp.yandex.ru"; // Адрес почтового сервера
 IdSMTP1->Port = 25; //Используемый порт
 IdSMTP1->Username = "****"; // Пишем  логин от почты
 IdSMTP1->Password = "****"; // и пароль к нему
}
 
 
//---------------------------------------------------------------------------
void __fastcall TForm1::ОтправитьClick(TObject *Sender)
{
 char subject[100];
 IdMessage1->From->Text = Edit1->Text;
 IdMessage1->Recipients->EMailAddresses = Edit2->Text;
 IdMessage1->Subject = Edit3->Text;
 IdMessage1->Body->Text = Memo1->Text;
 //IdMessage1->ContentType = "text/plain; charset=koi8-r";
 
 IdSMTP1->Connect();
 if (IdSMTP1->Connected())
  IdSMTP1->Send(IdMessage1);
 else
  IdSMTP1->Disconnect();
}
Может как-то можно с помощью данной функции так:
C++
1
IdMessage1->Body->Encoding->Convert();
Когда добавляю следующий код, текст письма отображается правильно, а тема нет.
C++
1
IdMessage1->ContentType = "text/plain; charset=koi8-r";
Получается вот что:
HTML5
1
2
3
4
5
6
7
8
9
10
???????? TEST 
mailercpp@yandex.ru
Кому: mailercpp@mail.ru,
Ср 16 мая 2012
17:09:48
Это тестовое письмо
Чтобы проверить отправляется ли оно,
а еще кодировку 
и другую всякую фигню...
English Text
А должно:
HTML5
1
2
3
4
5
6
7
8
9
10
Проверка TEST 
mailercpp@yandex.ru
Кому: mailercpp@mail.ru,
Ср 16 мая 2012
17:09:48
Это тестовое письмо
Чтобы проверить отправляется ли оно,
а еще кодировку 
и другую всякую фигню...
English Text
Помогите пожалуйста разобраться с кодировкой.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2012, 17:34
Ответы с готовыми решениями:

Почтовый клиент. Ошибка при отправке письма
Здравствуйте! Создаю простенькую программу, в ней делаю функцию, с помощью которой пользователь...

Как при отправке письма дать пользователю выбор адресующему в плане отправки на почту?
Здравствуйте! Написал программу, в который отправляю опр. одинаковое письма с одной почту на...

Отправка писем, проблема с кодировкой
Написал маленькое приложение для отправки писем, но есть маленькая проблема. TIdMessage* msg =...

Неполадки с кодировкой при отправке письма
Привет всем. делаю обратную связь, она нормально работает но приходит письмо и в место букв одни...

21
10 / 10 / 1
Регистрация: 16.05.2012
Сообщений: 18
17.05.2012, 21:02  [ТС] 3
У меня проблема с кодировкой при отправке сообщения через компонент IdSMTP.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.05.2012, 21:23 4
C++
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
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TIdSMTP *IdSMTP = new TIdSMTP(NULL);
TIdMessage *Msg = new TIdMessage(IdSMTP);
  Msg->Subject = WinToWin1251Q(L"Тестовое письмо");  // WinToWin1251Q - самописная
  Msg->ContentTransferEncoding = L"base64";          // вот она, чудо строчка
 
  Msg->From->Name = WinToWin1251Q(L"Тестер");
  Msg->ContentType = L"text/plain; charset=windows-1251";
  Msg->Body->Add(L"Тело сообщения");
...
  IdSMTP->Connect();
  IdSMTP->Send(Msg);
  IdSMTP->Disconnect();
...
}
//---------------------------------------------------------------------------
UnicodeString __fastcall WinToWin1251Q(UnicodeString Str)
{
UnicodeString strTo;
  strTo.sprintf(L"=?windows-1251?Q?");
AnsiString sss = Str;
  for(int i=1; i<=sss.Length(); i++)
  {
byte a = sss[i];
    if (a == ' ') a = '_';
    strTo.cat_printf((a<128) ? L"%c" : L"=%.2X", a);
  }
  strTo.cat_printf(L"?=");
  return strTo;
}
Неверная кодировка текста в компонентах формы при получении почты через IdPOP3
2
10 / 10 / 1
Регистрация: 16.05.2012
Сообщений: 18
20.05.2012, 11:49  [ТС] 5
Как я уже говорил, я пишу Почтовый клиент.
Тоесть base64 это конечно хорошо, но как получить письмо с такой кодировкой и декодировать его??
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.05.2012, 16:24 6
Не понимаю вопроса?
При такой отпарвки на почте долно быть читаемый текст.

Добавлено через 1 минуту
О том как скачать его IdPOP3 и получить читаемый текст есть в ссылках
0
12 / 5 / 2
Регистрация: 13.02.2011
Сообщений: 51
10.01.2013, 01:35 7
Цитата Сообщение от Avazart Посмотреть сообщение
C++
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
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TIdSMTP *IdSMTP = new TIdSMTP(NULL);
TIdMessage *Msg = new TIdMessage(IdSMTP);
  Msg->Subject = WinToWin1251Q(L"Тестовое письмо");  // WinToWin1251Q - самописная
  Msg->ContentTransferEncoding = L"base64";          // вот она, чудо строчка
 
  Msg->From->Name = WinToWin1251Q(L"Тестер");
  Msg->ContentType = L"text/plain; charset=windows-1251";
  Msg->Body->Add(L"Тело сообщения");
...
  IdSMTP->Connect();
  IdSMTP->Send(Msg);
  IdSMTP->Disconnect();
...
}
//---------------------------------------------------------------------------
UnicodeString __fastcall WinToWin1251Q(UnicodeString Str)
{
UnicodeString strTo;
  strTo.sprintf(L"=?windows-1251?Q?");
AnsiString sss = Str;
  for(int i=1; i<=sss.Length(); i++)
  {
byte a = sss[i];
    if (a == ' ') a = '_';
    strTo.cat_printf((a<128) ? L"%c" : L"=%.2X", a);
  }
  strTo.cat_printf(L"?=");
  return strTo;
}
Неверная кодировка текста в компонентах формы при получении почты через IdPOP3
Не помогает, вместо "Привет" приходило ??????, а сейчас вообще кракозябры ужасные..

тема: =?windows-1251?Q?=CF=F0=E8=E2=E5=F2?=
само сообщение:
Привет

Добавлено через 55 минут
Делаю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
IdMessage1->CharSet = "windows-1251";
IdMessage1->ContentType = "text/plain";
IdMessage1->Encoding = true;
IdMessage1->ContentTransferEncoding = "base64";
 
        IdSMTP1->Username = login->Text; //логин
        IdSMTP1->Password = password->Text; //пароль
        IdMessage1->Body->Text = telo->Text;  //тело сообщения
        IdMessage1->From->Text = login->Text; //откуда шлем
        IdMessage1->Recipients->EMailAddresses = ""; //кому шлем
        IdMessage1->Subject = tema->Text;  //тема сообщения
 
void __fastcall TForm1::IdMessage1InitializeISO(System::WideChar &VHeaderEncoding,
          UnicodeString &VCharSet)
{
VCharSet = "windows-1251";
VHeaderEncoding = 'B';
}
На почту приходит: "?????"
0
LK
Заблокирован
10.01.2013, 02:36 8
потому что почта у вас в юникоде, а отправляете вы не понятно что из какого-то WinToWin1251Q
0
12 / 5 / 2
Регистрация: 13.02.2011
Сообщений: 51
10.01.2013, 12:02 9
Цитата Сообщение от LK Посмотреть сообщение
потому что почта у вас в юникоде, а отправляете вы не понятно что из какого-то WinToWin1251Q
Мне этот WinToWin1251Q вообще не нужен, я его попробовал ничего не пашет и убрал.
Но текст в теме как приходил знаками вопросов, так и приходит, что делать?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.01.2013, 16:09 10
Цитата Сообщение от ice_man Посмотреть сообщение
Мне этот WinToWin1251Q вообще не нужен,
Преобразование в 64 Base как я догадываюсь.
(В RAD2009 нужна была как я помню )

Собственно какая версия у вас Builder и Indy, на кокой хост почты шлете письма ?
0
12 / 5 / 2
Регистрация: 13.02.2011
Сообщений: 51
10.01.2013, 16:12 11
Цитата Сообщение от Avazart Посмотреть сообщение
Преобразование в 64 Base как я догадываюсь.
(В RAD2009 нужна была как я помню )

Собственно какая версия у вас Builder и Indy, на кокой хост почты шлете письма ?

rad studio xe2
10 инди
на хост - smtp.mail.ru
0
0 / 0 / 1
Регистрация: 19.08.2012
Сообщений: 55
07.10.2014, 00:09 12
Прошу уточнить все таки - как решить проблему знаков вопросов в заголовке отправляемого письма ? Вместо кирилицы - просто знаки вопроса ..... ответа не нашлось.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.10.2014, 00:57 13
Попробуй ф-цию WinToUnicode()

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//-----------------------------------------------------------------------
String WinToUnicode(const String St)
{
 String Result="";
 for (int i = 1; i <= St.Length(); i++)
 {
  if (int(St[i])>= 0x00C0 && int(St[i])<= 0x00FF)
    Result += wchar_t(int(St[i])+0x350);
  else Result += St[i];
 }
 return Result;
}
//-----------------------------------------------------------------------
Ну и сюда загляни https://www.cyberforum.ru/blog... og513.html я уже не помню что использовал.
0
0 / 0 / 1
Регистрация: 19.08.2012
Сообщений: 55
07.10.2014, 01:16 14
Не работает Ваш вариант. При отправке с гугла на иную почту у меня функция WinToWin1251Q нормально отправляет - т.е. тема письма отображается корректно - НО в самом гугле - показывает краказяблу ... "=?windows-1251?Q?=CF=EE=F1=EB=E5=E4=ED=E8=E9_=F0=E0=E7_=EF=F0=EE=E1=F3=E5=EC_=E5=F9=E5_=F0 =E0=E7_0:01?="

Ваш пример не поменял знаки вопроса на текст.
Работаю с ХЕ6 С++Builder.

Может подскажете - как данную проблему дорешать до логического решения полного вопроса ?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.10.2014, 15:25 15
Кодировку не выставили, или выставили неправильно.
0
0 / 0 / 1
Регистрация: 19.08.2012
Сообщений: 55
07.10.2014, 15:54 16
C++
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
IdSMTP1->Host=Edit1->Text;
IdSMTP1->Username=Edit2->Text;
IdSMTP1->Password=Edit3->Text;
IdSMTP1->HeloName="Petrovich";
IdSMTP1->MailAgent="Krutaya Proga";
 
IdMessage1->Clear();
IdMessage1->ContentTransferEncoding = "base64";
IdMessage1->Encoding=true;
 
IdMessage1->Recipients->EMailAddresses= Edit4->Text;    // Адрес - кому
IdMessage1->Subject = WinToWin1251Q(Edit5->Text);                       // Тема письма
IdMessage1->Body->Text=Edit6->Text;                     // Текст
IdMessage1->From->Text = "Sambo";                       // От кого
IdMessage1->Date=Date()-1;
TIdMessageBuilderPlain* MyMessage = new TIdMessageBuilderPlain();
// Пропускаем прикрепление файлов
MyMessage->PlainText->Text=Edit6->Text;
MyMessage->FillMessage(IdMessage1);
 
try {
 IdSMTP1->Connect();
 IdMessage1->ContentType = "text/plain; charset=windows-1251";
 IdMessage1->CharSet = "windows-1251";
 IdMessage1->ContentTransferEncoding = "8BITMIME";
 
 
  IdSMTP1->Send(IdMessage1);
  ShowMessage("Письмо отправлено успешно");
} catch (...) {ShowMessage("пРОБЛЕМА ПРИ ОТПРАВКЕ МЫЛА");}
IdSMTP1->Disconnect(true);
delete MyMessage;
Пример тестового кода, вопрос - где указана не правильная кодировка. Все, что было на форумах попытался применить, попробывать - не работает. Необходимо получить результат. Если не правильно скрутите проект под гугл и под ХЕ6 C++ Builder и выложите плиз.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.10.2014, 16:05 17
Цитата Сообщение от Sergey R Посмотреть сообщение
C++
1
2
3
IdMessage1->ContentType = "text/plain; charset=windows-1251";
IdMessage1->CharSet = "windows-1251";
IdMessage1->ContentTransferEncoding = "8BITMIME";
Тут

Добавлено через 37 секунд
Цитата Сообщение от Sergey R Посмотреть сообщение
IdMessage1->Subject = WinToWin1251Q(Edit5->Text); // Тема письма
Это убери.

Добавлено через 45 секунд
Цитата Сообщение от Sergey R Посмотреть сообщение
Если не правильно скрутите проект под гугл и под ХЕ6 C++ Builder и выложите плиз.
UI где-то кажется в темах выкладывал рабочий пример, поищи.

Добавлено через 6 минут
C++
1
TIdMessageBuilderPlain* MyMessage = new TIdMessageBuilderPlain();
Хотя этой штуки вроде раньше не было, так что хз.
1
0 / 0 / 1
Регистрация: 19.08.2012
Сообщений: 55
07.10.2014, 16:19 18
Как то получается что при отправке на разных операторов (с гугла) необходимо использовать разные методы. Пробую один вариант - отправка на гугл правильно отображает тему, на иных НЕ правильно. Пробую другой вариант - на других правильно - в гугле кракозяблы. Ну просто х.з.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
07.10.2014, 16:42 19
Sergey R, ты будешь смеяться, но:
C++
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
    IdMessage1->Clear();
    IdMessage1->ContentTransferEncoding = "base64";
    IdMessage1->Encoding = mePlainText;
 
    IdMessage1->Recipients->EMailAddresses = "тут_был_адрес@yandex.ru";
    // Адрес - кому
    IdMessage1->Subject = (Edit5->Text); // Тема письма, безо всяких преобразований
    IdMessage1->Body->Text = Edit6->Text; // Текст
    IdMessage1->From->Text = "Sambo"; // От кого
    IdMessage1->Date = Date() - 1;
    TIdMessageBuilderPlain* MyMessage = new TIdMessageBuilderPlain();
    // Пропускаем прикрепление файлов
    MyMessage->PlainText->Text = Edit6->Text;
    MyMessage->FillMessage(IdMessage1);
 
    try
    {
        IdSMTP1->Connect();
        IdMessage1->ContentType = "text/plain; charset=windows-1251";
        IdMessage1->CharSet = "windows-1251";
        IdMessage1->ContentTransferEncoding = "8BITMIME";
 
        IdSMTP1->Send(IdMessage1);
        ShowMessage(L"Письмо отправлено успешно");
    }
    catch (...)
    {
        ShowMessage(L"пРОБЛЕМА ПРИ ОТПРАВКЕ МЫЛА");
    }
    IdSMTP1->Disconnect(true);
    delete MyMessage;
прекрасно отображается и тема и тело письма и в gmail-е (в отправленных), и у получателя, никаких доп. преобразований не нужно. Проверялось как на XE2/XE4/XE7, так и в Лазарусе... Везде все одинаково... Что на yandex, что на mail.ru/yahoo.com/walla.com/msn.com/AOL
0
0 / 0 / 1
Регистрация: 19.08.2012
Сообщений: 55
07.10.2014, 17:25 20
Пробую отправлять на www.ukr.net (то что было под рукой) - по Вашему коду
Миниатюры
Проблема с кодировкой при отправке письма   Проблема с кодировкой при отправке письма  
0
07.10.2014, 17:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2014, 17:25
Помогаю со студенческими работами здесь

Беда с кодировкой при отправке строк e-mail письма(тема, от кого) на Indy
Ну, в общем, увидите, когда будете смотреть проект.

Проблема при отправке письма с вложениями, содержащими русские символы
Доброго времени суток. В общем есть код, отправляет письмо стандартными средствами .NET. В 2005...

При отправке письма тело письма $message не отображается
вот функция атачя $sfile - содержание файла function send($sfile,$filename) { $message =...

Проблемы с кодировкой при отправке данных в БД
Добрый день. Есть форма на сайте для отправки сообщения (в БД). Идёт так: Главная страница -&gt; AJAX...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru