Inviare un'email

Moderator: Enrico Maria Giordano

Inviare un'email

Postby Marco Turco » Sun Sep 14, 2008 7:38 pm

Salve,
sto pensando di inserire nelle mie applicazioni un sistema di richiesta assistenza on line al prodotto.

Sono dell'idea di utilizzare per l'invio la classe tsmtp di FWH che però mi sembra non affidabilissima da quanto leggo sul forum.

Vorrei un vostro parere a riguardo ed anche sapere se conoscete alternative (mi sembra di ricordare che c'era una dll freeware per inviare email)

Grazie.
Best Regards,

Marco Turco
SOFTWARE XP LLP
User avatar
Marco Turco
 
Posts: 858
Joined: Fri Oct 07, 2005 12:00 pm
Location: London

Re: Inviare un'email

Postby Enrico Maria Giordano » Mon Sep 15, 2008 7:40 am

Sì, io uso la SndMail.dll

http://www.xmailserver.org/davide.html

che finora non mi ha dato problemi. Questa è la funzione che uso per pilotarla (è solo per darti un'idea, non funziona così com'è):

Code: Select all  Expand view  RUN
FUNCTION SENDMAIL( cFrom, cServer, cTo, cSubject, cMessage, aAttach, cSender, cUser, cPassword, aCc, lHtml, cPort )

    LOCAL cMsgFile := GETNEWFNAME()

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

    LOCAL nRes

    LOCAL i

    DEFAULT lHtml := .F.

    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

    MSGBOX "Invio email in corso..."

    hDLL = LOADLIB32( "sndmail.dll" )

    SMTPLIBOPEN()

    nRes = SMTPSENDMAIL( cCmd )

    SMTPLIBCLOSE()

    FREELIB32( hDLL )

    CLOSE MSGBOX

    FERASE( cMsgFile )

    RETURN nRes = 0


DLL STATIC FUNCTION SMTPLIBOPEN() AS VOID;
    PASCAL FROM "USmtpLibOpen"

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

DLL STATIC FUNCTION SMTPLIBCLOSE() AS VOID;
    PASCAL FROM "USmtpLibClose"


EMG
User avatar
Enrico Maria Giordano
 
Posts: 8725
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Postby Marco Turco » Tue Sep 30, 2008 6:50 pm

Sto provando l'esempio che mi hai inviato ma non riesco a compilarlo perché mi da sempre errori "syntax error static" sulle definizioni delle fnzioni dll. Ecco il codice leggermente semplificato che mi da l'errore.
Qualche idea ?

Grazie.

Marco

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

LOCAL cMsgFile := "test.txt"

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

LOCAL nRes

LOCAL i

DEFAULT lHtml := .F.

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

hDLL = LOADLIB32( "sndmail.dll" )

SMTPLIBOPEN()

nRes = SMTPSENDMAIL( cCmd )

SMTPLIBCLOSE()

FREELIB32( hDLL )

FERASE( cMsgFile )

RETURN nRes = 0


DLL STATIC FUNCTION SMTPLIBOPEN() AS VOID;
PASCAL FROM "USmtpLibOpen"

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

DLL STATIC FUNCTION SMTPLIBCLOSE() AS VOID;
PASCAL FROM "USmtpLibClose"
Best Regards,

Marco Turco
SOFTWARE XP LLP
User avatar
Marco Turco
 
Posts: 858
Joined: Fri Oct 07, 2005 12:00 pm
Location: London

Postby Enrico Maria Giordano » Tue Sep 30, 2008 8:09 pm

Prova così:

Code: Select all  Expand view  RUN
#include "Fivewin.ch"


STATIC hLib


FUNCTION MAIN()

    ? SENDMAIL( ... )

    RETURN NIL


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

    LOCAL cMsgFile := CTEMPFILE()

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

    LOCAL nRes

    LOCAL i

    DEFAULT lHtml := .F.

    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

    hLib = LOADLIBRARY( "sndmail.dll" )

    SMTPLIBOPEN()

    nRes = SMTPSENDMAIL( cCmd )

    SMTPLIBCLOSE()

    FREELIBRARY( hLib )

    CLOSE MSGBOX

    FERASE( cMsgFile )

    RETURN nRes = 0


DLL STATIC FUNCTION SMTPLIBOPEN() AS VOID;
    PASCAL FROM "USmtpLibOpen" LIB hLib

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

DLL STATIC FUNCTION SMTPLIBCLOSE() AS VOID;
    PASCAL FROM "USmtpLibClose" LIB hLib


EMG
User avatar
Enrico Maria Giordano
 
Posts: 8725
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Postby Marco Turco » Wed Oct 01, 2008 8:18 am

Ora viene compilata correttamente ma quando invio una mail mi restituisce sempre .f.

Ho creato un account di prova per fare i test e funziona correttamente con outlook.

Ho dimenticato qualcosa secondo te ?

------

#include "Fivewin.ch"


STATIC hLib


function invia()

cFrom:="customers@softwarexp.co.uk"
cServer:="mail.softwarexp.co.uk"
cTo:="m.turco@softwarexp.co.uk"
cSubjeCt:="Richiesta di assistenza"
cMessage:="Problema generale di contabilit…"
cSender:="Studio amministrativo"
cUser:="customers@softwarexp.co.uk"
cPassword:="diamante71"

i:=SENDMAIL( cFrom, cServer, cTo, cSubject, cMessage, {}, cSender, cUser, cPassword)

msginfo(i)
return

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

LOCAL cMsgFile := CTEMPFILE()

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

LOCAL nRes

LOCAL i

DEFAULT lHtml := .F.

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

hLib = LOADLIBRARY( "sndmail.dll" )

SMTPLIBOPEN()

nRes = SMTPSENDMAIL( cCmd )

SMTPLIBCLOSE()

FREELIBRARY( hLib )

FERASE( cMsgFile )

RETURN nRes = 0


DLL STATIC FUNCTION SMTPLIBOPEN() AS VOID;
PASCAL FROM "USmtpLibOpen" LIB hLib

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

DLL STATIC FUNCTION SMTPLIBCLOSE() AS VOID;
PASCAL FROM "USmtpLibClose" LIB hLib
Best Regards,

Marco Turco
SOFTWARE XP LLP
User avatar
Marco Turco
 
Posts: 858
Joined: Fri Oct 07, 2005 12:00 pm
Location: London

Postby Enrico Maria Giordano » Wed Oct 01, 2008 8:40 am

Per favore, usa il mio esempio così com'è. Hai cancellato qualcosa di essenziale.

EMG
User avatar
Enrico Maria Giordano
 
Posts: 8725
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Postby Marco Turco » Wed Oct 01, 2008 9:14 am

Mi sono limitato a cancellare la creazione del file temporaneo che contiene il messaggio e il comando close msgbox, per il resto è tutto inviariato inoltre il problema si presenta anche con il codice originario.

Forse c'è un problema nei parametri ?
Best Regards,

Marco Turco
SOFTWARE XP LLP
User avatar
Marco Turco
 
Posts: 858
Joined: Fri Oct 07, 2005 12:00 pm
Location: London

Postby Enrico Maria Giordano » Wed Oct 01, 2008 10:37 am

A me questo ha funzionato perfettamente (dovrebbero esserti arrivati due messaggi):

Code: Select all  Expand view  RUN
#include "Fivewin.ch"


STATIC hLib


FUNCTION MAIN()

    LOCAL cFrom     := "customers@softwarexp.co.uk"
    LOCAL cServer   := "mail.softwarexp.co.uk"
    LOCAL cTo       := "m.turco@softwarexp.co.uk"
    LOCAL cSubjeCt  := "Richiesta di assistenza"
    LOCAL cMessage  := "Problema generale di contabilità"
    LOCAL cSender   := "Studio amministrativo"
    LOCAL cUser     := "customers@softwarexp.co.uk"
    LOCAL cPassword := "diamante71"

    ? SENDMAIL( cFrom, cServer, cTo, cSubject, cMessage, , cSender, cUser, cPassword )

    RETURN NIL


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

    LOCAL cMsgFile := CTEMPFILE()

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

    LOCAL nRes

    LOCAL i

    DEFAULT lHtml := .F.

    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

    hLib = LOADLIBRARY( "sndmail.dll" )

    SMTPLIBOPEN()

    nRes = SMTPSENDMAIL( cCmd )

    SMTPLIBCLOSE()

    FREELIBRARY( hLib )

    FERASE( cMsgFile )

    RETURN nRes = 0


DLL STATIC FUNCTION SMTPLIBOPEN() AS VOID;
    PASCAL FROM "USmtpLibOpen" LIB hLib

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

DLL STATIC FUNCTION SMTPLIBCLOSE() AS VOID;
    PASCAL FROM "USmtpLibClose" LIB hLib


EMG
User avatar
Enrico Maria Giordano
 
Posts: 8725
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Postby Enrico Maria Giordano » Wed Oct 01, 2008 10:38 am

Marco Turco wrote:Mi sono limitato a cancellare la creazione del file temporaneo che contiene il messaggio


Probabilmente il problema è proprio quello. Quella parte è essenziale.

EMG
User avatar
Enrico Maria Giordano
 
Posts: 8725
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Postby Marco Turco » Wed Oct 01, 2008 11:34 am

Niente da fare.
Ho anche provato ad utilizzare direttamente la versione .exe a linea di comando ed il messaggio di errore che viene visualizzato è "Error code -17 Low level network error"

Credo che la dll non sia progettata per essere utilizzata su Vista (è datata 2003 !!)
Best Regards,

Marco Turco
SOFTWARE XP LLP
User avatar
Marco Turco
 
Posts: 858
Joined: Fri Oct 07, 2005 12:00 pm
Location: London

Postby Enrico Maria Giordano » Wed Oct 01, 2008 11:40 am

Che io sappia funziona perfettamente anche su Vista.

EMG
User avatar
Enrico Maria Giordano
 
Posts: 8725
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Postby Marco Turco » Wed Oct 01, 2008 4:25 pm

Qui non funziona però.

Comunque ho risolto con un altra soluzione,
ho scoperto che xharbour ha già inclusa una funzione per inviare emails.

Basta chiamare hb_SendMail(....) senza necessità di utilizzare classi o dll esterne. :D

Ci vorrebbe proprio una guida on line decente su tutte le funzionalità di xHarbour....
Best Regards,

Marco Turco
SOFTWARE XP LLP
User avatar
Marco Turco
 
Posts: 858
Joined: Fri Oct 07, 2005 12:00 pm
Location: London

Postby Enrico Maria Giordano » Wed Oct 01, 2008 4:33 pm

Marco Turco wrote:Qui non funziona però.


Sembra più un problema di router che di sistema operativo. Hai provato con XP con la stessa connessione Internet?

Marco Turco wrote:Comunque ho risolto con un altra soluzione,
ho scoperto che xharbour ha già inclusa una funzione per inviare emails.


Sì, ma è paurosamente lenta è per me è inusabile.

EMG
User avatar
Enrico Maria Giordano
 
Posts: 8725
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Postby Enrico Maria Giordano » Wed Oct 01, 2008 5:23 pm

Enrico Maria Giordano wrote:Sembra più un problema di router che di sistema operativo.


O forse di Firewall.

EMG
User avatar
Enrico Maria Giordano
 
Posts: 8725
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia


Return to All products support

Who is online

Users browsing this forum: No registered users and 4 guests