jose_murugosa wrote:Amigo el link baja un archivo de 0 bytes.
Perdona, no me había dado cuenta.
Parece ser que no puedo subir nada a HyperUpLoad.
¿Vosotros podeis?
Saludos
Carlos G.
Aun así aquí va todo el código de la clase:
********************************************
/* C.Gelabert octubre'06.
02/10/2006 Añadido DelFiles(), SendAgain(lEspera), LaunchBat(lEspera)
Contempla posibilidad de envío esperando resultado.
01/10/2006 Añadido MakeFBody( cMensaje ) y ::cfBodyBlat
23/09/2006 Añadido control de éxito en el envío del email.
DATA 'lSendok' que indica si el envío ha tenido éxito.
DATA 'cFileError' que será de uso interno.
Método 'End()' devuelve .T. o .F. si el envío ha tenido éxito.
16/09/2006 Primera versión de la clase.
-------------------------------------------------------------------------------------------
Esta clase tiene como finalidad lanzar la utilidad Blat.exe para el envío de correos
electrónicos, es de libre distribución y es de agradecer que si alguién la amplía
me envíe la nueva versión.
Algunas de sus características són:
- Utiliza ficheros auxiliares que la propia clase elimina, evitando con ello la limitación
del modo consola (DOS) en la longitud del uso de comandos desde el PROMPT.
- Permite conservar los emails enviados por si fuera necesario reenviarlos.
(::lDeleteTemp := .F. evita el borrado de los ficheros de la clase que se utilizan)
- Esta clase es fácilmente ampliable con el resto de opciones que utiliza Blat.exe.
- Con una sola llamada a la clase se envía un email.
ej.
lExito := Tfblat():New( "Amiservidor.calimero.com", ;
"miemailde@envio.com", ;
"c:\utilidades\Blat\Blat.exe", ;
"c:\temp", ;
{"fivewidi@laleche.com", "mitia@lola.com"}, ;
{"cgelabert@laleche.com", "cogeeldinero@ycorre.com"}, ;
{"ghermano@laleche.com", "control@emails.com"}, ;
"Asuntito prueba mensaje", ;
"el mensajito" ;
):Send():End()
Inconvenientes:
- Si se desea enviar una batería de emails sería conveniente (pero no obligatorio)
realizar un Inkey(1) entre mensajes para evitar que los nombres de los ficheros
coincidan.
*/
#include "Obj2Hb.ch"
#include "Fileio.Ch"
#define HKEY_LOCAL_MACHINE 2147483650 // 0x80000002
//----------------------------------------------------------------------------//
CLASS TfBlat
CLASSDATA lRegistered AS LOGICAL
DATA cVersion AS STRING // Versión de la clase.
DATA lInstall AS LOGICAL // Indicador de si Blat.exe ja ha estado registrado en el sistema.
DATA cServer AS STRING // Servidor de correo para envío. (correo.lapera.com)
DATA cMailsender AS STRING // Mail de envío.
DATA lSendOk AS LOGICAL // Indica si el envío se ha realizado con éxito
DATA cPathBlat AS STRING // Path completo de la ubicación de BLAT.EXE (C:\micarpeta\elblat\blat.exe)
DATA cPathWork AS STRING // Path de trabajo para la creación de ficheros auxiliares. (C:\Temp\)
DATA cFileBat AS STRING // Fichero .BAT que será lanzado para el envío de los mails.
DATA cFileError AS STRING // Fichero .TXT que indicará si se ha realizado el envío con éxito.
DATA cFileOptions AS STRING // Fichero con las opciones de envío. (20080907145815.op [día i hora]))
DATA lDeleteTemp AS LOGICAL // Indicador de borrado de ficheros temporales.
DATA aTo AS ARRAY // Array de los Destinatarios.
DATA cTf AS STRING // Fichero con los Destinatarios. (20080907145815.tf [día i hora]))
DATA aCc AS ARRAY // Array de los Destinatarios de la Copia.
DATA cCf AS STRING // Fichero con los Destinatarios de la Copia. (20080907145815.cf [día i hora]))
DATA aBcc AS ARRAY // Array de los Destinatarios de la Copia Oculta.
DATA cBf AS STRING // Fichero con los Destinatarios de la Copia Oculta. (20080907145815.bf [día i hora]))
DATA cSubject AS STRING // Asunto.
DATA cSf AS STRING // Fichero que contiene el asunto.
DATA cBody AS STRING // Cuerpo del mensaje.
DATA cfBody AS STRING // Fichero del USUARIO que contine el cuerpo del mensaje.
DATA cfBodyBlat AS STRING // Fichero de la CLASE que contine el cuerpo del mensaje.
DATA cSig AS STRING // Fichero que contiene la firma a insertar al final del cuerpo del mensaje.
DATA cPs AS STRING // Fichero que contiene un final para el mensaje (posterior a la firma).
DATA cAttachi AS STRING // Fichero insertado en el mensaje.
DATA aAf AS ARRAY // Array de los ficheros binarios a adjuntar.
DATA cAf AS STRING // Fichero que contiene la lista de ficheros binarios a adjuntar. (20080907145815.fbi [día i hora]))
DATA aAtf AS ARRAY // Array de los ficheros de textos a adjuntar.
DATA cAtf AS STRING // Fichero que contiene la lista de ficheros de texto a adjuntar. (20080907145815.ftx [día i hora]))
DATA cMailFrom AS STRING // No tiene porque coincidir con el mail de envío original, será el mail que utiliza el 'Responder'.
DATA cOrg AS STRING // Nombre de la Organización.
DATA nPriority AS NUMERIC // Prioridad del mensaje. (0=baja, 1=alta).
DATA lAcuserecibo AS LOGICAL // Solicita acuse de recibo a Destinatario.
DATA lToScreen AS LOGICAL // Echo por pantalla.
METHOD New( cservidor, ;
cMaildeenvio, ;
cUbicacionBlat, ;
cPathdeTrabajo, ;
aDestinatario, ;
aCopiaa, ;
aCopiaocultaa, ;
cAsunto, ;
cMensaje ) CONSTRUCTOR
METHOD Server( cServidor ) INLINE If( Empty(cServidor), ::cServer, ::cServer := cServidor )
METHOD MailSender( cMaildeenvio ) INLINE If( Empty(cMaildeenvio), ::cmailsender, ::cmailsender := cMaildeenvio )
METHOD PathBlat( cUbicacionBlat ) INLINE If( Empty(cUbicacionBlat), ::cPathBlat, ::cPathBlat := cUbicacionBlat )
METHOD PathWork( cPathdeTrabajo ) INLINE If( Empty(cPathdeTrabajo), ::cPathWork, ::cPathWork := cPathdeTrabajo )
METHOD Init()
METHOD IsBlatInstall()
METHOD AddTo( cDestinatario ) INLINE If(Empty(cDestinatario), Nil, AADD( ::aTo, cDestinatario ) )
METHOD AddCc( cCopiaa ) INLINE If(Empty(cCopiaa), Nil, AADD( ::aCc, cCopiaa ) )
METHOD AddBCc( cCopiaOcultaa ) INLINE If(Empty(cCopiaOcultaa), Nil, AADD( ::aBcc, cCopiaOcultaa ) )
METHOD Subject( cAsunto ) INLINE If( Empty(cAsunto), ::cSubject, ::cSubject := cAsunto )
METHOD Body( cMensaje ) INLINE If( Empty(cMensaje), ::cBody, ( ::cfBody := "", ::cBody := cMensaje ) )
METHOD FBody( cFileMensaje ) INLINE If( Empty(cFileMensaje), ::cfBody, ( ::cBody := "", ::cfBody := cFileMensaje ) )
METHOD MakeFBody( cMensaje ) INLINE ( MemoWrit( ::cfBodyBlat, cMensaje), ::FBody( ::cfBodyBlat ) )
METHOD FSig( cFileFirma ) INLINE If( Empty(cFileFirma), ::cSig, ::cSig := cFileFirma )
METHOD FPs( cFileEnd ) INLINE If( Empty(cFileEnd), ::cPs, ::cPs := cFileEnd )
METHOD FAttachi( cFileInBody ) INLINE If( Empty(cFileInBody), ::cAttachi, ::cAttachi := cFileInBody )
METHOD FAttach( cFileBin ) INLINE If(Empty(cFileBin), Nil, AADD( ::aAf, cFileBin ) )
METHOD FAttact( cFileTxt ) INLINE If(Empty(cFileTxt), Nil, AADD( ::aAtf, cFileTxt ) )
METHOD MailFrom( cMailRespuesta ) INLINE If( Empty(cMailRespuesta), ::cMailFrom, ::cMailFrom := cMailRespuesta )
METHOD Org( corganizacion ) INLINE If( Empty(cOrganizacion), ::cOrg, ::cOrg := cOrganizacion )
METHOD Priority( nPrioridad ) INLINE If( Empty(nPrioridad), ::nPriority, ::nPriority := nPrioridad )
METHOD Acuserecibo( lAutoRespuesta ) INLINE If( Empty(lAutoRespuesta), ::lAcuserecibo, ::lAcuserecibo := lAutoRespuesta )
METHOD Screen( lApantalla ) INLINE If( Empty(lApantalla), ::lToScreen, ::lToScreen := lApantalla )
METHOD MakeFiles()
METHOD DelFiles()
METHOD Send()
METHOD SendAgain()
METHOD LaunchBat()
METHOD End()
ENDCLASS
//----------------------------------------------------------------------------//
METHOD New( cServidor, ;
cMaildeenvio, ;
cUbicacionBlat, ;
cPathdeTrabajo, ;
aDestinatario, ;
aCopiaa, ;
aCopiaocultaa, ;
cAsunto, ;
cMensaje ) CLASS TfBlat
DEFAULT cServidor := "Servidor.no.especificado"
DEFAULT cMaildeenvio := "Noseespecifico@emailde.envio"
DEFAULT cUbicacionBlat := Curdrive() + ":" + Curdir() + "\Blat"
DEFAULT cPathdeTrabajo := Curdrive() + ":" + Curdir() + "\Blat\Work"
DEFAULT aDestinatario := { "No se especificó destinatario" }
DEFAULT aCopiaa := {}
DEFAULT aCopiaOcultaa := {}
DEFAULT cAsunto := "Email por Blat.exe"
DEFAULT cMensaje := ""
::cVersion := "1.1"
::cServer := cServidor
::cMailsender := cMaildeenvio
::cPathBlat := cUbicacionBlat
::cPathWork := cPathdeTrabajo
::Init()
::aTo := aDestinatario
::aCc := aCopiaa
::aBcc := aCopiaOcultaa
//AEVal( aDestinatario, {|cDestinatario| ::AddTo( cDestinatario ) } )
//AEVal( aCopiaa, {|cCopiaa| ::AddCc( cCopiaa ) } )
//AEVal( aCopiaOcultaa, {|cCopiaocultaa| ::AddBcc( cCopiaOcultaa ) } )
::Subject( '"' + cAsunto + '"' )
::Body( '"' + cMensaje + '"' )
RETURN Self
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
METHOD Init() CLASS TfBlat
Local cDummy1 := "", cDummy2 := "", nContador := 0
If !lIsdir( ::PathWork() )
cDummy1 := StrToken( ::PathWork(), ++nContador, "" )
cDummy2 := StrToken( ::PathWork(), ++nContador, "" )
While AllTrim( cDummy2 ) <> ""
cDummy1 := cDummy1 + "" + cDummy2
lMkDir( cDummy1 )
cDummy2 := StrToken( ::PathWork(), ++nContador, "" )
End
EndIf
::lSendOk := .F.
::aTo := {}
::aCc := {}
::aBcc := {}
::aAf := {}
::aAtf := {}
::cFileBat := ;
::cFileError := ;
::cFileOptions := ;
::cfBodyBlat := ;
::cTf := ::cCf := ;
::cBf := ::cAf := ;
::cAtf := ::PathWork() + DToS( Date() ) + StrTran( Time(), ":" )
::cFileBat := ::cFileBat + ".bat"
::cFileError := ::cFileError + "_Error.Txt"
::cFileOptions := ::cFileOptions + ".op"
::cfBodyBlat := ::cfBodyBlat + ".men"
::cTf := ::cTf + ".tf"
::cCf := ::cCf + ".cf"
::cBf := ::cBf + ".bf"
::cAf := ::cAf + ".fbi"
::cAtf := ::cAtf + ".ftx"
::nPriority := 0
::lAcuserecibo := .F.
::lToScreen := .T.
::lDeleteTemp := .T.
::lInstall := .T.
/* Habilite la siguiente línea si desea que se realice un 'install' del Blat.exe
en caso de que el sistema no tenga guardados los parámetros del Blat.
Para enviar correos, en principio en una configuración estándar no será
necesario.
-------------------------------------------------------------------------- */
//::lInstall := ::IsBlatInstall()
RETURN Nil
//----------------------------------------------------------------------------//
/* ********************************************************
Comprueba si Blat.exe ha estado 'instalado' en el sistema
leyendo Datos de Configuración de Blat en el Registro.
******************************************************** */
METHOD IsBlatInstall() CLASS TfBlat
LOCAL oReg
Local cDummy := ""
oReg := TReg32():New(HKEY_LOCAL_MACHINE,"SOFTWARE\Public Domain\Blat")
cDummy := PadR(oReg:Get("SMTP server", cDummy),250)
//Traza(1, "AllTrim(cDummy)=", allTrim(cDummy) )
/*
::cDe := PadR(oReg:Get("Sender" , ::cDe) ,250)
::cSMTP := PadR(oReg:Get("SMTP server", ::cSMTP),250)
::nPuerto := PadR(oReg:Get("SMTP Port" , ::nPuerto),4)
::nIntentos := PadR(oReg:Get("Try" , ::nIntentos),2)
::cConexion := PadR(oReg:Get("Conexion" , ::cConexion),250)
::lSeguro := oReg:Get("SECURE server", ::lSeguro)
::cUsuario := PadR(oReg:Get("User name" , ::cUsuario),250)
::cClave := PadR(DeCrypt(oReg:Get("User password",::cClave), "BlAt"),50)
*/
oReg:Close()
RETURN Len(AllTrim( cDummy )) <> 0
/* Método no utilizado y sólo comentado.
*******************************************************
* Graba Datos de Configuraci¢n de Blat en el Registro *
*******************************************************
METHOD GrabaBlat() CLASS TfBlat
LOCAL oReg
oReg := TReg32():New(HKEY_LOCAL_MACHINE,"SOFTWARE\Public Domain\Blat")
oReg:Set("Sender" , AllTrim(::cDe))
oReg:Set("SMTP server" , AllTrim(::cSMTP))
oReg:Set("SMTP Port" , Alltrim(::nPuerto) )
oReg:Set("Conexion" , AllTrim(::cConexion) )
oReg:Set("Try" , Alltrim(::nIntentos) )
oReg:Set("SECURE server", ::lSeguro )
oReg:Set("User name" , AllTrim(::cUsuario) )
oReg:Set("User password", AllTrim(EnCrypt(::cClave, "BlAt")) )
oReg:Close()
RETURN .T.
*/
//----------------------------------------------------------------------------//
METHOD MakeFiles() CLASS TfBlat
Local lResultado := .T.
Local nContador := 0
Local hFile := 0
Local cOpciones := ""
If Len( ::aTo ) > 0
cOpciones := cOpciones + " -tf " + ::cTf
IF ( hFile := FCREATE( ::cTf, FC_NORMAL)) == -1
lResultado := .F.
Else
FWRITE( hFile, ::aTo[1] )
For nContador := 2 To Len( ::aTo )
FWRITE( hFile, "," + ::aTo[nContador] )
EndFor
FCLOSE( hFile )
EndIf
EndIf
If Len( ::aCc ) > 0
cOpciones := cOpciones + " -cf " + ::cCf
IF ( hFile := FCREATE( ::cCf, FC_NORMAL)) == -1
lResultado := .F.
Else
FWRITE( hFile, ::aCc[1] )
For nContador := 2 To Len( ::aCc )
FWRITE( hFile, "," + ::aCc[nContador] )
EndFor
FCLOSE( hFile )
EndIf
EndIf
If Len( ::aBcc ) > 0
cOpciones := cOpciones + " -bf " + ::cBf
IF ( hFile := FCREATE( ::cBf, FC_NORMAL)) == -1
lResultado := .F.
Else
FWRITE( hFile, ::aBcc[1] )
For nContador := 2 To Len( ::aBcc )
FWRITE( hFile, "," + ::aBcc[nContador] )
EndFor
FCLOSE( hFile )
EndIf
EndIf
If Len( ::aAf ) > 0
cOpciones := cOpciones + " -af " + ::cAf
IF ( hFile := FCREATE( ::cAf, FC_NORMAL)) == -1
lResultado := .F.
Else
FWRITE( hFile, ::aAf[1] )
For nContador := 2 To Len( ::aAf )
FWRITE( hFile, "," + ::aAf[nContador] )
EndFor
FCLOSE( hFile )
EndIf
EndIf
If Len( ::aAtf ) > 0
cOpciones := cOpciones + " -atf " + ::cAtf
IF ( hFile := FCREATE( ::cAtf, FC_NORMAL)) == -1
lResultado := .F.
Else
FWRITE( hFile, ::aAtf[1] )
For nContador := 2 To Len( ::aAtf )
FWRITE( hFile, "," + ::aAtf[nContador] )
EndFor
FCLOSE( hFile )
EndIf
EndIf
If !Empty( ::cSubject )
cOpciones := cOpciones + " -subject " + ::cSubject
EndIf
If !Empty( ::cSf )
cOpciones := cOpciones + " -sf " + ::cSf
EndIf
IF ( hFile := FCREATE( ::cFileOptions, FC_NORMAL)) == -1
//traza( 1, "NO Ok ::cFileOptions=", ::cFileOptions, ".-.", LTrim( cOpciones ) )
lResultado := .F.
Else
FWRITE( hFile, LTrim( cOpciones ) )
FCLOSE( hFile )
//traza( 1, "Ok ::cFileOptions=", ::cFileOptions, ".-.", LTrim( cOpciones ) )
EndIf
IF ( hFile := FCREATE( ::cFileBat, FC_NORMAL)) == -1
lResultado := .F.
Else
If !::lInstall
FWRITE( hFile, Chr(13) + Chr(10) + "REM ******************************************************************************" )
FWRITE( hFile, Chr(13) + Chr(10) + "REM Instalación de Blat.exe desde FiveWin mediante la clase TfBlat (versión " + ::cVersion + " )" )
FWRITE( hFile, Chr(13) + Chr(10) + "REM ******************************************************************************" )
FWRITE( hFile, Chr(13) + Chr(10) + ::cPathBlat )
FWRITE( hFile, " -install " + ::cServer + " " + ::cMailsender )
FWRITE( hFile, Chr(13) + Chr(10) + " " )
FWRITE( hFile, Chr(13) + Chr(10) )
EndIf
FWRITE( hFile, Chr(13) + Chr(10) + "REM *************************************************************************************" )
FWRITE( hFile, Chr(13) + Chr(10) + "REM Envío de email usando Blat.exe desde FiveWin mediante la clase TfBlat (versión " + ::cVersion + " )" )
FWRITE( hFile, Chr(13) + Chr(10) + "REM *************************************************************************************" )
FWRITE( hFile, Chr(13) + Chr(10) + ::cPathBlat )
If !Empty( ::cBody )
FWRITE( hFile, " - -body " + ::cBody )
EndIf
If !Empty( ::cfBody )
FWRITE( hFile, " " + ::cfBody )
EndIf
FWRITE( hFile, " -of " + ::cFileOptions )
FWRITE( hFile, " -server " + ::cServer + ;
" -f " + ::cMailsender + ; // " -i
paam12paam12@paam12paam12.com " ;
" -priority " + Str(::nPriority,1,0) + ;
If(::lAcuserecibo, " -r", "") + ;
If(::lToScreen, "", " -q" ) )
If !Empty( ::cMailFrom )
FWRITE( hFile, " -mailfrom " + ::cMailFrom )
EndIf
FWRITE( hFile, Chr(13) + Chr(10) + " " )
FWRITE( hFile, Chr(13) + Chr(10) + "If %errorlevel%==0 Goto NoError" )
FWRITE( hFile, Chr(13) + Chr(10) + "Echo Mensaje_no_enviado__Error_%errorlevel% > " + ::cFileError )
FWRITE( hFile, Chr(13) + Chr(10) + ":Noerror" )
FWRITE( hFile, Chr(13) + Chr(10) + " " )
//FWRITE( hFile, Chr(13) + Chr(10) + " " )
//FWRITE( hFile, Chr(13) + Chr(10) + "Pause Pulsa Intro para continuar." )
//FWRITE( hFile, Chr(13) + Chr(10) + " " )
FCLOSE( hFile )
EndIf
Return lResultado
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
METHOD Send( lEspera ) CLASS TfBlat
::LaunchBat( lEspera )
Return Self
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
METHOD SendAgain( lEspera ) CLASS TfBlat
::lSendOk := .F.
::DelFiles()
::MakeFiles()
::LaunchBat( lEspera )
Return Self
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
METHOD LaunchBat( lEspera ) CLASS TfBlat
DEFAULT lEspera := .T.
If .not. File( ::cFileBat )
::MakeFiles()
EndIf
// así funciona ShellExecute( 0, 0, ::cFileBat, 0, 0, 1 )
/*
#define SW_NORMAL 1
#define SW_MAXIMIZE 3
#define SW_MINIMIZE 6
#define SW_RESTORE 9
#define SW_HIDE 0
#define SW_SHOWNA 8
*/
#define SW_HIDE 0
//Traza( 1, ShellExecute( GetWndApp(), 0, ::cFileBat, 0, 0, SW_HIDE ) )
//ShellExecute( GetWndApp(), 0, ::cFileBat, 0, 0, SW_HIDE )
If lEspera
WaitRun( ::cFileBat )
If .not. File( ::cFileError )
::lSendOk := .T.
EndIf
Else
ShellExecute( GetWndApp(), 0, ::cFileBat, 0, 0, SW_HIDE )
EndIf
Return Self
//----------------------------------------------------------------------------//
METHOD DelFiles() CLASS TfBlat
FErase( ::cFileBat ) // fitxer .BAT
FErase( ::cFileError) // fitxer indicador d'error .TXT
FErase( ::cFileOptions ) // fitxer amb les opcions per llençar el Blat.exe
FErase( ::cfBodyBlat ) // fitxer amb el cos del missatge creat automàticament per la clase, NO per l'usuari.
FErase( ::cTf ) // fitxer amb els destinataris del mail
FErase( ::cCf ) // fitxer amb els destinataris de la copia del mail
FErase( ::cBf ) // fitxer amb els destinataris de la copia oculta del mail
FErase( ::cAf ) // fitxer amb els fitxers binaris a adjuntar al mail
FErase( ::cAtf ) // fitxer amb els fitxers plans (tipus TXT) a adjuntar al mail
Return Nil
//----------------------------------------------------------------------------//
METHOD End() CLASS TfBlat
Local lEnviocorrecto
lEnviocorrecto := ::lSendOk
If ::lDeleteTemp
::DelFiles()
EndIf
::aTo := {}
::aCc := {}
::aBcc := {}
::aAf := {}
::aAtf := {}
Self := Nil
Return lEnviocorrecto
//----------------------------------------------------------------------------//
********************************************