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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.58 MB
Время: 0.048 c
3-1170177651
SoulLess
2007-01-30 20:20
2007.04.22
DBGrid с многострочными заголовками


2-1175339108
Xmen
2007-03-31 15:05
2007.04.22
QuickReport


15-1174738380
Углук
2007-03-24 15:13
2007.04.22
Как сменить окно частот в БПФ?


15-1174882156
KSergey
2007-03-26 08:09
2007.04.22
Детали лицензий на софт


2-1175671150
Riply
2007-04-04 11:19
2007.04.22
Определение последнего вызова "колбэка" BindIoCompletionCallback





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский