19 julio 2006

Enviando un correo con INDY

Vamos a crear un procedimiento para mandar correos electrónicos utilizando el componente TIdSMTP de la paleta de componentes INDY CLIENTS.

El componente no hace falta ponerlo en el formulario, ya que lo creo en tiempo real dentro del procedimiento. Sólo hace falta añadir en el apartado USES de nuestro formulario lo siguiente:

uses
IdSMTP, IdMessage;

Vamos con el procedimiento que envía un mensaje de correo electrónico:

procedure EnviarMensaje( sUsuario, sClave, sHost, sAdjunto, sAsunto, sDestino, sMensaje: String );
var SMTP: TIdSMTP;
Mensaje: TIdMessage;
Adjunto: TIdAttachment;
begin
// Creamos el componente de conexión con el servidor
SMTP := TIdSMTP.Create( nil );
SMTP.Username := sUsuario;
SMTP.Password := sClave;
SMTP.Host := sHost;
SMTP.Port := 25;
SMTP.AuthenticationType := atLogin;

// Creamos el contenido del mensaje
Mensaje := TIdMessage.Create( nil );
Mensaje.Clear;
Mensaje.From.Name := sDestino;
Mensaje.From.Address := sDestino;
Mensaje.Subject := sAsunto;
Mensaje.Body.Text := sMensaje;
Mensaje.Recipients.Add;
Mensaje.Recipients.Items[0].Address := sDestino;

// Si hay que meter un archivo adjunto lo creamos y lo asignamos al mensaje
if sAdjunto <> '' then
begin
if FileExists( sAdjunto ) then
Adjunto := TIdAttachment.Create( Mensaje.MessageParts, sAdjunto );
end
else
Adjunto := nil;

// Conectamos con el servidor SMTP
try
SMTP.Connect;
except
raise Exception.Create( 'Error al conectar con el servidor.' );
end;

// Si ha conectado enviamos el mensaje y desconectamos
if SMTP.Connected then
begin
try
SMTP.Send( Mensaje );
except
raise Exception.Create( 'Error al enviar el mensaje.' );
end;

try
SMTP.Disconnect;
except
raise Exception.Create( 'Error al desconectar del servidor.' );
end;
end;

// Liberamos los objetos creados
if Adjunto <> nil then
FreeAndNil( Adjunto );

FreeAndNil( Mensaje );
FreeAndNil( SMTP );

Application.MessageBox( 'Mensaje enviado correctamente.',
'Fin de proceso',MB_ICONINFORMATION );
end;
Y este es un ejemplo de envío de mensajes:

EnviarMensaje( 'juanito33', 'djeuE21', 'smtp.terra.es',
'c:\documento.zip', 'Te envio mi documento',
'felipe8843@terra.es', 'Adjunto archivo: documento.zip' );

Con un poco de imaginación se puede hacer que muestre el estado de la conexión en la barra de estado e incluso una barra de progreso para ver cuanto queda por terminar de enviar.

Pruebas realizadas en Delphi 7.

8 comentarios:

Anónimo dijo...

Gracias.....Muy bueno tu ejemplo.....
Lo he visto ahora en el 2009 y funciona perfecto.....

Lo unico que no me resulta es cuando cambio de destinatario a un Hotmail o Gmail, etc......

Si puedes publicar algo con esto....

Gracias.
Atte.
Francisco.

Administrador dijo...

Es que tanto GMail como Hotmail utilizan conexión segura SSL con puertos distintos a los tradicionales POP y SMTP.

Para ello hay que utilizar la librería SSL que traen los Indy y añadir un par de DLL más al lado de tu ejecutable.

Busca en Google información sobre las librerías LIBEAY32.DLL y SSLEAY32.DLL.

Saludos.

MAXIUM dijo...

Con Indy 10 y la última versión de SSL me anda bien con una cuenta Gmail, pero no lo he podido echar andar con Hotmail.

Vamos, metele mano ;)

Anónimo dijo...

hola muy buenas tengo hechjo un proceso para envio y recepcion de mail, los envio a todos , hotmail, gamil (sobre todo a gmail) y no tengo ningun problema, excepto que se me satura el servidor por no borrar los mensajes de echo estoy en busqueda de como borrarlos.

Bueno al tema, los envio sin ningun problema, creo que lo unico que active cuando medio problemas fue el "idsmtp.AuthenticationType:=atlogin" apartir de aqui no he tenido ningun problema

Jorge Ariel Basilico dijo...

Instale INDY 10 en deplhi 7 y cuando quiero compilar la aplicación que tengo para enviar mails me sale un error en la unit IdReply.pas no conoce el EIdException.IfFalse. Alguien me puede dar una mano con esto!

Muchas Gracias!!!

Inma dijo...
Este comentario ha sido eliminado por el autor.
Alvaro Jésus dijo...

Gracias, me sirvio mucho.

Diego Gonzalez dijo...

Consulta.
Que es atLogin?
Porque en EX8 no me reconozca el tipo TIIDATTACHMENT??
Gracias!!

Publicidad