Вниз
Скачать: CL | DM;

Отправка письма через Winsock, искажается поле Subject   Найти похожие ветки 

← →
DVM ©   (2006-11-14 16:26) [0]

Отправляю письмо через 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. Его коддировать как то надо?

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


← →
Dmitrij_K   (2006-11-14 16:47) [1]

Посмотри в indy


← →
DVM ©   (2006-11-14 16:53) [2]


> Посмотри в indy

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

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

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

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


← →
Anatoly Podgoretsky ©   (2006-11-14 16:58) [3]

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

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


← →
Rouse_ ©   (2006-11-14 17:23) [4]

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


← →
DVM ©   (2006-11-14 17:57) [5]


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

Кодирую так:

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

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

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

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


← →
iXT   (2006-11-14 18:02) [6]

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


← →
DVM ©   (2006-11-14 18:05) [7]


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

Ошибаешься

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

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


← →
iXT   (2006-11-14 18:10) [8]


> Ошибаешься

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


> Сделал я.

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


← →
Anatoly Podgoretsky ©   (2006-11-14 19:05) [9]

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

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


← →
Anatoly Podgoretsky ©   (2006-11-14 19:07) [10]

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

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


← →
Anatoly Podgoretsky ©   (2006-11-14 19:07) [11]

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

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


← →
iXT   (2006-11-15 11:39) [12]


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

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



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.035 c
2-1177932260
Ламер 2.Х
2007-04-30 15:24
2007.05.20
CheckBox


2-1177786996
Sonic90
2007-04-28 23:03
2007.05.20
Forms Position


15-1177066657
ArtemESC
2007-04-20 14:57
2007.05.20
Перенаправление почты с mail.ru


4-1166388905
Шоломицкий С. А.
2006-12-17 23:55
2007.05.20
Подать питание. COM или USB


2-1177584964
Аффтар
2007-04-26 14:56
2007.05.20
Как зарегистрировать DDL?




   Наверх