FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Rutina para enviar mails
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Rutina para enviar mails
Posted: Wed Dec 06, 2017 02:20 PM

Hola a todos,

A ver si me pueden aconsejar una rutina para enviar mails desde nuestra aplicación, para que simplemente copiando el EXE de nuestra aplicación (o alguna DLL de terceros gratuita) en el pc del cliente pueda funcionar.

Vamos que no tenga que registrar nada, a lo sumo usar una DLL externa (simplemente copiándola).

Se me olvidaba, tengo que anexar ficheros en el mail.

Muchas gracias,

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: Rutina para enviar mails
Posted: Wed Dec 06, 2017 02:44 PM
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Rutina para enviar mails
Posted: Wed Dec 06, 2017 10:15 PM
karinha wrote:Mira se sirve:

https://www.4shared.com/zip/9wQ0A3UHce/RMAIL.html

https://www.4shared.com/zip/yOCLl-p-ba/SNDMAIL.html

Saludos.


Gracias Karinha,

Debo estar viejo, pero no encuentro el botón "download" en los links.

Me refiero a una opción que no te obligue a registrarte o a instalar nada.

Gracias igualmente.

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Rutina para enviar mails
Posted: Wed Dec 06, 2017 10:16 PM

Alguién del foro utiliza CDO para enviar mails?

No consigo que me funcione. Ha cambiado algo en Microsoft?

Gracias,

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 282
Joined: Mon Oct 10, 2005 08:55 AM
Re: Rutina para enviar mails
Posted: Thu Dec 07, 2017 10:52 AM
FiveWiDi wrote:Alguién del foro utiliza CDO para enviar mails?

No consigo que me funcione. Ha cambiado algo en Microsoft?

Gracias,

Yo lo utilizo sin problemas en todas mis aplicaciones, lo saque del foro y solo lo configuré a mis necesidades. Te paso el código tal como lo tengo configurado por si es de ayuda.
Code (fw): Select all Collapse
Function EnviaMailCDO(aDestinos, cAsunto, cTexto, aAdjuntos, aCC, aBcc, lRespuesta )
Local oEmailCfg, oEmailMsg, oError, nFor, i, loBP
local cDatos := GetSysDir(), oIni, nDefecto := 1
local cIniFile := cDatos+"\PREFEREN.INI"

Local lEncriptaPass := .f.   //GetPvProfString("CORREO","EncriptaPass" ,.f., cIniFile)
Local cServer       := ""    //GetPvProfString("CORREO","servidor" ,"", cIniFile)
Local nPortEmail    := "25"  //VAL(GetPvProfString("CORREO","Puerto","25", cIniFile))
Local cEmailFrom    := ""    //GetPvProfString("CORREO","Remitente" ,"", cIniFile)
Local cEmailUser    := ""    //GetPvProfString("CORREO","Usuario" ,"", cIniFile)
Local cEmailPass    := ""    //GetPvProfString("CORREO","Contra" ,"", cIniFile)
Local lEmailSSL     := .f.   //GetPvProfString("CORREO","SSL" , .f., cIniFile)
local lAutentificar := .t.
local nTiempo       := "30"
local cLogo         := ""
local cFirma        := ""

DEFAULT aAdjuntos:= {}
DEFAULT cAsunto :=""
DEFAULT cTexto := ""

    if Empty(aDestinos ) .or. !("@"$aDestinos[1])
        msgStop("Es necesario indicar al menos un destinatario.", "Aviso")
        Return .f.
    endif

    if !empty( aAdjuntos )
        for nFor = 1 to LEN(aAdjuntos)
            if !file( aAdjuntos[nFor] )
                MsgStop("No existe el archivo para adjuntar:"+CRLF+;
                          aAdjuntos[nFor], "Problema" )

                return .f.
            endif
        next nFor
    endif

   INI oIni FILE RutaIniDatos()+"\MAILJVBP.INI"
        GET nDefecto SECTION "CORREO" ENTRY "CuentaDefecto" OF oIni
   ENDINI

   INI oIni FILE cDatos+"\PREFEREN.INI"
        GET cServer        SECTION "CORREOCDO_CUENTA"+str(nDefecto, 1) ENTRY "Servidor"     OF oIni
        GET cEmailFrom     SECTION "CORREOCDO_CUENTA"+str(nDefecto, 1) ENTRY "Remitente"    OF oIni
        GET cEmailUser     SECTION "CORREOCDO_CUENTA"+str(nDefecto, 1) ENTRY "Usuario"      OF oIni
        GET cEmailPass     SECTION "CORREOCDO_CUENTA"+str(nDefecto, 1) ENTRY "Contra"       OF oIni
        GET nTiempo        SECTION "CORREOCDO_CUENTA"+str(nDefecto, 1) ENTRY "Tiempo"       OF oIni DEFAULT "30"
        GET nPortEmail     SECTION "CORREOCDO_CUENTA"+str(nDefecto, 1) ENTRY "Puerto"       OF oIni DEFAULT "25"
        GET lEncriptaPass  SECTION "CORREOCDO_CUENTA"+str(nDefecto, 1) ENTRY "EncriptaPass" OF oIni DEFAULT .t.
        GET lAutentificar  SECTION "CORREOCDO_CUENTA"+str(nDefecto, 1) ENTRY "Autentificar" OF oIni DEFAULT .t.
        GET lEmailSSL      SECTION "CORREOCDO_CUENTA"+str(nDefecto, 1) ENTRY "SSL"          OF oIni DEFAULT .f.
        GET cLogo            SECTION "CORREOCDO_CUENTA"+str(nDefecto, 1) ENTRY "Logo"         OF oIni
        GET cFirma           SECTION "CORREOCDO_CUENTA"+str(nDefecto, 1) ENTRY "FirmaTxt"     OF oIni
   ENDINI

    if empty(cServer) .or. empty(cEmailFrom)
        MsgStop("Debe configurar previamente los datos del correo.", "Aviso")
        return .f.
    endif

    cLogo  := alltrim(cLogo)
    cFirma := alltrim(cFirma)
    cTexto := ConvHTML(cTexto, cLogo, cFirma)

    nTiempo    := VAL(nTiempo)
    nPortEmail := VAL(nPortEmail)
    cEmailPass := iif(lEncriptaPass, PADR(DECRYPT(cEmailPass) , 75, " "), PADR(cEmailPass , 75, " "))
    cEmailPass := ALLTRIM(cEmailPass)

    TRY
        oEmailCfg := CREATEOBJECT( "CDO.Configuration" )
        WITH OBJECT oEmailCfg:Fields
            :Item( "http://schemas.microsoft.com/cdo/configuration/smtpserver" ):Value           := cServer //"smtp.fibertel.com.ar" //"smtp.live.com" ///"smtp.gmail.com"
            :Item( "http://schemas.microsoft.com/cdo/configuration/smtpserverport" ):Value       := nPortEmail //25 //465
            :Item( "http://schemas.microsoft.com/cdo/configuration/sendusing" ):Value                := 2 // Remote SMTP = 2, local = 1
            :Item( "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate" ):Value     := lAutentificar
            :Item( "http://schemas.microsoft.com/cdo/configuration/smtpusessl" ):Value           := lEmailSSL
            :Item( "http://schemas.microsoft.com/cdo/configuration/sendusername" ):Value             := cEmailUser
            :Item( "http://schemas.microsoft.com/cdo/configuration/sendpassword" ):Value             := cEmailPass
            :Item( "http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout"):Value := nTiempo
            :Update()
        END WITH
    CATCH oError
        MsgInfo( "Error al configurar el correo" + CRLF+ ;
                    "Error: " + TRANSFORM(oError:GenCode, NIL) + CRLF+ ;
                    "SubC: " + TRANSFORM(oError:SubCode, NIL) + CRLF+ ;
                    "OSCode: " + TRANSFORM(oError:OsCode, NIL) + CRLF+ ;
                    "SubSystem: " + TRANSFORM(oError:SubSystem, NIL) + CRLF + ;
                    "Message: " + oError:Description, "Error de configuracion CDO" )
    END
    oError:=NIL

    for nFor = 1 to LEN(aDestinos)
        TRY
            oEmailMsg := CREATEOBJECT ( "CDO.Message" )
            WITH OBJECT oEmailMsg
                :Configuration = oEmailCfg
                //:From = chr(34)+'jvbp '+chr(34) + '<'+cEmailFrom+'>' // This will be displayed in the From (The email id does not appear)
                :From = cEmailFrom                   // remitente
                :To = aDestinos[nFor]                // destinatarios
                iif(!empty(aCC) , :Cc  = aCC , )     // con copia
                iif(!empty(aBcc), :BCC = aBCC, )     // con copia oculta
                :Subject = cAsunto                   // sujeto
                //:TextBody = cTexto                 // formato Texto
                //:CreateMHTMLBody("file:///E:\prueba.htm", 0) //[, flags [, username, password]]    // envia una pagina HTML ya creada
                :AutoGenerateTextBody = .T.          // cuando el cliente no acepta HTML genera un formato de texto
                :HTMLBody = cTexto                   // formato HTML
                iif(!empty(cLogo), loBP:=:AddRelatedBodyPart( cLogo, "id_imagen1", 0), )
                for i = 1 to len(aAdjuntos)
                    :AddAttachment(aAdjuntos[i])      // adjuntos
                next i
                if lRespuesta
                    :MDNRequested = .T.               // Requiere respuesta
                    :fields( "urn:mailheader:disposition-notification-to" ):Value := cEmailFrom
                    :fields( "urn:mailheader:return-receipt-to" ):Value := cEmailFrom
                    :fields:Update()
                endif
                :Send()
            END WITH
        CATCH oError
            MsgInfo("Error al enviar el mensaje" + CRLF+ ;
                      "Error: " + TRANSFORM(oError:GenCode, NIL) + CRLF+;
                      "SubC: " + TRANSFORM(oError:SubCode, NIL) + CRLF +;
                      "OSCode: "+ TRANSFORM(oError:OsCode, NIL) + CRLF +;
                      "SubSystem: " + TRANSFORM(oError:SubSystem, NIL) + CRLF +;
                      "Message: " + oError:Description, "Error al enviar el mensaje" )
            return .f.
        END
    next nFor

Return .T.

Saludos :-)
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: Rutina para enviar mails
Posted: Thu Dec 07, 2017 01:05 PM
Hola, puedes descargar los archivos directamente desde PCToledo en este enlace:

http://www.pctoledo.com.br/forum/viewtopic.php?f=2&t=18800

http://www.pctoledo.com.br/forum/index.php

Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 1054
Joined: Sun Oct 09, 2005 10:41 PM
Re: Rutina para enviar mails
Posted: Fri Dec 08, 2017 11:40 AM

Hola amigos...
No me funciona SNDMAIL... a alguien le funciona???
SAlu2

Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: Rutina para enviar mails
Posted: Fri Dec 08, 2017 12:48 PM


Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 182
Joined: Tue Oct 18, 2005 10:01 AM
Re: Rutina para enviar mails
Posted: Sat Dec 09, 2017 09:49 AM

https://www.emailarchitect.net/easendmail

is an activeX component and works perfect.

Posts: 1286
Joined: Mon Feb 25, 2008 02:54 PM
Re: Rutina para enviar mails
Posted: Sat Dec 09, 2017 12:39 PM

Toninho, como funciona? tem um exemplo?

ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
Posts: 1054
Joined: Sun Oct 09, 2005 10:41 PM
Re: Rutina para enviar mails
Posted: Sun Dec 10, 2017 04:18 AM

Hola Karinha
Error: 'D:\PRGS\SNDMAIL\PRG\SNDMAIL.LIB' contains invalid OMF record, type 0x21 (possibly COFF)
* Linking errors *

Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Rutina para enviar mails
Posted: Sun Dec 10, 2017 10:26 AM
Willi Quintana wrote:Hola Karinha
Error: 'D:\PRGS\SNDMAIL\PRG\SNDMAIL.LIB' contains invalid OMF record, type 0x21 (possibly COFF)
* Linking errors *


Posiblemente sea una libreria para VS y estés utilizando Borland
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: Rutina para enviar mails
Posted: Mon Dec 11, 2017 11:16 AM
Willi Quintana wrote:Hola Karinha
Error: 'D:\PRGS\SNDMAIL\PRG\SNDMAIL.LIB' contains invalid OMF record, type 0x21 (possibly COFF)
* Linking errors *



Willi, cual és la versión del FiveWin y Xharbour y Borlland que usas?

Compilo con:

Code (fw): Select all Collapse
C:\FWH1701\

C:\BCC72\

C:\XHARBOUR72\


Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: Rutina para enviar mails
Posted: Mon Dec 11, 2017 12:52 PM
Con:

Code (fw): Select all Collapse
   "smtp.mail.yahoo.com"


No funciona. Que lástima.

Aqui, otro modelo:

http://linguagemclipper.com.br/book/export/html/48

https://groups.google.com/forum/#!topic/harbour-users/Q5XoaghBQI8

Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: Rutina para enviar mails
Posted: Mon Dec 11, 2017 07:13 PM
Willi, intenta asi:

Code (fw): Select all Collapse
#include "Fivewin.ch"

STATIC hDll

FUNCTION MAIN()

   LOCAL cFrom     := "joao@pleno.com.br"
   LOCAL cServer   := "smtp.pleno.com.br"
   LOCAL cTo       := "joao@pleno.com.br"
   LOCAL cSubjeCt  := "Test with sendmail CDO"
   LOCAL cMessage  := "Test with sendmail - Email Body"
   LOCAL cSender   := "joao@pleno.com.br"
   LOCAL cUser     := "joao@pleno.com.br"
   LOCAL cPassword := "XXXXXXX"
   LOCAL aAttach := {}
   LOCAL aCc     := ""  //???
   LOCAL lHtml   := .F.
   LOCAL cPort := "587"
   LOCAL lNotification := .F. // cFrom
   LOCAL lRet
   LOCAL lSSL := .F.

 //lRet := SENDMAIL( cFrom, cServer, cTo, cSubject, cMessage, cSender, cUser, cPassword, aAttach, aCc, lHtml, cPort, lNotification )

   // USING CDO
   lRet := SENDMAIL( cFrom, cServer, cTo, cSubject, cMessage, aAttach, cSender, cUser, cPassword, aCc, lHtml, cPort, lNotification, lSSL )


   IF lRet

      ? "Message sent successfully perfect with FWH17.01"

   ELSE

      ? "Unsent message check windows live mail"

   ENDIF

RETURN NIL

// <!-- l --><a class="postlink-local" href="http://forums.fivetechsupport.com/viewtopic.php?f=3&t=21490#p191444">viewtopic.php?f=3&t=21490#p191444</a><!-- l -->

FUNCTION SENDMAIL( cFrom, cServer, cTo, cSubject, cMessage, aAttach, cSender, cUser, cPassword, aCc, lHtml, cPort, lNotification, lSSL )

    LOCAL lOk := .F.

    LOCAL oCfg, oMsg

    LOCAL cCc := ""

    LOCAL i

    DEFAULT lHtml         := "<html" $ LOWER( cMessage )
    DEFAULT lNotification := .F.
    DEFAULT lSSL          := .T.

    TRY
        oCfg = CREATEOBJECT( "CDO.Configuration" )

        oCfg:Item( "http://schemas.microsoft.com/cdo/configuration/smtpserver" ):Value = cServer

        IF !EMPTY( cPort )
            oCfg:Item( "http://schemas.microsoft.com/cdo/configuration/smtpserverport" ):Value := VAL( cPort )
        ENDIF

        oCfg:Item( "http://schemas.microsoft.com/cdo/configuration/sendusing" ):Value = 2
        oCfg:Item( "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate" ):Value = .F.

        IF !EMPTY( cUser ) .AND. !EMPTY( cPassword )
            oCfg:Item( "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate" ):Value = .T.
            oCfg:Item( "http://schemas.microsoft.com/cdo/configuration/sendusername" ):Value = cUser
            oCfg:Item( "http://schemas.microsoft.com/cdo/configuration/sendpassword" ):Value := cPassword
            oCfg:Item( "http://schemas.microsoft.com/cdo/configuration/smtpusessl" ):Value = lSSL
        ENDIF

        oCfg:Update()

        oMsg = CREATEOBJECT( "CDO.Message" )

        oMsg:Configuration = oCfg

        IF !EMPTY( cSender )
            cFrom = ["] + cSender + ["] + " <" + cFrom + ">"
        ENDIF

        oMsg:From    = cFrom
        oMsg:To      = cTo
        oMsg:Subject = cSubject

        IF !EMPTY( aCc )
            FOR i = 1 TO LEN( aCc )
                IF i > 1
                    cCc += ";"
                ENDIF

                cCc += aCc[ i ]
            NEXT

            oMsg:CC = cCc
        ENDIF

        IF !lHtml
            oMsg:TextBody = cMessage
        ELSE
            oMsg:HTMLBody = cMessage
        ENDIF

        IF !EMPTY( aAttach )
            FOR i = 1 TO LEN( aAttach )
                oMsg:AddAttachment( aAttach[ i ] )
            NEXT
        ENDIF

        IF lNotification
            oMsg:Fields:Item( "urn:mailheader:disposition-notification-to" ):Value = cFrom
            oMsg:Fields:Update()
        ENDIF

        oMsg:Send()

        lOk = .T.
    CATCH
    END

RETURN lOk


/*
FUNCTION SENDMAIL( cFrom, cServer, cTo, cSubject, cMessage, cSender, cUser, cPassword, aAttach, aCc, lHtml, cPort, lNotification )


    LOCAL cMsgFile := CTEMPFILE()

    LOCAL cCmd := "SndMail -f " + cFrom + " -X " + cServer + " -r " + cTo + " -s " + ["] + cSubject + ["] + " -b " + cMsgFile

    LOCAL nRes

    LOCAL i

    DEFAULT lHtml := "<html" $ LOWER( cMessage )

    MEMOWRIT( cMsgFile, cMessage + CRLF )

    IF !EMPTY( aAttach )
        FOR i = 1 TO LEN( aAttach )
            cCmd += " -a " + ["] + aAttach[ i ] + ["]
        NEXT
    ENDIF

    IF !EMPTY( cSender )
        cCmd += " -F " + ["] + cSender + ["]
    ENDIF

    IF !EMPTY( cUser )
        cCmd += " -h LOGIN -u " + cUser
    ENDIF

    IF !EMPTY( cPassword )
        cCmd += " -p " + cPassword
    ENDIF

    IF !EMPTY( aCc )
        FOR i = 1 TO LEN( aCc )
            cCmd += " -c " + ["] + aCc[ i ] + ["]
        NEXT
    ENDIF

    IF lHtml
        cCmd += " -H"
    ENDIF

    IF !EMPTY( cPort )
        cCmd += " -P " + cPort
    ENDIF

    IF !EMPTY( lNotification )
       cCmd += " -t " + ["] + "Disposition-Notification-To: " + cFrom + ["]
    ENDIF

    hDLL = LOADLIBRARY( "sndmail.dll" )

    IF hDll = 0
       ? [Install sndmail.dll.. ]
       __QUIT()
    ELSE
       SMTPLIBOPEN() // OPEN sndmail.dll
    ENDIF

    nRes = SMTPSENDMAIL( cCmd )

    SMTPLIBCLOSE()

    FREELIBRARY( hDLL )

    FERASE( cMsgFile )

RETURN nRes = 0
*/

/*
DLL STATIC FUNCTION SMTPLIBOPEN() AS VOID;
    PASCAL FROM "USmtpLibOpen" LIB hDll

DLL STATIC FUNCTION SMTPSENDMAIL( cCmd AS STRING ) AS LONG;
    PASCAL FROM "USmtpCmdLineSendMail" LIB hDll

DLL STATIC FUNCTION SMTPLIBCLOSE() AS VOID;
    PASCAL FROM "USmtpLibClose" LIB hDll
*/

// END OF PROGRAM


Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341