Monday, 18 May 2009

Delphi SMTP con Indy 10

El Protocolo Simple de Transferencia de Correo o SMTP es un protocolo de la capa de aplicación. Protocolo de red basado en texto utilizado para el intercambio de mensajes de correo electrónico entre computadoras u otros dispositivos (PDA's, teléfonos móviles, etc.).

Mediante los componentes de Indy 10 (los que vienen con el Delphi 2009), podemos crear aplicaciones que utilizen este protocolo para enviar correos. En la siguiente aplicación que os muestro Thundax Mail Sender, utilizaré estos componentes y enviaré correos mediante gmail. Para mi ejemplo, utilizaré los siguientes componentes:

Un componente SMTP, uno que gestiona el SSL y otro que es el que encapsula el mensaje IdMessage. Con esta aplicación, podré enviar correos en un formato sencillo, sin tener que entrar en mi cuenta de correo (ya lo hará la aplicación), y lo más interesante, puedo crear una lista de mailing para enviar correo masivo a toda una lista de contactos.


La configuración de los componentes es la siguiente:

.pas:


procedure TForm1.Button1Click(Sender: TObject);
begin
    IdSMTP1.Host := server.text;
    IdSMTP1.Password := password.Text;
    IDSMTP1.Port := StrToInt(port.Text);
    IdSMTP1.Username := from.Text;

    IdSSLIOHandlerSocketOpenSSL1.Destination :=  server.text + ':' + port.Text;
    IdSSLIOHandlerSocketOpenSSL1.Host := server.Text;
    IdSSLIOHandlerSocketOpenSSL1.Port := IDSMTP1.Port;

    IdSMTP1.Connect;
    IdMessage1.From.Address := from.text;
    IdMessage1.Recipients.EMailAddresses := EdTo.text;
    IdMessage1.Subject := Subject.text;
    IdMessage1.Body.Text := Message.text;
    IdSMTP1.Send(IdMessage1);
    IdSMTP1.Disconnect;
end;




.dfm:


  object IdSMTP1: TIdSMTP
OnStatus = IdSMTP1Status
IOHandler = IdSSLIOHandlerSocketOpenSSL1
Host = 'smtp.gmail.com'
    Password = 'mypassword'
    Port = 587
    SASLMechanisms = <>
    UseTLS = utUseExplicitTLS
Username = 'my@email.com'
    Left = 112
    Top = 304
  end
  object IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL
Destination = 'smtp.gmail.com:587'
    Host = 'smtp.gmail.com'
    MaxLineAction = maException
Port = 587
    DefaultPort = 0
    SSLOptions.Mode = sslmUnassigned
SSLOptions.VerifyMode = []
    SSLOptions.VerifyDepth = 0
    OnStatusInfo = IdSSLIOHandlerSocketOpenSSL1StatusInfo
Left = 112
    Top = 352
  end
  object IdMessage1: TIdMessage
AttachmentEncoding = 'UUE'
    BccList = <>
    CCList = <>
    Encoding = meDefault
FromList = <
      item
end>
    Recipients = <>
    ReplyTo = <>
    ConvertPreamble = True
Left = 112
    Top = 256
  end




Utilizaré el servidor SMTP de gmail -> smtp.gmail.com y el puerto 587. Si lo queremos enviar con otro servidor, simplemente tenemos que buscar cuál es su servidor smtp y su puerto, por ejemplo para yahoo, me parece que tenemos que utilizar el smtp.mail.yahoo.com y el puerto 465. Otro de las pruebas hechas y con la ayuda de un compañero es sobre el servidor smtp de telefonica -> smtp.telefonica.net y el puerto 25. Pero al parecer no funciona con el nombre, y hay que entrar la IP directamente: 213.4.149.228 y el puerto 25.

Una vez tengamos los parámetros entrados correctamente, la aplicación avisa del estado y muestra la conexión SSL:

SSL status: "before/connect initialization"
SSL status: "before/connect initialization"
SSL status: "SSLv3 write client hello A"
SSL status: "SSLv3 read server hello A"
SSL status: "SSLv3 read server certificate A"
SSL status: "SSLv3 read server done A"
SSL status: "SSLv3 write client key exchange A"
SSL status: "SSLv3 write change cipher spec A"
SSL status: "SSLv3 write finished A"
SSL status: "SSLv3 flush data"
SSL status: "SSLv3 read finished A"
SSL status: "SSL negotiation finished successfully"
SSL status: "SSL negotiation finished successfully"
Cipher: name = RC4-MD5; description = RC4-MD5 SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=MD5;bits = 128;version =TLSv1/SSLv3;
SSL status: "SSL negotiation finished successfully"

Podéis encontrar la aplicación en el siguiente enlace : Thundax Mail Sender.


4 comments:

  1. estimado amigo, ¿como obtengo los ssl status?. Ademas por que me dice el ide que el "IdSMTP1Status method referenced by IDSMTP!.OnStatus Does not exist"

    lo mismo para IDSSLIOHAndlerSocketOpenSSL1

    ReplyDelete
  2. Hola Antonio,

    Que versión del Indy estás utilizando?

    ReplyDelete
  3. se supone que tengo delphi 7 e instale el indy 10 baje un zip no me acuerdo de que pagina y se llama asi el zip Indy10_4526.zip
    gracias saludos!

    ReplyDelete
  4. Hola Antonio,

    has conseguido compilar e instalar la versión de Indy 10?, lo digo por que con Delphi 7 hay que compilar la versión e instalarla. Luego te aparecerán los componentes en la paleta de componentes y los podrás agregar a tu programa

    ReplyDelete