Page 1 of 3

enviar emails desde fwh

Posted: Sat Feb 21, 2009 12:58 am
by MANOLO
Hola a todos, necesito enviar emails desde mi aplicación en fwh, hasta ahora la tenia en clipper y funcionaba bien con tsmtp, pero al pasarla a fwh, me da error al compilar el fichero winsock.c, entonces e probado otras opciones:

twmail() ----> envia los emails pero con ficheros adjuntos, al primer destinatario lo hace con basura en el fichero, por lo que es ilegible.
hb_sendmail() ----> el programa se queda colgado, justo en la clase turl, se queda bloqueado sin dar ningún tipo de error.
outlook. ole ---> envia bien el email pero siempre me aparece una ventana que dice "un programa intenta enviar un email automaticamente, pulse si para enviar", por lo que no es muy correcto.

Alguien podría darme alguna sugerencia, estoy realmente bloqueado.

Gracias.

Re: enviar emails desde fwh

Posted: Sat Feb 21, 2009 8:26 am
by dobfivewin
Hoña Manolo

Pasame tu correo para mandarte mis escritos y consultas sobre el tema, a lo mejor te pueden ayudar.

Abandone un poco el tema pero en lo que pueda ayudar a sus ordenes...

salu2

david

Re: enviar emails desde fwh

Posted: Sat Feb 21, 2009 10:44 am
by MANOLO
gracias david este es mi email

mcanada1@telefonica.net

Re: enviar emails desde fwh

Posted: Sat Feb 21, 2009 10:46 am
by Antonio Linares
Manolo,

Aqui tienes un ejemplo:

Code: Select all

#include "FiveWin.ch" 
#include "Mail.ch" 

function Main() 

   local oWnd 

   DEFINE WINDOW oWnd 

   ACTIVATE WINDOW oWnd ON INIT doit() 

return nil 

function doit() 

   local oMail, aCustomer:={} 
   local cSubject := "Test mail" 
   local cMessage := "This is a test message." 

   AAdd( aCustomer, "alinares@fivetechsoft.com;mcanada1@telefonica.net" ) 

   DEFINE MAIL oMail; 
      SUBJECT cSubject; 
      TEXT cMessage 

   oMail:aRecipients = aCustomer 

   ACTIVATE MAIL oMail 

   MsgInfo( "mail sent" ) 

return nil
 

Re: enviar emails desde fwh

Posted: Sat Feb 21, 2009 11:03 pm
by FiveWiDi
Antonio Linares wrote:Manolo,

Aqui tienes un ejemplo:

Code: Select all

#include "FiveWin.ch" 
#include "Mail.ch" 

function Main() 

   local oWnd 

   DEFINE WINDOW oWnd 

   ACTIVATE WINDOW oWnd ON INIT doit() 

return nil 

function doit() 

   local oMail, aCustomer:={} 
   local cSubject := "Test mail" 
   local cMessage := "This is a test message." 

   AAdd( aCustomer, "alinares@fivetechsoft.com;mcanada1@telefonica.net" ) 

   DEFINE MAIL oMail; 
      SUBJECT cSubject; 
      TEXT cMessage 

   oMail:aRecipients = aCustomer 

   ACTIVATE MAIL oMail 

   MsgInfo( "mail sent" ) 

return nil
 
Antonio,

Sería possible enviar mails a destinatarios 'CCO' con la clase tMail?

Un saludo
Carlos G.

Re: enviar emails desde fwh

Posted: Sun Feb 22, 2009 9:05 pm
by MANOLO
Hola antonio, con el codigo que me has dado envia emails, pero outlook muestra una pantalla de "otro programa intenta enviar un email en su nombre desea permitirlo", y también si añado la linea:

oMail:aFiles:=aFic

entonces ni envia el fichero.

gracias por tu ayuda.

Re: enviar emails desde fwh

Posted: Mon Feb 23, 2009 4:19 pm
by mmercado
MANOLO wrote:Hola antonio, con el codigo que me has dado envia emails, pero outlook muestra una pantalla de "otro programa intenta enviar un email en su nombre desea permitirlo", y también si añado la linea:

oMail:aFiles:=aFic

entonces ni envia el fichero.
Hola Manolo y amigos:

Gracias a Carlos Mora descubrí el uso de CDOSYS (Collaboration Data Objects) para el envío de correos, para mí es la mejor herramienta de las que he probado para el envío de correos desde FWH/xHarbour ya que no requiere del uso de sockets ni de aplicaciones intermedias (como Outlook)

Aquí les dejo un pequeño ejemplo funcional de dicha tecnología, que espero les sea de utilidad.

Code: Select all

#include "FiveWin.ch"
#include "TSButton.ch"
#include "CdoSys.ch"

#define WS_3DLOOK  4
#define CLR_HBROWN nRGB( 205, 192, 176 )
#define CLR_NBLUE  nRGB( 142, 171, 194 )

//---------------------------------------------------------------------------------------------//

Function Main()

   Local oDlg, aCtl[ 20 ], oFont

   Local cMailServer := PadR( "smtp.hotmail.com", 60 ), ;           // servidor de correo
         cFrom       := PadR( "remitente@hotmail.com", 60 ), ;      // remitente
         cTo         := PadR( "destinatarios@hotmail.com", 180 ), ; // destinatario (uno o varios separados con comas)
         cBCC        := PadR( "destinatarios@hotmail.com", 180 ), ; // copias ocultas a (uno o varios separados con comas)
         cAttach     := PadR( "c:\fwh\bitmaps\fivewin.bmp", 180 ), ;// archivo anexo (uno o varios separados con comas)
         cSubject    := Space( 60 ), ;                              // asunto
         cBody       := Space( 500 ), ;                             // cuerpo del mensaje
         nPort       := 25, ;                                       // puerto usado por el servidor de correo
         cUser       := Space( 60 ), ;                              // nombre de usuario para autenticación
         cPass       := Space( 30 )                                 // contraseña para autenticación

   DEFINE FONT oFont NAME "Arial" SIZE 0, -16

   DEFINE DIALOG oDlg FROM 0, 0 TO 455, 703 PIXEL ;
          COLORS CLR_BLUE, CLR_HBROWN ;
          TITLE "CDOSYS Collaboration Data Objects for Windows 2000" ;
          STYLE nOR( DS_MODALFRAME, WS_POPUP, WS_CAPTION, WS_SYSMENU, WS_3DLOOK )

   @ 10,  5 SAY aCtl[ 1 ] PROMPT "Servidor de Correo:" OF oDlg ;
            FONT oFont UPDATE ;
            COLORS CLR_BLUE, CLR_HBROWN SIZE 70, 11 PIXEL

   @ 10, 80 GET aCtl[ 2 ] VAR cMailServer OF oDlg ;
            FONT oFont  UPDATE  PICTURE "@K" ;
            COLORS CLR_BLUE, CLR_WHITE SIZE 264, 11 PIXEL

   @ 24,  5 SAY aCtl[ 3 ] PROMPT "Remitente:" OF oDlg ;
            FONT oFont UPDATE ;
            COLORS CLR_BLUE, CLR_HBROWN SIZE 70, 11 PIXEL

   @ 24, 80 GET aCtl[ 4 ] VAR cFrom OF oDlg ;
            FONT oFont  UPDATE  PICTURE "@K" ;
            COLORS CLR_BLUE, CLR_WHITE SIZE 264, 11 PIXEL

   @ 39,  5 SAY aCtl[ 5 ] PROMPT "Destinatario:" OF oDlg ;
            FONT oFont UPDATE ;
            COLORS CLR_BLUE, CLR_HBROWN SIZE 70, 11 PIXEL

   @ 39, 80 GET aCtl[ 6 ] VAR cTo OF oDlg ;
            FONT oFont  UPDATE  PICTURE "@K" ;
            COLORS CLR_BLUE, CLR_WHITE SIZE 264, 11 PIXEL

   @ 54,  5 SAY aCtl[ 7 ] PROMPT "Copia para:" OF oDlg ;
            FONT oFont UPDATE ;
            COLORS CLR_BLUE, CLR_HBROWN SIZE 70, 11 PIXEL

   @ 54, 80 GET aCtl[ 8 ] VAR cBCC OF oDlg ;
            FONT oFont  UPDATE  PICTURE "@K" ;
            COLORS CLR_BLUE, CLR_WHITE SIZE 264, 11 PIXEL

   @ 69,  5 SAY aCtl[ 9 ] PROMPT "Adjuntar:" OF oDlg ;
            FONT oFont UPDATE ;
            COLORS CLR_BLUE, CLR_HBROWN SIZE 70, 11 PIXEL

   @ 69, 80 GET aCtl[ 10 ] VAR cAttach OF oDlg  PICTURE "@K" ;
            FONT oFont  UPDATE Action fAddAttach( aCtl[ 10 ] ) ;
            COLORS CLR_BLUE, CLR_WHITE SIZE 264, 11 PIXEL

   @ 84,  5 SAY aCtl[ 11 ] PROMPT "Asunto:" OF oDlg ;
            FONT oFont UPDATE ;
            COLORS CLR_BLUE, CLR_HBROWN SIZE 70, 11 PIXEL

   @ 84, 80 GET aCtl[ 12 ] VAR cSubject OF oDlg ;
            FONT oFont  UPDATE PICTURE "@K" ;
            COLORS CLR_BLUE, CLR_WHITE SIZE 264, 11 PIXEL

   @ 99,  5 SAY aCtl[ 13 ] PROMPT "Autenticación: Usuario:" OF oDlg ;
            FONT oFont UPDATE ;
            COLORS CLR_BLUE, CLR_HBROWN SIZE 80, 11 PIXEL

   @ 99, 87 GET aCtl[ 14 ] VAR cUser OF oDlg ;
            FONT oFont  UPDATE PICTURE "@K" ;
            COLORS CLR_BLUE, CLR_WHITE SIZE 118, 11 PIXEL

   @ 99,213 SAY aCtl[ 15 ] PROMPT "Contraseña:" OF oDlg ;
            FONT oFont UPDATE ;
            COLORS CLR_BLUE, CLR_HBROWN SIZE 44, 11 PIXEL

   @ 99,259 GET aCtl[ 16 ] VAR cPass OF oDlg ;
            FONT oFont  UPDATE  PICTURE "@K";
            COLORS CLR_BLUE, CLR_WHITE SIZE 85, 11 PIXEL

   @118,  6 STATIC aCtl[ 17 ] BBOX OF oDlg SIZE 338, 83 PIXELS UPDATE ;
            FONT oFont COLORS CLR_WHITE, CLR_NBLUE, CLR_BLUE ;
            LABEL "Cuerpo del mensaje" ALIGN DT_CENTER

   @126, 10 GET aCtl[ 18 ] VAR cBody OF oDlg ;
            FONT oFont MULTILINE  UPDATE ;
            COLORS CLR_BLUE, CLR_WHITE SIZE 330, 72 PIXEL

   @208,213 SBUTTON aCtl[ 19 ] PROMPT "&Enviar" OF oDlg CRYSTAL ;
            FONT oFont SIZE 53, 16 PIXEL  ;
            COLORS CLR_BLUE, CLR_NBLUE ;
            ACTION fSendMail( cMailServer, cFrom, cTo, cSubject, cBody, cAttach, cBCC, cUser, cPass, nPort )

   @208,292 SBUTTON aCtl[ 20 ] PROMPT "&Salir" OF oDlg CRYSTAL ;
            FONT oFont SIZE 53, 16 PIXEL  ;
            COLORS CLR_BLUE, CLR_NBLUE

   ACTIVATE DIALOG oDlg CENTERED ;
            VALID ( oFont:End(), .T. )

Return Nil

//---------------------------------------------------------------------------------------------//

Function fSendMail( cMailServer, cFrom, cTo, cSubject, cBody, cAttach, cBCC, cUser, cPass, nPort )

   Local oCfg, oMsg, oError, ;
         lAuth    := ! Empty( cUser ) .and. ! Empty( cPass ), ;
         nSendOpt := 2   // send using: 1 = pickup folder  2 = port  3 = remote mail server

   Default nPort    := 25, ;
           cSubject := "", ;
           cBody    := ""

   CursorWait()

   Try
      oCfg := CreateObject( "CDO.Configuration" )

      With Object oCfg:Fields
         :Item( cdoSMTPServer ):Value     := Trim( cMailServer )
         :Item( cdoSMTPServerPort ):Value := nPort
         :Item( cdoSendUsing ):Value      := nSendOpt

         If lAuth
            :Item( cdoSMTPAuthenticate ):Value := 1
            :Item( cdoSendUserName ):Value     := Trim( cUser )
            :Item( cdoSendPassword ):Value     := Trim( cPass )
            :Item( cdoSMTPUseSSL ):Value := 1
         EndIf

         :Update()
      End With


      oMsg := CreateObject( "CDO.Message" )

      With Object oMsg
         :Configuration := oCfg
         :From          := Trim( cFrom )
         :To            := Trim( cTo )
         :Subject       := Trim( cSubject )
         :TextBody      := Trim( cBody )

         If ! Empty( cAttach )
            :AddAttachment := Trim( cAttach )
         EndIf

         If ! Empty( cBCC )
            :BCC := Trim( cBCC )
         EndIf

         :Send()
      End With

   Catch oError
      CursorArrow()
      MsgStop( "No se pudo enviar el mensaje" + CRLF  + "Error: " + cValToChar( oError:GenCode) + CRLF + ;
               "SubC: " + cValToChar( oError:SubCode ) + CRLF + "OSCode: " + cValToChar( oError:OsCode ) + CRLF + ;
               "SubSystem: " + cValToChar( oError:SubSystem ) + CRLF + "Mensaje: " + oError:Description )

      oCfg := Nil
      oMsg := Nil
      Return Nil
   End Try

   oCfg := Nil
   oMsg := Nil
   SndPlaySound( GetWinDir() + "\media\Tada.wav", 0 )
   CursorArrow()

Return Nil

//---------------------------------------------------------------------------------------------//

Static Function fAddAttach( oGet )

   Local cFile, ;
         cAttach := oGet:VarGet()

   cFile := cGetFile( "*.*", "Selecciona el archivo" )

   If ! Empty( cFile )
      cAttach := Lower( PadR( AllTrim( cAttach ) + If( ! Empty( cAttach ), ",", "" ) + AllTrim( cFile ), 180 ) )
   EndIf

   oGet:cText( cAttach )

Return Nil
Aquí tienen CdoSys.ch:

Code: Select all

#ifndef _CDOSYS_CH
#define _CDOSYS_CH
#define cdoSMTPServer       "http://schemas.microsoft.com/cdo/configuration/smtpserver"
#define cdoSMTPServerPort   "http://schemas.microsoft.com/cdo/configuration/smtpserverport"
#define cdoSendUsing        "http://schemas.microsoft.com/cdo/configuration/sendusing"
#define cdoSMTPPickupFolder "http://schemas.microsoft.com/cdo/configuration/smtpserverpickupdirectory"
#define cdoSMTPAuthenticate "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"
#define cdoSendUserName     "http://schemas.microsoft.com/cdo/configuration/sendusername"
#define cdoSendPassword     "http://schemas.microsoft.com/cdo/configuration/sendpassword"
#define cdoSMTPUseSSL       "http://schemas.microsoft.com/cdo/configuration/smtpusessl"
#endif
 
Un abrazo.

Manuel Mercado

PD a Carlos Mora.- Porqué no continúas con tu Blog Harbour Advisor? me pareció excelente su presentación además que tienes un magífico estilo en la redacción de tus temas. Gracias nuevamente.

Re: enviar emails desde fwh

Posted: Mon Feb 23, 2009 4:41 pm
by Armando
Manolo y amigos:

Parece que en el foro en Inglés hay otra alternativa.

http://forums.fivetechsupport.com/viewt ... =3&t=14678


Saludos

Re: enviar emails desde fwh

Posted: Mon Feb 23, 2009 4:55 pm
by MANOLO
Gracias armando, esta alternativa ya la he probado, agrego la lib tip.lib que viene con xharbour 1.1, pero al enviar el email, el programa se queda bloqueado y no continua, no dan ningun error, simplemente se queda colgado cuando llega a la clase turl.

gracias.

Re: enviar emails desde fwh

Posted: Mon Feb 23, 2009 5:54 pm
by MANOLO
Hola manuel, gracias por tu aportación, lo he integrado pero no envia el email da el siguiente error:

No se pudo enviar el mensaje
Error:1001
subc: 3
oscode: 0
subsystem: CDO.message
Mensaje: DISP_E_MEMBERNOTFOUND.

Me puedes decir donde puedo encontrar informacion de ésto.

Gracias

Re: enviar emails desde fwh

Posted: Mon Feb 23, 2009 6:14 pm
by mmercado
MANOLO wrote:Hola manuel, gracias por tu aportación, lo he integrado pero no envia el email da el siguiente error:

No se pudo enviar el mensaje
Error:1001
subc: 3
oscode: 0
subsystem: CDO.message
Mensaje: DISP_E_MEMBERNOTFOUND.
Hola Manolo:

Este error te lo manda con el ejemplo que publiqué o ya es en tu aplicación?
MANOLO wrote:Me puedes decir donde puedo encontrar informacion de ésto.
Busca con Google "cdosys" o "cdo mail" o "cdosys mail"

Espero que alguien más pruebe el ejemplo y nos diga si encuentra algún problema.

Saludos.

Manuel Mercado

Re: enviar emails desde fwh

Posted: Mon Feb 23, 2009 7:52 pm
by Carlos Mora
Manolo,

Es imposible adivinar que está mal en tu código si no lo subes. Es muy probable que tengas algún problema sintáctico, el error MEMBER NOT FOUND es algo así como que no encuentra la variable o método, el equivalente al Message not found de Harbour.

CDO es parte de windows, por lo que te puedo asegurar que funciona y muy bien, hasta en lugares que el resto me fallaba.

Re: enviar emails desde fwh

Posted: Mon Feb 23, 2009 8:05 pm
by Carlos Mora
Hola Manuel,
mmercado wrote: PD a Carlos Mora.- Porqué no continúas con tu Blog Harbour Advisor? me pareció excelente su presentación además que tienes un magífico estilo en la redacción de tus temas. Gracias nuevamente.
¡Cuantos elogios! :oops: Me pasa como a la gran mayoría, la falta de tiempo. Además no he tenido mucho feedback, solo un par de mensajes de agradecimiento, y otros tantos reclamando la "propiedad intelectual" de lo que escribí, lo que me quita bastante las ganas.
Tengo un artículo a medias sobre PDF, XML y formularios, y cuesta dejarlos 'presentables'. Tambien en gatera otro sobre refactoring y programar más orientado a objetos con Harbour y FW, y la importancia de los patrones de software y como afecta a los fivewinners.
Harbour advisor pretendía ser más bien el arranque de un esfuerzo colectivo, tal como lo ponía en el primer post, pero no hubo eco, los colegas prefieren seguir cada uno a su ritmo de manera individual.
Otro factor que afecta la disponibilidad de tiempo es que estoy aprendiendo algo de python, que me ha sorprendido gratamente, y que probablemente justifique otro post.

Re: enviar emails desde fwh

Posted: Tue Feb 24, 2009 7:42 am
by triumvirato
MANOLO wrote:Hola manuel, gracias por tu aportación, lo he integrado pero no envia el email da el siguiente error:

No se pudo enviar el mensaje
Error:1001
subc: 3
oscode: 0
subsystem: CDO.message
Mensaje: DISP_E_MEMBERNOTFOUND.

Me puedes decir donde puedo encontrar informacion de ésto.

Gracias
Tengo exáctamente el mismo error, con el código tal cual lo publica Manuel Mercado. En vista home premium. La dll Cdosys si está presente en esta versión de vista.
Carlos Mora wrote:Manolo,

Es imposible adivinar que está mal en tu código si no lo subes. Es muy probable que tengas algún problema sintáctico, el error MEMBER NOT FOUND es algo así como que no encuentra la variable o método, el equivalente al Message not found de Harbour.

CDO es parte de windows, por lo que te puedo asegurar que funciona y muy bien, hasta en lugares que el resto me fallaba.
Este error, desde mis mínimos conocimientos, creo recordar que era porque el objeto no se llegaba a crear.

Saludos!

Re: enviar emails desde fwh

Posted: Tue Feb 24, 2009 8:27 pm
by FranciscoA
Manuel: Muchas gracias por tu aporte.
He probado con el codigo que suministras (unicamente cambie los botones y omiti el attach), y da el siguiente error:

---------------------------------
No se pudo enviar el mensaje
Error: 1001
SubC: 16389
OSCode: 0
Subsystem: CDO.Message
Mensaje: E_FAIL
---------------------------------

Es la primera vez que pruebo emails desde FWH/xHARBOUR
Espero nos puedas ayudar.

Saludos