Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

отправка письма через TClientSocket   Найти похожие ветки 

 
Alexis ©   (2004-02-29 12:00) [0]

Мог бы кто нибудь привести работающий код для отправки письма через TClientSocket на SMTP сервер? У меня после отправки приветствия(HELO) и адреса отправителя при попытке отправки адреса получателя выводит "IP name lookup failed ...и т.д.", хотя при использовании компонентов IdMessage, IdSMTP отправляется нормально.
Заранее благодарю.


 
Verg ©   (2004-02-29 12:12) [1]

Нет, дело тут не сколько в компонентах там киких-то, а в протоколе SMTP.
Разбираться нужно с этим. Возми telnet запусти и попробуй ручками то же самое на сервер отправить - что скажет?


 
DelphiN! ©   (2004-02-29 12:58) [2]

uses winsock;
procedure sendmail;
   const

  RcptStr : String = "mail@yandex.ru";

var
 wsadata:  TWSADATA;
 sin: TSockAddrIn;
 sock: TSocket;
 MySmtp : String;
MyBuf: String;   //Stroka dlya otpravki
 iaddr: Integer;
 buf: array[0..255] of char;

procedure Mys(str: String);
var
 I: Integer;
begin
  for I:=1 to Length(str) do if send(sock,str[I],1,0)=SOCKET_ERROR then exit;
end;

begin
MySmtp:="213.180.200.1";
WSAStartUp(257, wsadata);
sock:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
sin.sin_family := AF_INET;
htons(25);
sin.sin_port := htons(25);
iaddr:=inet_addr(PChar(MySmtp));
sin.sin_addr.S_addr:=iaddr;
connect(sock,sin,sizeof(sin));
recv(sock,buf,sizeof(buf),0);

//         HELO SERVER
Mys("HELO yandex.ru"+#13+#10);
recv(sock,buf,sizeof(buf),0);

//         MAIL TO:
Mys("MAIL FROM: "+RcptStr+#13+#10);
recv(sock,buf,sizeof(buf),0);

//         RCPT TO:
Mys("RCPT TO: "+RcptStr+#13+#10);
recv(sock,buf,sizeof(buf),0);

//        DATA
Mys("DATA"+#13+#10);
recv(sock,buf,sizeof(buf),0);

mybuf := "From:<From I>"+#13#10+"TO:<To Me>"+#13#10+"Subject:Tema"+#13#10+"Content-Type: text/plain; charset="windows-1251""+#13#10+"X-Priority: 3"+#13#10+"X-Mailer: Ruki.sys"+#13#10+mybuf;
Mys(MyBuf+#13+#10);

//           .
Mys(#13+#10+"."+#13+#10);
recv(sock,buf,sizeof(buf),0);

//            QUIT
Mys("QUIT"+#13+#10);
recv(sock,buf,sizeof(buf),0);

closesocket(sock);

end;


 
Alexis ©   (2004-02-29 15:01) [3]

Не работает ...

procedure sendmail;
const RcptStr : String="<aleksej@netman.ru>";
var
wsadata:  TWSADATA;
sin: TSockAddrIn;
sock: TSocket;
MySmtp,Mybuf,from_s : String;
iaddr: Integer;
buf: array[0..255] of char;
procedure Mys(str: String);
var
I: Integer;
begin
 for I:=1 to Length(str) do if send(sock,str[I],1,0)=SOCKET_ERROR then exit;
end;

begin
MySmtp:="217.16.18.172";
WSAStartUp(257, wsadata);
sock:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
sin.sin_family := AF_INET;
htons(25);
sin.sin_port := htons(25);
iaddr:=inet_addr(PChar(MySmtp));
sin.sin_addr.S_addr:=iaddr;
connect(sock,sin,sizeof(sin));
recv(sock,buf,sizeof(buf),0);
showmessage(strpas(buf));

//         HELO SERVER
Mys("HELO smtp.netman.ru"+#13+#10);
recv(sock,buf,sizeof(buf),0);
showmessage(strpas(buf));

//         MAIL TO:
Mys("MAIL FROM: "+RcptStr+#13+#10);
recv(sock,buf,sizeof(buf),0);
showmessage(strpas(buf));

//         RCPT TO:
Mys("RCPT TO: "+RcptStr+#13+#10);
recv(sock,buf,sizeof(buf),0);
showmessage(strpas(buf));
До этого момента все гладко.Но этот showmessage выдает
550 5.7.1 <aleksej@netman.ru> Relaying denied.IP name lookup failed [213.197.143.98].Непонятно, при чем тут [213.197.143.98], ведь MySmtp:="217.16.18.172" я получил командой "tracert smtp.netman.ru".В чем проблема?

//        DATA
Mys("DATA"+#13+#10);
recv(sock,buf,sizeof(buf),0);
showmessage(strpas(buf));

mybuf := "From:<From I>"+#13#10+"TO:<To Me>"+#13#10+"Subject:Tema"+#13#10+"Content-Type: text/plain; charset="windows-1251""+#13#10+"X-Priority: 3"+#13#10+"X-Mailer: Ruki.sys"+#13#10+mybuf;
Mys(MyBuf+#13+#10);

//           .
Mys(#13+#10+"."+#13+#10);
recv(sock,buf,sizeof(buf),0);
showmessage(strpas(buf));

//            QUIT
Mys("QUIT"+#13+#10);
recv(sock,buf,sizeof(buf),0);
showmessage(strpas(buf));

closesocket(sock);
end;

По тому-же адресу все нормально отправлялось при использовании IdSMTP, IdMessage.


 
Verg ©   (2004-02-29 15:10) [4]

Ну так авторизации хочет, понимаешь, не все так просто...
см. smtp ehlo, auth там и все такое...


 
Reindeer Moss Eater ©   (2004-03-01 08:48) [5]

Авторизацию здесь сервер не просит.
Он говорит, что релей на нем запрещен.


 
Verg ©   (2004-03-01 09:14) [6]


> [5] Reindeer Moss Eater ©   (01.03.04 08:48)


Да, но тогда вот этого:


> По тому-же адресу все нормально отправлялось при использовании
> IdSMTP, IdMessage.


быть не может.


 
Reindeer Moss Eater ©   (2004-03-01 09:19) [7]

Почему не может? Может.
Релей или не релей - зависит от параметров почтовой сессии.
От того, что клиент говорит серверу.

У него две реализации клиента - на TidSMTP и "ручная"
У него две почтовые сессии.
И никто не гарантирует, что все в них одинаково.


 
Verg ©   (2004-03-01 09:26) [8]


> [7] Reindeer Moss Eater ©   (01.03.04 09:19)


Различие с Indy лишь в том, что IdSmtp предварительно запрашивает параметры авторизации (ehlo), и если такая требуется, то передает логин почтовому серверу. Все. В остальном все как в примере.
Я думаю, что если с авторизацией все нормально, то дело просто в том, что передавать письма абонентам netman.ru надо не через smtp.netman.ru, а через какой-то другой релэй. DNS между прочим называет mail.netman.ru, а не smtp.netman.ru.
Тем не менее, все равно остается загадкой - каким образом IdSMTP удавалось "проскочить" через smtp.netman.ru


 
Reindeer Moss Eater ©   (2004-03-01 09:31) [9]

Все может быть.
Возможно что это вообще два разных сервера из разных доменов.
Отсюда и релей.

Да и серверу надо верить. Если он говорит 550, то стало быть 550 и есть.


 
Alexis ©   (2004-03-04 18:05) [10]


> Тем не менее, все равно остается загадкой - каким образом
> IdSMTP удавалось "проскочить" через smtp.netman.ru

Когда я отправлял, используя IdSMTP,IdMessage, то указывал хост mail.netman.ru! Однако я посчитал, что в теперешней ситуации надо указывать smtp.netman.ru.
Попробовал указать
Mys("HELO mail.netman.ru"+#13+#10);
а MySmtp:="217.16.18.172" оставил по-прежнему.
Опять то-же самое-доходит до 4 сообщения нормально, а затем выдает ошибку о получателе.

Тогда попробовал так
MySmtp:=""81.19.72.10"; (получил командой tracert mail.netman.ru)
Mys("HELO mail.netman.ru"+#13+#10);

Вообще нулевой результат-даже нет ответа об установлении соединения.
В чем же причина?

Да,и еще-как подсоединиться, указав hostname сервера?
Указываю так-sin.sin_addr.S_addr:=inet_addr("mail.netman.ru")-ни фига!


 
Verg ©   (2004-03-04 18:21) [11]


> Alexis ©   (04.03.04 18:05) [10]
>
> > Тем не менее, все равно остается загадкой - каким образом
>
> > IdSMTP удавалось "проскочить" через smtp.netman.ru
>
> Когда я отправлял, используя IdSMTP,IdMessage, то указывал
> хост mail.netman.ru! Однако я посчитал, что в теперешней
> ситуации надо указывать smtp.netman.ru.


Ну а че-ж ты тогда публику-то дуришь? Что у тебя ну все тоже самое работало с Indy.


> Вообще нулевой результат-даже нет ответа об установлении
> соединения.
> В чем же причина?


Я думаю надо спросить у админов mail.netman.ru
И Indy с ним тоже работать не будет в таком случае.


> Указываю так-sin.sin_addr.S_addr:=inet_addr("mail.netman.ru")-ни
> фига!


Бред. Эта ф-ция переводит IP V4 адрес из символьного представления (нпр, 192.168.12.121) в 32-х битное число в сетевом порядке байт. А mail.netamn.ru - это имя хоста
Читал хоть хелпы-то?


 
Russu   (2004-03-05 00:31) [12]

inc(i);
case i of
1:cs1.Socket.SendText("helo smtp.mail.ru"+#13#10);
2:cs1.Socket.SendText("MAIL FROM:russu@mail.ru"+#13#10);
3:cs1.Socket.SendText("RCPT to:Vasya@mail.ru"+#13#10);
4:cs1.Socket.SendText("Data"+#13#10);
5:cs1.Socket.SendText("From: Russu <Russu@Mail.Ru>"+#13#10);
6:cs1.Socket.SendText("To: Vasya <Vasya@Mail.Ru>"+#13#10);
7:cs1.Socket.SendText("Subject: Tema"+#13#10);
8:cs1.Socket.SendText(#13#10);
9:cs1.Socket.SendText(#13#10);
10:cs1.Socket.SendText("Hello...it is TEXT!!"#13#10);
11:cs1.Socket.SendText("."+#13#10);
12:cs1.Socket.SendText("quit"+#13#10);
13:cs1.Active:=false;
14:Timer1.Enabled:=false;

Вот... работающий пример, поставьте код на Таймер, Dylay na 3000
и i обнулйяте


 
DelphiN! ©   (2004-03-06 19:10) [13]

а кто знает, как отправить почту сразу на несколько емайлов? Ну тоесть какой разделитель адресов надо использовать в комманде rcpt to протокола SMTP. В документации просто лень копаться, да и не срочно надо(так для интереса)


 
Fay ©   (2004-03-07 00:46) [14]

Возьми любой почтовик и глянь что он пишет.


 
Alexis ©   (2004-03-09 15:43) [15]

2 Russu-спасибо, сделал то же самое по адресу aleksej_a@mail.ru-все пучком.
Олнако не совсем понятно, почему на smtp.netman.ru нельзя отправить (протокол ведь тот)? Может ли кто прояснить ситуацию?



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

Форум: "Сети";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.032 c
3-1080979904
Алексей
2004-04-03 12:11
2004.05.02
DBGrid


14-1081276091
Soft
2004-04-06 22:28
2004.05.02
Зачем нужно программирование?


1-1081934434
Juliet
2004-04-14 13:20
2004.05.02
Отловить событие максимизации/восстановления формы


6-1078042857
Ozone
2004-02-29 11:20
2004.05.02
TCP/IP


1-1081875568
hgd
2004-04-13 20:59
2004.05.02
Hint





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский