Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отправка письма через Winsock, искажается поле Subject [D7, WinXP]


DVM ©   (2006-11-14 16:26:00) 

Отправляю письмо через Winsock так:


WsaErr := WSAStartUp($101, WSAData);
   if WsaErr <> 0 then exit;
   SmtpHost := GetHostByName(PChar(SmtpServer));
   if SmtpHost = nil then exit;
   SmtpIP := inet_ntoa(PInAddr(SmtpHost.h_addr_list^)^);
   if SmtpIP = nil then exit;
   ZeroMemory(@SAddr, SizeOf(SAddr));
   with SAddr do
     begin
       sin_family := AF_INET;
       sin_port := htons(Port);
       sin_addr.S_addr := Inet_Addr(SmtpIP);
     end;
   Sock := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);  
   if Sock = INVALID_SOCKET then exit;
   if Connect(Sock, SAddr, SizeOf(SAddr)) > 0 then exit;
   
   if RecvCode <> '220' then exit;
   SendData('EHLO ' + SmtpServer + CRLF);
   if RecvCode <> '250' then exit;

   SendData('AUTH LOGIN ' + EncodeBase64(Login) + CRLF);
   Rcv := RecvCode;
   if  Rcv <> '334' then
     begin
       if Rcv <> '403' then exit;
     end
   else
     begin
       SendData(EncodeBase64(Password) + CRLF);
       if RecvCode <> '235' then exit;
     end;

   senddata('MAIL FROM:' + From + CRLF);
   if RecvCode <> '250' then exit;
   
   senddata('RCPT TO:' + Dest + CRLF);
   if RecvCode <> '250' then exit;

   senddata('DATA' + CRLF);
   if RecvCode <> '354' then exit;

   senddata('Subject: ' + Subject + CRLF);
   senddata('From: ' + From + CRLF);
   senddata('To: ' + Dest + CRLF);
   senddata(Body + CRLF + '.' + CRLF);
   if RecvCode <> '250' then exit;
   senddata('QUIT' + CRLF);
   result := true;


Все работает, только почему то поле Subject набранное русскими буквами искажается и принимает вид XXX. Его коддировать как то надо?

Отправляю через яндекс.


iXT   (2006-11-15 11:39:00) [1]


> Anatoly Podgoretsky ©   (14.11.06 19:07) [10]

Бывает. Заклинило под конец рабочего.


Anatoly Podgoretsky   (2006-11-14 19:07:00) [2]

> iXT  (14.11.2006 18:02:06)  [6]

Чего, не только он, но заголовок From: и почти все остальные заголовки.


Anatoly Podgoretsky   (2006-11-14 19:07:00) [3]

> DVM  (14.11.2006 18:05:07)  [7]

Вот сейчас заголовок закрыт.


Anatoly Podgoretsky   (2006-11-14 19:05:00) [4]

> DVM  (14.11.2006 17:57:05)  [5]

Заголовок не закрыт.


iXT   (2006-11-14 18:10:00) [5]


> Ошибаешься

Ну пусть будет так, я же сказал "могу"


> Сделал я.

С этим и поздравляю


DVM   (2006-11-14 18:05:00) [6]


> Я могу и ошибаться, но сдается мне, что Subject не кодируется
> Base64

Ошибаешься

Сделал я. Вот так надо было.

senddata('Subject: =?Windows-1251?B?' + EncodeBase64(Subject) + '?=' + CRLF);


iXT   (2006-11-14 18:02:00) [7]

Я могу и ошибаться, но сдается мне, что Subject не кодируется Base64


DVM   (2006-11-14 17:57:00) [8]


> кодируй примерно вот так:

Кодирую так:

senddata('Subject: =?koi8-r?B?' + EncodeBase64(Subject) + CRLF);

Получаю письмо с темой:

Subject: =?koi8-r?B?7/Do4uXy

B?7/Do4uXy - это закодированное слово 'привет'. Закодировано правильно.


Rouse_   (2006-11-14 17:23:00) [9]

кодируй примерно вот так: '=?KOI8-R?B?' + EncodeBase64(Subject)


Anatoly Podgoretsky   (2006-11-14 16:58:00) [10]

> DVM  (14.11.2006 16:53:02)  [2]

Вот так делать явно нельзя, достаточно прочитать RFC
Эта структура сложнее.


DVM   (2006-11-14 16:53:00) [11]


> Посмотри в indy

В этом Indy так все накручено, что концы искать можно долго.

Я в принципе подозреваю, что кодировать надо Base64, но почему то если я кодирую, получается также нечитабельный Subject при приеме в почтовике.

Т.е. пробовал так:

senddata('Subject: ' + EncodeBase64(Subject) + CRLF);


Dmitrij_K   (2006-11-14 16:47:00) [12]

Посмотри в indy


Наверх

Титульная страница Поиск, карта сайта Написать письмо