![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отправка письма через 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