Ver Mensaje Individual
  #8  
Antiguo 29-04-2014
Avatar de FideRosado
FideRosado FideRosado is offline
Miembro
 
Registrado: jun 2010
Ubicación: Pinar del Rio Cuba
Posts: 146
Reputación: 17
FideRosado Va por buen camino
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: [email protected]');  ASender.Thread.Connection.WriteLn('To: [email protected] ');  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: [email protected] ');         ASender.Thread.Connection.WriteLn('From: [email protected] ');         ASender.Thread.Connection.WriteLn('Subject: hola mundo');         ASender.Thread.Connection.WriteLn('Message-ID: <[email protected]>');         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.

Última edición por marcoszorrilla fecha: 02-05-2014 a las 22:15:37.
Responder Con Cita