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 y facebook.
Hola, estoy tratando de aplicar este código y me salta este error:
ResponderEliminarraised exception class EIdOSSLCouldNotLoadSSLLibrary with message 'Could not load SSL Liabrary'. que puede estar pasando?
Hola, alguno podría decirme podría utilizar este código para delphi 10 o asesorarme que indys o Dll debo usar?
ResponderEliminarNecesito enviar correos de "olvide mi contraseña" desde mi aplicación delphi. Alguien que me asesore? Lo agradecería.
hola, al aplicar e cogido a mi programa me lanza la excepcion connection closed gracefully, sabras a que se refiere?
ResponderEliminarhola, copie tu codigo para enviar un correo pero me envia el mensaje no cargo libreria ssl
ResponderEliminarHola: Me da el error: SSL is not available on this server.
ResponderEliminarHola
ResponderEliminar¿Yo como se envian ficheros adjuntos?
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
ResponderEliminarPAra nuevas versiones de Delphi
ResponderEliminarhttps://www.clubdelphi.com/~hector/foros/showthread.php?t=94241
procedure TfrmPrincipal.btnEnviarMailClick(Sender: TObject);
ResponderEliminarvar
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;