Форум: "Сети";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];
ВнизОтправка письма через 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 вся ветка
Форум: "Сети";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.043 c