martes, 25 de noviembre de 2008

Otra forma de enviar correo

Desde que tuve disponible una conexión a Internet he usado muchas soluciones diferentes para enviar correos desde mis programas, desde MS-DOS usando blat hasta nuestros días con [x]Harbour y TIP, pasando por todas las variedades de clases y librerías. Hace poco, buscando información sobre un tema totalmente diferente encontré por casualidad en un foro unos artículos que me llamaron la atención que mostraban una opción más sobre la que no había oído ni leído nunca, pero que se supone que está ahí, para usar, y forma parte de la librería de Windows desde hace mucho.

Collaboration Data Objects

Los Collaboration Data Objects (CDO) son un conjunto de componentes que Microsoft desarrolló para facilitar la gestión de mensajes, inicialmente destinados a usarse como mecanismo de enlace e interacción con servidores Exchange, pero luego se extiende su uso hacia todo el espectro de servicios de mensajes de Internet. Hace su aparición junto con Windows 2000 y desde esa versión está disponible como parte de la libreria del sistema operativo, es decir que no necesitamos utilizar ninguna librería ajena al propio Windows. El soporte de los componentes está en una dll dentro del directorio del sistema de windows, %WINDOWS%\System32\cdosys.dll. El soporte de la dll es completo con Borland C++ 5.5, y en el directorio include del compilador se encuentran varios encabezados que, aunque no los necesitaremos, pueden ayudar como referencia al usar los objetos COM.

Manos a la obra

Para enviar correo utilizamos dos componentes. El primero de ellos, referido a la configuración del servicio de correo, se usa para establecer la información de la cuenta que utilizaremos para el envío de correo. Nótese la particular nomenclatura de las variables del componente, al principio me costó un poco encontrar la forma de acceder directamente a ellos para darles un valor, que al final lo resolví por analogía con ADO, usando la propiedad 'Value'.

loCfg := CREATEOBJECT( "CDO.Configuration" )
WITH OBJECT loCfg:Fields
:Item( "http://schemas.microsoft.com/cdo/configuration/smtpserver" ):Value := "smtp.gmail.com"
:Item( "http://schemas.microsoft.com/cdo/configuration/smtpserverport" ):Value := 465
:Item( "http://schemas.microsoft.com/cdo/configuration/sendusing" ):Value := 2
:Item( "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate" ):Value := .T.
:Item( "http://schemas.microsoft.com/cdo/configuration/smtpusessl" ):Value := .T.
:Item( "http://schemas.microsoft.com/cdo/configuration/sendusername" ):Value := "testcdo@gmail.com"
:Item( "http://schemas.microsoft.com/cdo/configuration/sendpassword" ):Value := "prueba2345"
:Update()
END WITH


En este ejemplo hay otra particularidad: como usamos gmail, el puerto del smtp no es el estandar 25, sino 465, y requiere ademas autenticación usando ssl.

Para componer el mensaje propiamente dicho usamos el componente Message, que tiene las propiedades normales de todo correo: To, From, CC, BCC, etc.


loMsg := CREATEOBJECT ( "CDO.Message" )
WITH OBJECT loMsg
:Configuration = loCfg
:From = "testcdo@gmail.com"
:To = "carlosantoniomora@gmail.com" // <----- Coloca aqui tu direcci¢n de correo
:Subject = "Prueba con CDO"
:TextBody = "Este es un mensaje de prueba con CDO desde Harbour."
:Send()
ENDWITH



En general todos los errores presentan al ejecutar el metodo Send, al final. Dado que son COMs, lo mejor es empaquetar el bloque dentro de un TRY/CATCH para poder tenerlos controlados.

El proyecto completo está aquí, es solo Harbour puro y duro. Luego veremos como manejar adjuntos, contenido html y más.

He cambiado el alojamiento de los ejemplos a ziddu, vamos a ver que resultado dá.

3 comentarios:

Juan Manuel dijo...

Hola Carlos, soy Roberto de Argentina y realmente agradezco esto que haces asi como lo que todos los usuarios avanzados de xharbour hacen, me ayuda mucho, ya que programo en forma "amateur", y hay infinidad de cosas que se me escapan.
No aflojes. Un Saludo.
Roberto.

Anónimo dijo...

Hola, esta interesante el ejemplo pero como se haria para enviar un archivo adjunto...
Gracias Veronica Venezuela

MarioG dijo...

Carlos;
muchas gracias por hacer mas fácil la programación de los que menos sabemos.
Mas que sencillo e interesante el código