Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda con este proyecto!!! (https://www.clubdelphi.com/foros/showthread.php?t=85729)

FideRosado 24-04-2014 18:26:03

Ayuda con este proyecto!!!
 
Hola amigos, aca estoy tratando de entender este proyecto jje. se trata nadamenos que de un servidor POP para mis clientes de la red, estoy pensando en usar tambien SMTP server.

aca estoy viendo algo parecido solo que no logro entender bien..
espero que alguno de ustedes se interesen en el, ya que es algo muy util..

POP server
http://www.devarticles.com/c/a/Delph...a-POP3-Server/

SMTP server
http://www.devarticles.com/c/a/Delph...n-SMTP-Server/

FideRosado 24-04-2014 18:29:41

Base de datos
 
Pues tambien estoy pensando en vincular MySQL con dicha aplicacion, ya que es facil de trabajar y ademas , en la webclient uso php para recojer los datos, y solo la aplicacion hace su trabajo ejej..

FideRosado 24-04-2014 22:52:56

IdPOP3
 
en el componente idpop3 se encuentra esta funccion

Código Delphi [-]
function TIdPOP3.CheckMessages: longint;
var
  s: string;
begin
  Result := 0;
  SendCmd('STAT', wsOk);    {Do not Localize}
  // Only gets here if exception is not raised
  s := LastCmdResult.Text[0];
  if Length(s) > 0 then begin
    Result := StrToInt(Copy(s, 1, IndyPos(' ', s) - 1));    {Do not Localize}
  end;
end;

pero que sucede pues que le envio este parametro en esta forma y sus posibles variantes y devuelve error

Código Delphi [-]
procedure TForm1.IdPOP3Server1STAT(ASender: TIdCommand);
begin
  ASender.Reply.SetReply( OK , IntToStr(40)+'  '+IntToStr(40) );// esta es una
  ASender.Reply.SetReply( 1 , IntToStr(40)+'  '+IntToStr(40) );// esta es la otra
end;

como veran, no me sale.. si keda con el OK me da error en el OK..
ahy alguien aca que sepa como es..

FideRosado 29-04-2014 21:05:07

respuesta
 
hola necesito que ustedes me revisen estas lineas y me diga si estan correctas,pues creo que me falte algo porque no me funcionan.

procedure TfrmMain.IdPOP3Server1TOP(ASender: TIdCommand; AMessageNum, ANumLines: Integer);
begin
// Aquí es donde el client ha pedido a las líneas TOP X de una determinado Mensaje a ser enviado a ellos

if (AMessageNum > 0) AND (ANumLines > 0) then begin

ASender.Thread.Connection.WriteLn('+OK');
ASender.Thread.Connection.WriteLn('qFrom: raulrr91@gmail.com');
ASender.Thread.Connection.WriteLn('To: fiderosado@gmail.com ');
ASender.Thread.Connection.WriteLn('Subject: este es el top');
ASender.Thread.Connection.WriteLn('');
ASender.Thread.Connection.WriteLn('Message: de cojones');

end;
end;

Casimiro Notevi 29-04-2014 21:39:31

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

FideRosado 29-04-2014 23:03:23

respuesta
 
ke sabes de este tema casimiro.

Casimiro Notevi 29-04-2014 23:08:02

No sé exactamente qué estás haciendo, qué problema tienes, qué no te funciona, etc.

FideRosado 29-04-2014 23:28:38

respuesta
 
segun esto del rfc1939 te pone una serie de pasos para echara trabajar un server pop, pero hay algo que me fall y no se lo que es,
aca les dejo la unit para que la repasen y prueben ustedes mismos con la ayuda de POPServer demo en indy 9..

ya he echo como veran que autentifique contra la db que esta en mysql server, y entrega el stat pero no pasa de ahi. pueden usar cualquier tipo de cliente email aunque recomiendo usar el maiclient demo que tambien se encuentra ahi. basicamente todos deben hacer lo mismo..

por favor echenme una mano sino de esta salgo loco jejeje.

Código Delphi [-]
{ $HDR$} 
unit MainFrm;
  interface
  uses   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,   IdBaseComponent, IdComponent, IdTCPServer, IdPOP3Server, StdCtrls,   IdMessage, ZSqlMonitor, DB, ZAbstractRODataset, ZAbstractDataset,   ZDataset, ZConnection;  type   TfrmMain = class(TForm)     btnExit: TButton;     IdPOP3Server1: TIdPOP3Server;     
Button1: TButton;     Button2: TButton; 
    ZConnection1: TZConnection;     ZQuery1: TZQuery;
     DataSource1: TDataSource;     ZSQLMonitor1: TZSQLMonitor;     IdMessage1: TIdMessage;
     alogs: TMemo;     Button3: TButton;     procedure btnExitClick(Sender: TObject);
     procedure IdPOP3Server1Connect(AThread: TIdPeerThread);
     procedure FormActivate(Sender: TObject);
     procedure IdPOP3Server1CheckUser(AThread: TIdPeerThread;       LThread: TIdPOP3ServerThread);
     procedure IdPOP3Server1DELE(ASender: TIdCommand; AMessageNum: Integer);
     procedure IdPOP3Server1Exception(AThread: TIdPeerThread       AException: Exception);
     procedure IdPOP3Server1LIST(ASender: TIdCommand; AMessageNum: Integer);
     procedure IdPOP3Server1QUIT(ASender: TIdCommand); 
     procedure IdPOP3Server1RETR(ASender: TIdCommand; AMessageNum: Integer);
     procedure IdPOP3Server1RSET(ASender: TIdCommand);
     procedure IdPOP3Server1STAT(ASender: TIdCommand);
     procedure IdPOP3Server1TOP(ASender: TIdCommand; AMessageNum,       ANumLines: Integer);
     procedure IdPOP3Server1UIDL(ASender: TIdCommand; AMessageNum: Integer);
     procedure Button1Click(Sender: TObject);
     procedure Button2Click(Sender: TObject);
     procedure ZSQLMonitor1LogTrace(Sender: TObject; Event: TZLoggingEvent);
     procedure IdPOP3Server1Disconnect(AThread: TIdPeerThread);
     private     { Private declarations }
     public     { Public declarations }
     procedure ConectToMYSQLserver;
     procedure DisConectToMYSQLserver;
   end;  
var   frmMain: TfrmMain;
     authuser,authpasw:string;
   NewCount,SizeM :integer; 
implementation  
{$R *.DFM}
  function GetLocalT: String; 
var    stSystemTime : TSystemTime;
 begin    
Windows.GetLocalTime( stSystemTime );    
Result := DateTimeToStr( SystemTimeToDateTime( stSystemTime ) ); 
end; 
 // CONECTAR SERVER MYSQL 
procedure TfrmMain.ConectToMYSQLserver; 
begin
 try   
ZConnection1.Disconnect;   
ZConnection1.HostName := '127.0.0.1';   
ZConnection1.Database := 'popserver';       
ZConnection1.User := 'user';   
ZConnection1.Password := 'pass';   
ZConnection1.Port:=3306;   
ZConnection1.Connect;   
alogs.Lines.Add(GetLocalT+' conectado MYSQL Server');   
except   
// ACA ESTA EL RESULTADO   
alogs.Lines.Add(GetLocalT+' error to conect MYSQL Server');      
next;   
end; 
end;  
// DESCONECTAR SERVER MYSQL 
procedure TfrmMain.DisConectToMYSQLserver; 
begin 
try   
if ZConnection1.Connected then 
begin   
ZConnection1.Disconnect;   
alogs.Lines.Add(GetLocalT+' desconectado MYSQL Server');   
end;   
except   
// ACA ESTA EL RESULTADO   
alogs.Lines.Add(GetLocalT+' error to disconect MYSQL Server');     
 next;   
end; 
end;  
 //If user presses exit button close socket and exit procedure 
TfrmMain.btnExitClick(Sender: TObject);
begin  
if IdPop3Server1.Active=True then   
IdPop3Server1.Active:=False;  
Application.Terminate; 
end;  
procedure TfrmMain.IdPOP3Server1Connect(AThread: TIdPeerThread); 
begin  
// Cuando un clinet conecta a nuestro servidor, debemos responder con + OK o ERR- 
// Establezca esta vía Greeting.Text en tiempo de ejecución, o posiblemente en OnBeforeCommandHandler? 
// También se puede desear para inicializar algunas vars mundiales aquí, establezca el cuadro POP3 a estado de bloqueo, etc  
alogs.Lines.Add(GetLocalT+' POP3Server-CONECT'); 
end;  
//Activate the server socket when activating server main window. 
procedure TfrmMain.FormActivate(Sender: TObject);
 begin
  IdPop3Server1.Active:=True; 
end;  
// This is where you validate the user/pass credentials of the user logging in 
procedure TfrmMain.IdPOP3Server1CheckUser(AThread: TIdPeerThread;   
LThread: TIdPOP3ServerThread); 
var 
RC:integer; 
begin    
authuser :=LThread.Username;   
authpasw :=LThread.Password;   
alogs.Lines.Add(GetLocalT+' POP3Server-CHECKUSER');   
alogs.Lines.Add(GetLocalT+' USER:'+authuser+' PASW:'+authpasw );  
// ConectToMYSQLserver;      
ZQuery1.Close;      ZQuery1.Fields.Clear;      ZQuery1.SQL.Text:='SELECT * FROM login WHERE user='''+authuser+''' AND pasw='''+authpasw+'''' ;      ZQuery1.ExecSQL;      ZQuery1.Open;      ZQuery1.First;  RC:=ZQuery1.RecordCount;  if RC = 0 then begin      alogs.Lines.Add(GetLocalT+ ' Authentication failed');  end else begin      alogs.Lines.Add(GetLocalT+ ' Authentication OK');      LThread.State := Trans;  end;  ZQuery1.Close; end;  // This is where the client program issues a delete command for a particular message procedure TfrmMain.IdPOP3Server1DELE(ASender: TIdCommand;   AMessageNum: Integer); begin  // Si se ha eliminado el mensaje, y luego volver un comando éxito de la siguiente manera; // ASender.Thread.Connection.Writeln ('+ OK - Mensaje' + IntToStr (AMessageNum) + 'borrado') // De lo contrario, si se produjo un error en eliminar el mensaje o el número de mensaje // No existió en el primer lugar, y luego devolver el siguiente: // ASender.Thread.Connection.Writeln ('-ERR - Mensaje' + IntToStr (AMessageNum) + 'no se eliminan porque .... [razón]') // Por lo general, los mensajes se eliminan después de ser recuperada desde el servidor pop3 // Esto se hace cuando senta cliente DELE comando después de recibirlo Comando // Cliente es algo así como DELE 1 lo que significa eliminar el mensaje 1 // Tenga en cuenta, usted no debe realmente borrar el mensaje en este momento, sólo lo marca como eliminado. // Las supresiones se debe manejar en el evento SALIR.   alogs.Lines.Add(GetLocalT+' POP3Server-DELE');  ASender.Thread.Connection.WriteLn('+OK message 1 deleted'); end;  procedure TfrmMain.IdPOP3Server1Exception(AThread: TIdPeerThread;   AException: Exception); begin // Handle any exceptions given by the thread here alogs.Lines.Add(GetLocalT+' POP3Server-exceptions'); end;  procedure TfrmMain.IdPOP3Server1LIST(ASender: TIdCommand;   AMessageNum: Integer); begin // antes de la recuperación de mensajes, el cliente solicita una lista de mensajes // El servidor responde con un + OK seguido por el número de entrega // mensajes y longitud de los mensajes en bytes. // Después de esto una separada lista de cada mensaje y su longitud se envía al cliente. // aquí sólo tenemos un mensaje, pero podemos continuar con el mensaje número y su longitud, una por línea y, // finalmente, un '.' carácter. // Formato de comandos del cliente es LISTA   alogs.Lines.Add(GetLocalT+' POP3Server-LIST');  ASender.Thread.Connection.WriteLn('OK 1 messages 40 octets');  ASender.Thread.Connection.WriteLn('1 40');  ASender.Thread.Connection.WriteLn('.');  // The trailing . line is IMPORTANT!! end;  procedure TfrmMain.IdPOP3Server1QUIT(ASender: TIdCommand); begin  // Este evento se dispara en un cliente SALIR (una desconexión correcta) // Aquí se debería eliminar los mensajes que se han marcado con el DELE.  alogs.Lines.Add(GetLocalT+' POP3Server-QUIT'); // NOTE: The +OK response is AUTOMATICALLY sent back to the client, and the connect dropped. end;  procedure TfrmMain.IdPOP3Server1RETR(ASender: TIdCommand;   AMessageNum: Integer); begin   // Cliente inicia la recuperación de cada mensaje mediante la emisión de un comando RETR  // Al servidor. Servidor responderá + OK y continuará enviando  // Mensaje en sí mismo. Cada mensaje se guarda en una base de datos a la llegada uppon  // Por servidor smtp y ahora se entrega al agente de correo de usuario por el servidor pop3.  // Aquí no leemos el correo de un almacenamiento, sino que entregamos una muestra  // Mail desde el programa en su interior. Podemos entregar múltiples mails usando  // Este método. Formato del comando RETR es algo así como  // RETR 1 o 2 RETR etc   alogs.Lines.Add(GetLocalT+' POP3Server-RETR');    ASender.Thread.Connection.WriteLn('+OK 40 octets');  ASender.Thread.Connection.WriteLn('From: demo@projectindy.org');  ASender.Thread.Connection.WriteLn('To: you@yourdomain.com ');  ASender.Thread.Connection.WriteLn('Subject: Hello ');  ASender.Thread.Connection.WriteLn('');  ASender.Thread.Connection.WriteLn('Hello world! This is email body.');  ASender.Thread.Connection.WriteLn('.'); end;  procedure TfrmMain.IdPOP3Server1RSET(ASender: TIdCommand); begin // Aquí es donde el cliente desea restablecer el estado actual // Esto se puede utilizar para restablecer una lista de eliminaciones pendientes, etc alogs.Lines.Add(GetLocalT+' POP3Server-RSET'); end;  procedure TfrmMain.IdPOP3Server1STAT(ASender: TIdCommand); var  RC,I:integer; begin // Aquí es donde el cliente ha solicitado el Estatuto del buzón // Cuando el cliente pide una estadística del servidor de mensajes contestará // enviando un + OK seguido por el número de mensajes y la duración de los // Formato de mensaje del cliente es STAT    NewCount:=0;   SizeM   :=0;   alogs.Lines.Add(GetLocalT+' POP3Server-STAT');    ZQuery1.Close;   ZQuery1.Fields.Clear;   ZQuery1.SQL.Text:='SELECT * FROM `email` WHERE `to` = '''+authuser+'''';   ZQuery1.ExecSQL;   ZQuery1.Open;    ZQuery1.First;   RC:=ZQuery1.RecordCount;   NewCount:=RC;   alogs.Lines.Add(GetLocalT+' POP3Server-STAT-RC: '+IntToStr(NewCount));   if RC > 0 then begin    try        ZQuery1.First;       while not ZQuery1.EOF do       begin          for I := 0 to RC -1 do         begin             SizeM:=StrToInt(ZQuery1.Fields[0].AsString);             alogs.Lines.Add(GetLocalT+' POP3Server-STAT-SizeM: '+ IntToStr(SizeM) );             ZQuery1.Next;         end;        end;      // envia el numero de ensajes y el tama'no del buzon        alogs.Lines.Add(GetLocalT+ format(' POP3Server-STAT +OK %d %d ',[ NewCount, SizeM ]) );        ASender.Thread.Connection.WriteLn( format('+OK %d %d ',[ NewCount , SizeM ]) );     except       next;     end;      //  alogs.Lines.Add(GetLocalT+ format(' +OK %d %d ',[IntToStr(1), IntToStr(30)]) );     //   ASender.Thread.Connection.WriteLn( format('+OK %d %d ',[IntToStr(1), IntToStr(30)]) );     end;    // ASender.Thread.Connection.WriteLn('+OK 1 40');  end;  procedure TfrmMain.IdPOP3Server1TOP(ASender: TIdCommand; AMessageNum,  ANumLines: Integer); begin // Aquí es donde el cleint ha pedido a las líneas TOP X de una determinada // Mensaje a ser enviado a ellos      alogs.Lines.Add(GetLocalT+' POP3Server-TOP X');      alogs.Lines.Add(GetLocalT+' POP3Server-TOP X-AMessageNum '+IntToStr(AMessageNum) );      alogs.Lines.Add(GetLocalT+' POP3Server-TOP X-ANumLines '+IntToStr(AMessageNum) );        if (AMessageNum > 0) AND (ANumLines > 0) then begin          ASender.Thread.Connection.WriteLn('+OK 40');         ASender.Thread.Connection.WriteLn('Date: Tue, 4 Feb 2014 10:14:05 -0600');         ASender.Thread.Connection.WriteLn('To: user@dominio.com ');         ASender.Thread.Connection.WriteLn('From: user@dominio.com ');         ASender.Thread.Connection.WriteLn('Subject: hola mundo');         ASender.Thread.Connection.WriteLn('Message-ID: <0a0c6429937f41ba6s56a5sd@dominio.com>');         ASender.Thread.Connection.WriteLn('.');       end; end;  procedure TfrmMain.IdPOP3Server1UIDL(ASender: TIdCommand;   AMessageNum: Integer); begin  // Aquí es donde el cliente ha solicitado el identificador único (UIDL) de cada // Mensaje, o un mensaje particular para ser enviado a ellos.   alogs.Lines.Add(GetLocalT+' POP3Server-UIDL'); end;  procedure TfrmMain.Button1Click(Sender: TObject); begin    ConectToMYSQLserver; end;  procedure TfrmMain.Button2Click(Sender: TObject); begin DisConectToMYSQLserver; end;  procedure TfrmMain.ZSQLMonitor1LogTrace(Sender: TObject;   Event: TZLoggingEvent); begin alogs.Lines.Add(GetLocalT+' '+Event.AsString); end;  procedure TfrmMain.IdPOP3Server1Disconnect(AThread: TIdPeerThread); begin alogs.Lines.Add(GetLocalT+' POP3Server-DISCONECT'); end;  end.

FideRosado 29-04-2014 23:34:03

respuesta
 
1 Archivos Adjunto(s)
aca les pongo el proy. adjunto

FideRosado 30-04-2014 00:52:36

respuesta
 
he usado estas lineas para el RETR, pero me sigue dando un error
que dice :

//////////////////////////////////////////////////////////////////
/// Unrecognized POP3 Responce Header: ///
/// " ///
/// " ///
/////////////////////////////////////////////////////////////////


Código Delphi [-]
procedure TfrmMain.IdPOP3Server1RETR(ASender: TIdCommand; AMessageNum: Integer);
var
menssage:TStringList;
begin

 // Cliente inicia la recuperación de cada mensaje mediante la emisión de un comando RETR
 // Al servidor. Servidor responderá + OK y continuará enviando
 // Mensaje en sí mismo. Cada mensaje se guarda en una base de datos a la llegada uppon
 // Por servidor smtp y ahora se entrega al agente de correo de usuario por el servidor pop3.
 // Aquí no leemos el correo de un almacenamiento, sino que entregamos una muestra
 // Mail desde el programa en su interior. Podemos entregar múltiples mails usando
 // Este método. Formato del comando RETR es algo así como
 // RETR 1 o 2 RETR etc

 menssage:= TStringList.Create;
 menssage.LoadFromFile(ExtractFilePath(Application.ExeName)+ '\1.msg');

        with ASender.Thread.Connection do begin
          WriteLn('+OK '+ IntToStr(Length(menssage.Text))+ ' octets');
          WriteLn(menssage.Text);
          WriteLn('.');
        end;
        menssage.Free;

end;


La franja horaria es GMT +2. Ahora son las 06:04:01.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi