![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему не работает след. код (отправка почты) [D7, WinXP]
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]?? всмысле ,примерчик можно?