Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.22;
Скачать: CL | DM;

Вниз

Почему не работает след. код (отправка почты)   Найти похожие ветки 

 
bobbi   (2006-07-21 22:52) [0]

прога компилица но толку от этого нет

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls,winsock, ExtCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Edit1: TEdit;
   Timer1: TTimer;
   procedure Button1Click(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
WSAData: TWSAData;
 Host: TSockAddrIn;
 Sock: TSocket;
 res: Integer;
 buff: array[1..255] of Char;
 result:bool;
 smtp: string;
 port: integer;
  from, dest, subject,
 body: string;

implementation

const
 cl = #13#10;

{$R *.dfm}

{ îòïðàâëÿåì äàííûå ÷åðåç ñîêåò }
 procedure senddata(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;

 { ïîëó÷àåì îòâåò îò êîìàíäû }
 function recvdata(accept: string): bool;
 var
   buff: array[1..255] of Char;
 begin
   res := recv(Sock, buff, SizeOf(buff), 0);
   Result := (Res = SOCKET_ERROR) or (Copy(buff, 1, 3) = accept);
 end;

procedure TForm1.Button1Click(Sender: TObject);

begin

{
smtp - ip àäðåñ smtp ñåðâåðà
port - ïîðò smtp ñåðâåðà, ïî óìîë÷àíèþ 25
from - àäðåñ îòïðàâèòåëÿ
dest - àäðåñ ïîëó÷àòåëÿ
subject - òåìà ïèñüìà
body - òåêñò ïèñìà
Âîçâðàùàåò True åñëè ïèñüìî áûëî óñïåøíî îòïðàâëåííî...
}

smtp:=("smtp.mail.ru");
port:=25;
from:=("<somemail@mail.ru>");
dest:=("<somemail2@mail.ru>");
subject:=("test mail");
body:=("sdjfbsdjkfjksdfhjsdf");

begin
 try
   result := false;
   { &#232;&#237;&#232;&#246;&#232;&#224;&#235;&#232;&#231;&#224;&#246;&#232;&#255; &#241;&#238;&#234;&#229;&#242;&#224; }
   WSAStartUp(257, WSAData);
   Sock := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
   if Sock = INVALID_SOCKET then
     Exit;

   { &#243;&#241;&#242;&#224;&#237;&#224;&#226;&#235;&#232;&#226;&#224;&#229;&#236; &#245;&#238;&#241;&#242; &#232; &#239;&#238;&#240;&#242; &#241;&#229;&#240;&#226;&#229;&#240;&#224; }
   res := inet_addr(PChar(smtp));
   if res <= 0 then
     exit;

   Host.sin_family := AF_INET;
   Host.sin_port := htons(port);
   Host.sin_addr.S_addr := res;

   { &#239;&#238;&#228;&#234;&#235;&#254;&#247;&#224;&#229;&#236;&#241;&#255; &#234; &#241;&#229;&#240;&#226;&#229;&#240;&#243; }
   if connect(Sock, Host, SizeOf(Host)) > 0 then
     Exit;

   { &#239;&#240;&#232;&#226;&#229;&#242;&#241;&#242;&#226;&#232;&#229; &#241;&#229;&#240;&#226;&#229;&#240;&#224; }
   if not recvdata("220") then
     Exit;

   { EHLO }
   senddata("EHLO server" + cl);
   if not recvdata("250") then
     Exit;

   { AUTH LOGIN }
   senddata("AUTH LOGIN" + cl);
   if not recvdata("334") then
     Exit;

   {  login base 64}
   senddata(" base64 login dfgdfghdfh" + cl);
   if not recvdata("334") then
     Exit;

   {  password base 64}
   senddata("base 64 pass fdgjdfkghjkdfghjkdfghjkdf" + cl);
   if not recvdata("235") then
     Exit;

   { MAIL FROM: }
   senddata("MAIL FROM:" + from + cl);
   if not recvdata("250") then
     Exit;

   { RCPT TO: }
   senddata("RCPT TO:" + dest + cl);
   if not recvdata("250") then
     Exit;

   { DATA }
   senddata("DATA" + cl);
   if not recvdata("354") then
     Exit;

   { &#238;&#242;&#239;&#240;&#224;&#226;&#235;&#255;&#229;&#236; &#242;&#229;&#234;&#241;&#242; &#241;&#238;&#238;&#225;&#249;&#229;&#237;&#232;&#255; }
   senddata("Subject:" + subject + cl + cl + body + cl + ".");
   if not recvdata("250") then
     Exit;

   { &#238;&#242;&#234;&#235;&#254;&#247;&#224;&#229;&#236;&#241;&#255; &#238;&#242; &#241;&#229;&#240;&#226;&#229;&#240;&#224; }
   senddata("QUIT" + cl);

   result := true;
 finally
   { &#243;&#225;&#232;&#226;&#224;&#229;&#236; &#241;&#238;&#234;&#229;&#242; }
   closesocket(sock);
   WSACleanup;
 end;
 end;

   end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if result=true then edit1.Text:=("wew");
end;

end.


 
KilkennyCat ©   (2006-07-21 22:57) [1]

может, стоит вместо exit поставить сообщения? Тогда и вопрос, возможно, исчезнет...


 
bobbi   (2006-07-21 22:58) [2]

?? всмысле ,примерчик можно?


 
KilkennyCat ©   (2006-07-21 23:02) [3]

у Вас:
>  senddata("DATA" + cl);
>   if not recvdata("354") then
>     Exit;


предлагаю:

 senddata("DATA" + cl);
  if not recvdata("354") then Showmessage("ДАТА не прокатило");


 
KilkennyCat ©   (2006-07-21 23:04) [4]

> if result=true then edit1.Text:=("wew");


и это некрасиво тоже (а масло масляное?) . достаточно: if result then edit1.Text:=("wew");


 
bobbi   (2006-07-21 23:24) [5]

так косяк в сенд дата похоже ........  а что может быть?


 
KilkennyCat ©   (2006-07-21 23:36) [6]

Ну, я думаю, стоит прочитать http://www.delphimaster.ru/articles/sockets/index.html


 
KilkennyCat ©   (2006-07-21 23:42) [7]

сорри, ошибся.
http://www.softzenware.com/visual/visual16.html


 
bobbi   (2006-07-21 23:52) [8]

щас глянем спс , у меня у чан кипит........


 
Ketmar ©   (2006-07-22 00:06) [9]

да дело даже не в том, что некрасиво. дело в том, что неверно в корне.

хинт: recv может получить меньше, нежели просили.
хинт: recv может весело ожидать строку ровно в 255 байтиков. ответы сервера всегда такой длины?

дальше уже не читал. %-)

зыж IdSMTP никак не устроит?


 
rlzz   (2006-07-22 00:10) [10]

мне не визуалка нужна


 
bobbi   (2006-07-22 00:11) [11]

мне не визуалка нужна


 
Ketmar ©   (2006-07-22 10:44) [12]

а при чём тут какая-то "визуалка"? F1, "create controls in run-time". или, для совсем грустноленивых:

var
 ms: TIdSMTP;
begin
 ...
 ms := TIdSMTP.Create(nil);
 ..
 ms.Free();
end.


зыж код нерабочий, приведён просто как хинт. %-)


 
KilkennyCat ©   (2006-07-22 10:53) [13]

Да можно и по сабжевому коду работать... если ошибки исправить.
Хотя idSMTP проще.


> var
>   i: integer;
> begin
>   for i := 1 to Length(str) do
>     if send(Sock, str[i], 1, 0) = SOCKET_ERROR then
>       exit;
> end;


Что-то мне кажется, что здесь цикл ну совершенно лишний.


 
Ketmar ©   (2006-07-22 10:59) [14]

не лишний. send тоже может отправить не весь буфер. %-) этот цикл как раз гарантирует отправку всей строки. по одному символу, чтобы жизнь мёдом не казалась. %-)

а читалку надо переделать полностью. хотя бы таким же образом -- читать посимвольно, прекращать при получении символа #10 (не знаю, есть ли сервера, оканчивающие строки одним #13 -- это, в принципе, некорректно; однако я обычно учитываю и такие варианты).

далее: для полностью корректной работы надо разбирать MX-записи в DNS. потому что реально сервер может быть совсем не по тому адресу, по которому мы думаем. следовательно, надо ещё писать кусок для работы с DNS.

по-моему, даже вышеперечисленого хватит, чтобы не заморачиваться ручным написанием, а взять компоненту. %-)


 
KilkennyCat ©   (2006-07-22 11:02) [15]

> send тоже может отправить не весь буфер


есть ограничение на буфер?


 
Ketmar ©   (2006-07-22 11:05) [16]

цитата из справки: If no error occurs, send returns the total number of bytes sent. (Note that this can be less than the number indicated by len.)


 
KilkennyCat ©   (2006-07-22 11:09) [17]

Ну так, значит и при отправке всей строки мы все равно поймем, вся она ушла, или нет.


 
Ketmar ©   (2006-07-22 12:13) [18]

натурально, поймём. просто посимвольно -- код проще. иначе придётся делать логику частичной отправки буфера. %-)


 
KilkennyCat ©   (2006-07-22 12:25) [19]

Угу. предположим, что тута на середине не отправилось. где логика доотправки?
и чем же сложна логика, при отправке сразу всей строки? сложностью s := copy(s, SendReturn, Length(s) - sendreturn - 1)?


 
Ketmar ©   (2006-07-22 12:44) [20]

да ничем не сложна. я просто смотрел на код автора и телепатировал. %-)


 
FFx01 ©   (2006-07-24 12:28) [21]

Не пытайся выслать на mail.ru эта фишка не проходит, посылай на gmail.ru


 
Dmitry_177   (2006-10-23 20:42) [22]

Интернесно, а как тут происходит авторизация, где передается пароль?


 
Ketmar ©   (2006-10-23 20:46) [23]

>[22] Dmitry_177 23-Oct-2006, 20:42
>Интернесно, а как тут происходит авторизация, где
>передается пароль?
ого, какая давняя ветка. а "тут" -- это где? в коде? на форуме? в космосе? %-)


 
Dmitry_177   (2006-10-23 20:48) [24]

в коде bobbi   (21.07.06 22:52) где реализовано на WinSock


 
Dmitry_177   (2006-10-23 20:50) [25]

или вот здесь http://delphimaster.net/view/6-1153968464/ FFx01 ©   (27.07.06 06:47) тут я тоже этого не увидел...


 
Ketmar ©   (2006-10-23 20:54) [26]

я подозреваю, что автор вопроса тебе не ответит...


 
Dmitry_177   (2006-10-23 21:33) [27]

А как вообще должен передаваться пароль?


 
Ketmar ©   (2006-10-23 21:37) [28]

>[27] Dmitry_177 23-Oct-2006, 21:33
>А как вообще должен передаваться пароль?
сильно подозреваю, что об этом знает rfc. %-)


 
Dmitrij_K   (2006-10-23 21:39) [29]


> А как вообще должен передаваться пароль?

http://forum.vingrad.ru/index.php?showtopic=116062&view=findpost&p=893223


 
Dmitry_177   (2006-10-27 13:31) [30]

А почему мне приходят какие-то каракули(в Memo отображаю диалог с сервером)?

function SMTPSendString(AMailSocket: TSocket; Str: String): Boolean;
var
 Buffer: Array[1..1024] Of Byte;
 Err: Integer;
Begin
 Result := false;
 ZeroMemory(@Buffer, SizeOf(Buffer));
 if Length(Str) > 1000 then Exit;
 for Err := 1 to Length(Str) do Buffer[Err] := Ord(Str[Err]);
 Buffer[Err] := 13;
 Buffer[Err+1] := 10;
 Err := Send(AMailSocket, Buffer, Err + 1, 0);
 if Err > 0 then Result := true;
End;

...

var
 WSAData: TWSAData;
 MailSock: TSocket;
 SMTPServer: TSockAddrIn;
 Buff: array[1..255] of Char;
begin
 WSAStartUp($0101, WSAData);
 MailSock := Socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
 if MailSock = INVALID_SOCKET then Exit;

 FillChar(SMTPServer, SizeOf(SMTPServer), 0);
 SMTPServer.sin_family := AF_INET;
 SMTPServer.sin_port := htons(25);
 SMTPServer.sin_addr.S_addr := inet_addr(PChar("smtp.mail.ru"));

 Connect(MailSock, SMTPServer, SizeOf(SMTPServer));

 SMTPSendString(MailSock, "HELO mail.ru" + #13#10);
 Memo1.Lines.Add("Send: HELO mail.ru");
 recv(MailSock, Buff, SizeOf(Buff), 0);
 Memo1.Lines.Add("Recv: " + Buff);

...
end;


В Memo:

Send: HELO mail.ru
Recv: Ш–|&#152;


функция recv почему-то равна -1


 
Mirage   (2006-10-27 14:23) [31]

>[30] Dmitry_177 27-Oct-2006, 13:31
>функция recv почему-то равна -1
какая интересная функция. равна -1. ты, часом, не на Форте пишешь?


 
Dmitry_177   (2006-10-27 14:49) [32]

recv из WinSock


 
Mirage   (2006-10-27 14:59) [33]

>[32] Dmitry_177 27-Oct-2006, 14:49
>recv из WinSock
проверил дизассемблером. не равна она -1. никак. или у тебя какой-то странный winsock.


 
Falcao   (2006-10-27 16:15) [34]

Так не функция ведь равна? Функция вообще ни чему не мб равна ;).
А это возвращаемое значение. Так-то это SOCKET_ERROR.


 
Dmitry_177   (2006-10-27 18:58) [35]

А как можно "подождать" ответ от сервера? Тут везде в примерах после отправки Send идет сразу прием Recv, а вдруг сервер не успеет отправить информацию? Мне кажется тогда зависнет программа в ожидании ответа от сервера... как можно с этим справиться?


 
Ketmar ©   (2006-10-27 19:09) [36]

>[35] Dmitry_177 27-Oct-2006, 18:58
потому что вы, батенька, не код написали, а бред.


 
Dmitry_177   (2006-10-27 19:22) [37]

ну всеже, как делают ожитание ответа от сервера?


 
Ketmar ©   (2006-10-27 19:23) [38]

>[37] Dmitry_177 27-Oct-2006, 19:22
>ну всеже, как делают ожитание ответа от сервера?
какого, нафиг, ответа? ты сначала посмотри, чем сервер кормишь. потом реши, в каком режиме тебе сокеты нужны. а потом уже вопрошай конкретно.


 
Ketmar ©   (2006-10-27 19:25) [39]

хм. ещё. а кто тебе наврал, что recv() формирует asciiz-строку? и что recv() всегда получает ровно столько, сколько запросили? тебя, по-ходу, сервер вообще нафиг послал, если recv() -1 вернула. а ты упорный, ты лбом в закрытую дверь с размаху стучишь. и плачешь потом, что голова болит.


 
Dmitry_177   (2006-10-27 19:29) [40]

я уже разобрался с приемом сообщений... все работает, просто из за медленной скорости в интернете, мне кажется бывает иногда проходит письмо, а бывает "зависает", мне кажется ожитает ответа от сервера, т.к. в тот момент когда была проверка еще небыло сообщения от сервера...



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

Текущий архив: 2007.04.22;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.084 c
2-1175687621
Мимопроходящий
2007-04-04 15:53
2007.04.22
Поиск подстроки в тексте


15-1175172963
ProgRAMmer Dimonych
2007-03-29 16:56
2007.04.22
Стесняюсь спросить (С) Староконь... :)


1-1172567109
Тфьу
2007-02-27 12:05
2007.04.22
Создание библиотек bpl


15-1174682350
GanibalLector
2007-03-23 23:39
2007.04.22
Переходник USB - RS232 (COM)


2-1175256902
Alex_C
2007-03-30 16:15
2007.04.22
Указатель на открытый массив