Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему не работает след. код (отправка почты) [D7, WinXP]


Страницы:   1 2 3

bobbi ©   (2006-07-21 22:52:00) 

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

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:=('');
dest:=('');
subject:=('test mail');
body:=('sdjfbsdjkfjksdfhjsdf');

begin
 try
   result := false;
   { èíèöèàëèçàöèÿ ñîêåòà }
   WSAStartUp(257, WSAData);
   Sock := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
   if Sock = INVALID_SOCKET then
     Exit;

   { óñòàíàâëèâàåì õîñò è ïîðò ñåðâåðà }
   res := inet_addr(PChar(smtp));
   if res 0 then
     Exit;

   { ïðèâåòñòâèå ñåðâåðà }
   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;

   { îòïðàâëÿåì òåêñò ñîîáùåíèÿ }
   senddata('Subject:' + subject + cl + cl + body + cl + '.');
   if not recvdata('250') then
     Exit;

   { îòêëþ÷àåìñÿ îò ñåðâåðà }
   senddata('QUIT' + cl);

   result := true;
 finally
   { óáèâàåì ñîêåò }
   closesocket(sock);
   WSACleanup;
 end;
 end;

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

end.


Ketmar   (2006-10-27 19:37:00) [1]

>[40] Dmitry_177 27-Oct-2006, 19:29
ты бы литературу почитал. количество "кажется" тогда резко уменьшается.


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

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


Ketmar   (2006-10-27 19:25:00) [3]

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


Ketmar   (2006-10-27 19:23:00) [4]

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


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

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


Ketmar   (2006-10-27 19:09:00) [6]

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


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

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


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

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


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

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


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

recv из WinSock


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

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


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

А почему мне приходят какие-то каракули(в 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: Ш–|˜


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


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


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

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


Ketmar   (2006-10-23 21:37:00) [14]

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


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

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


Ketmar   (2006-10-23 20:54:00) [16]

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


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

или вот здесь http://www.delphimaster.ru/cgi-bin/forum.pl?id=1153968464&n=4 FFx01 ©   (27.07.06 06:47)тут я тоже этого не увидел...


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

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


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

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


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

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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо