martes, 28 de junio de 2016

Truco Delphi - Enviar emails usando el servicio Gmail de Google

En el truco de hoy os voy a enseñar como podéis enviar correos electrónicos desde vuestra aplicación Delphi mediante vuestra cuenta Gmail.


Para ello vamos a hacer uso de los componentes Indy disponibles en cualquier versión de RAD Studio (en el truco se utiliza la versión XE8 pero está testeado en XE5 también).

Vamos a crearnos una función SendGMail con el siguiente código:
  
procedure SendGmail(pUsuario, pPassword, pAsunto, pCuerpo, pDestino : string);
var
  Smtp : TidSMTP;
  ManejadorSSL : TidSSLIOHandlerSocketOpenSSL;
  Mensaje: TIdMessage;
begin
  ManejadorSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  with ManejadorSSL do
  begin
   Destination := 'smtp.gmail.com:587';
   Host := 'smtp.gmail.com';
   MaxLineAction := maException;
   Port := 587;
   SSLOptions.Method := sslvTLSv1;
   SSLOptions.Mode := sslmUnassigned;
   SSLOptions.VerifyMode := [];
   SSlOptions.VerifyDepth := 0;
  end;

  Smtp := TIdSMTP.Create( nil );

  with Smtp do
  begin
    IoHandler := ManejadorSSL;
    Host := 'smtp.gmail.com';
    Port := 25;
    Username := pUsuario;
    Password := pPassword;
    UseTLS := utUseExplicitTLS;
  end;

  Mensaje := TIdMessage.Create(nil);
  with Mensaje do
  begin
    Clear;
    Subject := pAsunto;
    Body.Text := pCuerpo;
    Recipients.Add;
    Recipients.Items[0].Address := pDestino;
  end;

  Smtp.Connect;
  if smtp.Connected then
  begin
    smtp.Send(Mensaje);
    smtp.Disconnect;
  end;

  FreeAndNil(Smtp);
  FreeAndNil(Mensaje);
  FreeAndNil(ManejadorSSL);

end;
 

Y ya está, solamente tendremos que llamar a esta función con los parámetros relativos a nuestra cuenta para enviar nuestro correo.

En lugar de crear los objetos dinámicamente, podéis pegar objetos directamente desde la paleta de componentes en vuestro formulario y ahorraros el create; si lo hacéis dinámicamente no olvidéis incluir en el uses las referencias necesarias:

 uses
  [...] IdMessage, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack,
  IdSSL, IdSSLOpenSSL, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase,
  IdSMTP,IdAttachmentFile,IdGlobal;
 

Observaréis que falta la opción de adjuntar algún archivo, pero eso lo vamos a dejar para futuros trucos.

Si tienes cualquier duda o comentario recuerda que puedes exponerlo aquí o bien mediante nuestro twitter facebook.

Compartir:

9 comentarios:

  1. Hola, estoy tratando de aplicar este código y me salta este error:

    raised exception class EIdOSSLCouldNotLoadSSLLibrary with message 'Could not load SSL Liabrary'. que puede estar pasando?

    ResponderEliminar
  2. Hola, alguno podría decirme podría utilizar este código para delphi 10 o asesorarme que indys o Dll debo usar?
    Necesito enviar correos de "olvide mi contraseña" desde mi aplicación delphi. Alguien que me asesore? Lo agradecería.

    ResponderEliminar
  3. hola, al aplicar e cogido a mi programa me lanza la excepcion connection closed gracefully, sabras a que se refiere?

    ResponderEliminar
  4. hola, copie tu codigo para enviar un correo pero me envia el mensaje no cargo libreria ssl

    ResponderEliminar
  5. Hola: Me da el error: SSL is not available on this server.

    ResponderEliminar
  6. Hola
    ¿Yo como se envian ficheros adjuntos?

    ResponderEliminar
  7. Disclaimer: Este artículo fue escrito en 2016. Yo ya no trabajo con Delphi en ninguna de sus versiones ni doy soporte a estos posts. Disculpad las mostias

    ResponderEliminar
  8. PAra nuevas versiones de Delphi
    https://www.clubdelphi.com/~hector/foros/showthread.php?t=94241

    ResponderEliminar
  9. procedure TfrmPrincipal.btnEnviarMailClick(Sender: TObject);
    var
    Smtp : TidSMTP;
    ManejadorSSL : TidSSLIOHandlerSocketOpenSSL;
    Mensaje: TIdMessage;
    idSASLLogin:TIdSASLLogin;
    idUserPassProvider:TIdUserPassProvider;
    begin
    ManejadorSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    with ManejadorSSL do
    begin
    Destination := 'smtp.gmail.com:465'; //'smtp.gmail.com:587';
    Host := 'smtp.gmail.com';
    MaxLineAction := maException;
    Port := 465; //587;

    // SSLOptions.Method := sslvSSLv3;
    SSLOptions.Method := sslvSSLv23;
    SSLOptions.SSLVersions := [sslvSSLv23];

    SSLOptions.Mode := sslmUnassigned;
    SSLOptions.VerifyMode := [];
    SSlOptions.VerifyDepth := 0;
    end;





    Smtp := TIdSMTP.Create( nil );

    idSASLLogin := TIdSASLLogin.Create(Smtp);
    idUserPassProvider := TIdUserPassProvider.Create(idSASLLogin);

    idSASLLogin.UserPassProvider := idUserPassProvider;
    idUserPassProvider.Username := 'santiago14@gmail.com';
    idUserPassProvider.Password := 'mipass';


    with Smtp do
    begin
    IoHandler := ManejadorSSL;
    Host := 'smtp.gmail.com';
    Port := 465; // 25;
    SASLMechanisms.Add.SASL:=IdSASLLogin;
    AuthType:=satSASL;
    ValidateAuthLoginCapability:=True;
    Username := 'santiago14@gmail.com'; //Usuario del correo SMTP
    Password := 'mipass'; //Pas del correo POP
    UseTLS := utUseImplicitTLS; //utUseExplicitTLS;
    end;

    Mensaje := TIdMessage.Create(nil);
    with Mensaje do
    begin
    Clear;
    Subject := 'Mi primer mensaje'; //Asunto del mensaje
    Body.Text := 'Hola. Este es mi primer mensaje'; //Cuerpo del mensaje. Podría ser HTML
    Recipients.Add;
    Recipients.Items[0].Address := 'srusso_19bj@yahoo.com'; //Mail destino. Va uno por Address
    end;

    try
    Smtp.Connect;
    if smtp.Connected then
    begin
    // btnEnviarMail.Enabled:=False;
    smtp.Send(Mensaje);
    smtp.Disconnect;
    // btnEnviarMail.Enabled:=True;
    Application.MessageBox('Correo enviado', 'Correos', MB_OK);
    end;
    except
    on e:Exception do
    begin
    Log(e.Message);
    mErrores(e, 'No se envió el mail.', 'Correos');
    end;
    end;

    FreeAndNil(Smtp);
    FreeAndNil(Mensaje);
    FreeAndNil(ManejadorSSL);
    end;

    ResponderEliminar

Con la tecnología de Blogger.

BoosterBlog

BoosterBlog
BoosterBlog

Timeline Twitter

Seguidores

Seguidores