Desarrollo de un cliente SMTP  
     
Menú
Home
Articulos
Servicios de Internet
Enlaces
 
 
Introducción

     El principal objetivo del protocolo SMTP es el envio de correo electronico confiable y eficiente.

     El SMTP es independiente del subsistema de transmision y requiere de solo de un canal de flujo de datos que sea confiable para que este pueda llegar a su destino.

     Modelo de SMTP.


Comandos SMTP:
helo quit
mail from: send
rcpt to: soml
data saml
noop turn
rset vrfy
expn help
Nota: A todos los comandos se les debe agregar una salto de linea y un retorno de carro para que el servidor los pueda entender.

Desarrollo:

     Primero creamos un nuevo proyecto en Delphi y modificamos las propiedades que deseemos cambiar de nuestra forma.

Agregamos los siguientes controles

  • 4 Cajas de texto con sus etiquetas.
  • 2 Controles memo.
  • 1 Timer.
  • 1 Socket
  • 1 Boton

     En este caso hemos agregado un control Timer, que va a ser el que se encargue de lanzar todos los camandos segun la respuesta del servidor.

En el evento OnClick del boton que agregamos agregamos el siguiente codigo.

procedure TForm1.Button1Click(Sender: TObject);
begin
  Skt.Host := EdtServidor.Text;
  Skt.Open;
  Timer1.Enabled := True;
  Contador := 1;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  case contador of
    1:
    begin
      if not Enviado then
      begin
        Skt.Socket.SendText('helo ' + EdtServidor.Text + crlf);
        Enviado := True;
      end;
    end;
    2:
    begin
      if not enviado then
      begin
        Skt.Socket.SendText('mail from:<' + EdtDe.Text + '>' + crlf);
        Enviado := True;
      end;
    end;
    3:
    begin
      if not enviado then
      begin
        Skt.Socket.SendText('rcpt to:<' + EdtPara.Text + '>' + crlf);
        Enviado := True;
      end;
    end;
    4:
    begin
      if not enviado then
      begin
        Skt.Socket.SendText('Data' + crlf);
        Enviado := True;
      end;
    end;
    5:
    begin
      if not enviado then
      begin
        Skt.Socket.SendText('subject:' + EdtSubject.Text + crlf);
        Skt.Socket.SendText(Memo1.Text + '.' + crlf);
        Skt.Socket.SendText('quit');
        Contador := 0;
        Timer1.Enabled := False;
        Enviado := True;
      end;
    end;
  end;
end;

procedure TForm1.SktRead(Sender: TObject; Socket: TCustomWinSocket);
var
  Mensage: String;
begin
  Mensage := Socket.ReceiveText;
  Enviado := False;
  Memo2.Lines.Add(Mensage);
  Inc(Contador);
end;


Conclusiones:
     En esta practica se puede ver como un cliente realiza toda la transaccion para enviar un correo, y ademas de los comandos extras o encabezado que debe contener el correo electronico dentro de los datos que lleva, teniendo en cuenta el RFC 0822 para que pueda interactuar con cualquier servidor de correo.