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.


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

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


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

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


KilkennyCat   (2006-07-22 12:25:00) [23]

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


Ketmar   (2006-07-22 12:13:00) [24]

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


KilkennyCat   (2006-07-22 11:09:00) [25]

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


Ketmar   (2006-07-22 11:05:00) [26]

цитата из справки: 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:02:00) [27]

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


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


Ketmar   (2006-07-22 10:59:00) [28]

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

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

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

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


KilkennyCat   (2006-07-22 10:53:00) [29]

Да можно и по сабжевому коду работать... если ошибки исправить.
Хотя 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:44:00) [30]

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

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


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


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

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


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

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


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

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

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

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

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


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

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


KilkennyCat   (2006-07-21 23:42:00) [35]

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


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

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


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

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


KilkennyCat   (2006-07-21 23:04:00) [38]

> if result=truethen edit1.Text:=('wew');


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


KilkennyCat   (2006-07-21 23:02:00) [39]

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


предлагаю:

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


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

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


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

Наверх

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