Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых)

 eXeL@B —› Программирование —› WinSock Delphi
Посл.ответ Сообщение

Ранг: 3.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 декабря 2006 12:31
· Личное сообщение · #1

Как пройти авторизацию на smtp сервере для отправки почты?



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 21 декабря 2006 12:40
· Личное сообщение · #2

В такой последовательности отсылаем пакеты
EHLO _Nazvanie_
RSET
AUTH LOGIN
base64(_login_)
base64(_pass_)



Ранг: 3.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 декабря 2006 12:46
· Личное сообщение · #3

спасибо, сечас попробую написать



Ранг: 3.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 декабря 2006 12:52
· Личное сообщение · #4

а чем бы мне перекодировать строку в B64?
EHLO _Nazvanie_ // EHLO мы отсылаем сразу после helo, а название - это имя сервера?



Ранг: 3.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 декабря 2006 12:59
· Личное сообщение · #5

так, ну вот сейчас попробовал, запустил.
с сервером поздоровались успешно, сервер ответил expected "HELO <мои данные подключения от прова>",
затем то же самое, но с EHLO, затем 250-size <число> на RSET, далее описывать не буду.
Можно пример кода?



Ранг: 3.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 декабря 2006 13:06
· Личное сообщение · #6

вот скрин нашего недолгого общения

0a3e_21.12.2006_CRACKLAB.rU.tgz - scr.gif



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 21 декабря 2006 13:11 · Поправил: Veliant
· Личное сообщение · #7

а base64 для кого написано?
Вот мой коннект телнетом:
220 mail.ru ESMTP Fri, 22 Dec 2006 00:13:28 +0300
EHLO my
250-mx1.mail.ru Hello my [89.19.160.7]
250-SIZE 10485760
250-8BITMIME
250-AUTH PLAIN LOGIN
250 PIPELINING
RSET
250 Reset OK
AUTH LOGIN
334 VXNlcm5hbWU6
cmFzc2lsa2E5MA==
334 UGFzc3dvcmQ6
cmFzc2lsa2E=
235 Authentication succeeded


P.S.
Логин и пасс из примера особой ценности не представляют

PPS
Вот пример на дельфях. CS1 - TClientSocket....... Извиняюсь за длинный листинг

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
CS1: TClientSocket;
Edit1: TEdit;
Edit2: TEdit;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure CS1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type TAByte = array [0..maxInt-1] of byte;
type TPAByte = ^TAByte;

var
Form1: TForm1;

implementation

{$R *.dfm}
function Encode(data:string) : string; overload;
const b64 : array [0..63] of char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
var ic,len : integer;
pi, po : TPAByte;
c1 : dword;
begin
len:=length(data);
if len > 0 then begin
SetLength(result, ((len + 2) div 3) * 4);
pi := pointer(data);
po := pointer(result);
for ic := 1 to len div 3 do begin
c1 := pi^[0] shl 16 + pi^[1] shl 8 + pi^[2];
po^[0] := byte(b64[(c1 shr 18) and $3f]);
po^[1] := byte(b64[(c1 shr 12) and $3f]);
po^[2] := byte(b64[(c1 shr 6) and $3f]);
po^[3] := byte(b64[(c1 ) and $3f]);
inc(dword(po), 4);
inc(dword(pi), 3);
end;
case len mod 3 of
1 : begin
c1 := pi^[0] shl 16;
po^[0] := byte(b64[(c1 shr 18) and $3f]);
po^[1] := byte(b64[(c1 shr 12) and $3f]);
po^[2] := byte('=');
po^[3] := byte('=');
end;
2 : begin
c1 := pi^[0] shl 16 + pi^[1] shl 8;
po^[0] := byte(b64[(c1 shr 18) and $3f]);
po^[1] := byte(b64[(c1 shr 12) and $3f]);
po^[2] := byte(b64[(c1 shr 6) and $3f]);
po^[3] := byte('=');
end;
end;
end else
result := '';
end;

Procedure Send(str:string);
begin
Form1.CS1.Socket.SendText(str+#13#10);
Form1.Memo1.Lines.Add(str);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
CS1.Active:=true;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CS1.Active:=false;
end;

procedure TForm1.CS1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
Memo1.Lines.Add(Socket.ReceiveText);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Send('EHLO Test');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Send('RSET');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Send('AUTH LOGIN');
Send(encode(Edit1.Text));
Send(encode(Edit2.Text));
end;

end.





Ранг: 3.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 декабря 2006 13:49
· Личное сообщение · #8

Спасибо большое, на этом, я думаю, вопрос исчерпан.


 eXeL@B —› Программирование —› WinSock Delphi
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати