Inviare mail metodo CDO con Report

di il
11 risposte

Inviare mail metodo CDO con Report

Salve a tutti, facendo seguito ad un altro 3d aperto relativamente all'invio massivo di report, con il vostro aiuto e con il metodo SendObject sono riuscito a creare il body in HTML ed inserire immagini nella mail
https://www.iprogrammatori.it/forum-programmazione/access/immagine-body-email-senza-utilizzare-outlook-per-invio-mail-t35067.html

Però, giustamente ho voluto complicarmi la vita, impostando anche l'autenticazione poichè, nel 3d si voleva utilizzare principalmente Thunderbird come "canale" principale" ma, nel caso in cui vi sono più account in Thunderbird, ho riscontrato che utilizzava il 1° account presente ed Access, in fase di invio, non mi permette di scegliere quale account utilizzare...

Da qui ho rimodulato la cosa a discapito della lentezza di autenticazione del metodo CDO ma, rispetto al SendObject, non permette di allegare il report "aperto", personalizzato a seconda dei dati del cliente e quindi in un Loop trattato in un ulteriore 3d
https://www.iprogrammatori.it/forum-programmazione/access/inoltro-massivo-mail-con-allegato-report-origine-dati-query-maschera-t34587.html

Ho provato quindi, durante il loop, tramite l'OutputTo di esportare il report in una cartella temporanea per poi allegarla alla mail ed inviarla e qui nasce il problema...nel loop imposto anche che dopo l'invio deve eliminare quel report ed invece, lo elimina solo quando va in errore (trova il report chiamato nella stessa maniera e blocca il loop) e non durante il loop... in cosa sbaglio? O vi è u metodo più veloce invece di esportare il report per poi allegarlo ed infine eliminarlo?

11 Risposte

  • Re: Inviare mail metodo CDO con Report

    zio Ken ha scritto:


    nel loop imposto anche che dopo l'invio deve eliminare quel report ed invece, lo elimina solo quando va in errore (trova il report chiamato nella stessa maniera e blocca il loop) e non durante il loop... in cosa sbaglio?
    Se non scrivi il codice che usi è impossibile anche solo farsi un'idea.

    zio Ken ha scritto:


    O vi è u metodo più veloce invece di esportare il report per poi allegarlo ed infine eliminarlo?
    Veloce in che senso?
    Ricapitolando: se usi SendObject non crei alcun file esterno da "pescare" poi per l'invio, ma hai tutte le altre limitazioni che ormai conosci; usando un altro metodo (MAPI, Outlook con automazione, CDO per restare ai classici) il file da allegare al messaggio deve essere creato. Quindi bisognerebbe valutare se la "normale" generazione dei report è fatta a regola d'arte (esperienza persone: un report fatto male, o meglio l'origine dati strutturata male, rendeva il tempo di apertura/creazione del report eterno).
    Magari prima creare tutti i report, inviarli e poi cancellarli?
    Prima però codice.
  • Re: Inviare mail metodo CDO con Report

    Ciao Phil, ecco il codice...
    Ho dovuto assegnare al report un nome generico perchè in realtà avevo dichiarato una variabile che legava la strPath alla targa veicolo tipo
    strPath = CurrentProject.Path & Me.Targa"
    ma mi dava errore...dopo diversi tentativi, ho dovuto quindi ovviare assegnando un nome generico
    P.S. quella dichiarazione, andava bene con il metodo SandObject qui non so perchè non va....
    per la creazione del Report non impiega tempo, ho riscontrato che impiega diverso tempo (facendo il debug) sulla parte di codice ".Send"
    Vi sono più cose indentate e non ancora utilizzate poichè le integrerò man mano, un problema x volta
    Private Sub btnMailMassivo_Click()
    
    Dim db As Database
    Dim rst1 As DAO.Recordset
    Dim EMail As String
    Dim strTo As String
    Dim strSubject As String, NomeFileStr As String, DenStr As String
    Dim strMessageText As String
    Dim i As Integer
    Dim strSQL As String
    ' Variabile salvataggio report
    Dim strPath As String
    ' Variabile body mail
    Dim bodyTemplate As String
    
    ' Variabili C.D.O. - assegnazione valore
    Dim sImageFile As String, SmtpServer As String, SendUserName As String, SendPassword As String
    Dim SendUsing As Integer, SmtpServerPort As Integer, SmtpAutenticate As Integer, SmtpConnectionTimeOut As Integer
    Dim SmtpUSesSl As Boolean
    
    sImageFile = DLookup("ImagePath", "tblAzienda", "[IDAzienda] = 1")
    
    SmtpServer = DLookup("SmtpServer", "tblAzienda", "[IDAzienda] = 1")
    SendUserName = DLookup("SendUsername", "tblAzienda", "[IDAzienda] = 1")
    SendPassword = DLookup("SendPassword", "tblAzienda", "[IDAzienda] = 1")
    SendUsing = DLookup("SendUsing", "tblAzienda", "[IDAzienda] = 1")
    SmtpServerPort = DLookup("SmtpServerPort", "tblAzienda", "[IDAzienda] = 1")
    SmtpAutenticate = DLookup("SmtpAuthenticate", "tblAzienda", "[IDAzienda] = 1")
    SmtpConnectionTimeOut = DLookup("SmtpConnectionTimeOut", "tblAzienda", "[IDAzienda] = 1")
    SmtpUSesSl = DLookup("SmtpUsesSl", "tblAzienda", "[IDAzienda] = 1")
    
    On Error GoTo LblErr
    Set db = CurrentDb
    Set rst1 = Me.RecordsetClone
    
        rst1.MoveFirst
    
        i = 0
        
        Do While Not rst1.EOF
        EMail = rst1("EMail")
      
        KillFile
        
        strPath = CurrentProject.Path & "\SendPromemoria\Veicolo targa" & Me.Targa & ".pdf"
        DoCmd.OpenReport "RptPromemoria", acViewPreview, , "tblVeicoli.IDVeicolo = " & Me!IDVeicolo
        DoCmd.OutputTo acOutputReport, "RptPromemoria", acFormatPDF, strPath
        DoCmd.Close acReport, ObjectName:="RptPromemoria"
      
        NomeFileStr = "Scadenza revisione veicolo: " & Me.txtVeicolo & " targa:" & Me.Targa
        AziendaStr = DLookup("Azienda", "tblAzienda", "[IDAzienda] = 1")
        DenStr = Me.txtDenom
                   
        Dim imsg, iconf, Flds, objBP
            
        Set imsg = CreateObject("cdo.message")
        Set iconf = CreateObject("cdo.configuration")
        
        Set Flds = iconf.Fields
    
    With Flds
        .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = SendUsing 'NTLM method
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = SmtpServer
        .Item("http://schemas.microsoft.com/cdo/configuration/smptserverport") = SmtpServerPort
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = SmtpAutenticate
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = SmtpUSesSl
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = SmtpConnectionTimeOut
        .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = SendUserName
        .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = SendPassword
        .Update
    End With
    
    With imsg
    Set .Configuration = iconf
        .To = EMail
        .From = SendUserName
        '.CC = CCn
        .Subject = NomeFileStr
        .htmlbody = bodyTemplate
        .AddAttachment strPath ' (assegnazione senza uguale)
        Set objBP = .AddRelatedBodyPart(sImageFile, "logo.bmp", 1)
        objBP.Fields.Update
        .Fields.Update
        .Send
    End With
    
        i = i + 1
        
        rst1.MoveNext
    Loop
    
    ExitHere:
    rst1.Close
    Set rst1 = Nothing
    Set db = Nothing
    Exit Sub
    
    LblErr:
    MsgBox (Err.Description)
    Exit Sub
    
    End Sub
    Function KillFile()
    Dim strPath As String
    strPath = CurrentProject.Path & "\SendPromemoria\Veicolo targa" & Me.Targa & ".pdf"
    
    If Len(Dir$(strPath)) > 0 Then
         Kill strPath
    End If
    End Function
  • Re: Inviare mail metodo CDO con Report

    zio Ken ha scritto:


    strPath = CurrentProject.Path & Me.Targa"
    Un'occhiata velocissima quindi il mio intervento è molto parziale.
    Se quella è esattamente la riga che avevi scritto c'è un doppioapice di troppo, quello dopo Me.Targa.
    In ogni caso dov'era quella riga?
    Nel resto che hai scritto ci sono tante variabili senza il datatype.
    Dim sImageFile, SmtpServer, SendUserName, SendPassword As String
    Dim SendUsing, SmtpServerPort, SmtpAutenticate, SmtpConnectionTimeOut As Integer
    Dim SmtpUseSSL As Boolean
    Il data type alla fine della riga riguarda solo l'ultima variabile, non tutte quelle della riga. Le altre sono quindi variant. Dichiarale bene.
    Dove sono dichiarate le variabili Nota, Nota2, Nota3? Hai Option Explicit all'inizio del modulo?
  • Re: Inviare mail metodo CDO con Report

    Ciao Phil, per migliorare la lettura ho editato il messaggio dove ho postato il codice così da non disperdere molte informazioni man mano, ripostando l'intero codice sistemando tutte le variabili...
    per il
    strPath = CurrentProject.Path & Me.Targa
    lo avevo inserito al posto di
    strPath = CurrentProject.Path & "\SendPromemoria\Promemoria.pdf"
    ma non fungeva. L'apice in più era un refuso poichè l'ho scritto al volo...mi segnalava errore"l'azione OutputTo è stata annullata"

    Edit: sono riuscito ad assegnare anche la targa al report ma, continua, durante il loop a non eliminare il file...
    Re.EDIT: ho risolto poichè avevo iddentato male il ciclo ora invece, rileggendo i suggerimenti di un vecchio post su come sistemare il loop ho risolto...ancora grazie mille per l'infinita disponibilità!!!
  • Re: Inviare mail metodo CDO con Report

    zio Ken ha scritto:


    ... ho risolto...
    ma si può migliorare ancora.
    1) Aggiungi alla funzione KillFile un parametro costituito dal percorso del file da cancellare, eviti così di dover usare un'ulteriore variabile (e se è il caso la puoi scrivere come funzione pubblica in un modulo standard, integrandola magari con qualche altro parametro)
    2) Nella verifica della lunghezza del percorso di cui al punto 1) "accontentati" che sia diverso da zero, non superiore a zero.
    3) Questa riga dentro il loop è un pugno nello stomaco delle prestazioni
    AziendaStr = DLookup("Azienda", "tblAzienda", "[IDAzienda] = 1")
    4) a cosa serve la variabile i?
    5) ancora variabili senza data type: dichiarale comunque As Object.
    Forse c'è dell'altro che riguarda CDO ma non avendolo mai usato non ne sono sicuro, quindi mi riservo qualche ulteriore approfondimento.
    Per alcuni accorgimenti indicati nei punti elencati ho trovato illuminanti alcuni articoli indicati in questa pagina:
  • Re: Inviare mail metodo CDO con Report

    Ciao Phil, grazie infinitamente per il tuo aiuto, ho sistemato come mi hai consigliato mentre la variabile "i" mi serviva per testare gli incrementi del loop ( in fase di debug per verificare l'implementazione delle variabili e dei conteggi record) mentre, ho trovato di estrema utilità il link segnalatomi perchè adeguando i report, con i font suggeriti, le dimensioni totali del report, sono notevolmente calate (circa la metà)

    Sto eseguendo una sorta di debug con l'eseguibile per la verifica del codice "morto" ed effettivamente, segnala in modo corretto variabili al suo tempo utilizzate per testare le procedure. Anche se la versione demo permette di valutare poche form per volta, io creo delle copie e dissimulo il progetto e lo testo che dire... grazie infinite!
  • Re: Inviare mail metodo CDO con Report

    zio Ken ha scritto:


    ... Anche se la versione demo permette di valutare poche form per volta, ...
    Per evitare ogni fraintendimento: non intendevo pubblicizzare o invitare all'uso di alcun software, né gratuito, né a pagamento, né in versione dimostrativa, ma solo come "gestire" meglio cicli, variabili ecc come suggerito in alcuni articoli (a suo tempo l'ho trovato illuminante, come tante così che si imparano quando non si conosce)
  • Re: Inviare mail metodo CDO con Report

    Certamente Phil, ho solo dato io un occhiata in più alle altre cose gestite sul sito rispetto a ciò che mi consigliavi...il resto l'ho testato io
  • Re: Inviare mail metodo CDO con Report

    Buonasera Phil, scusami se riscrivo dopo tanto ma è successo qualcosa che non mi spiego e che forse, potrebbe essere in qualche maniera legato al passaggio da win8 a win10...perchè davvero non so cosa sia successo....

    riprendendo questa vecchia procedura, quando lancio l'inoltro delle mail con un report allegato, mi segnala errore "Impossibile trovare il percorso specificato".
    Il report, viene invece generato esattamente dove dichiarato e con il nome assegnato...
        strPath = CurrentProject.Path & "\SendPromemoria\Veicolo targa" & Me.Targa & ".pdf"
        DoCmd.OpenReport "RptPromemoria", acViewPreview, , "tblVeicoli.IDVeicolo = " & Me!IDVeicolo
        DoCmd.OutputTo acOutputReport, "RptPromemoria", acFormatPDF, strPath
        DoCmd.Close acReport, ObjectName:="RptPromemoria"
    a cosa potrebbe essere dovuto il problema? Mi sfugge qualcosa dopo mesi che non la utilizzavo?
  • Re: Inviare mail metodo CDO con Report

    zio Ken ha scritto:


    ...potrebbe essere in qualche maniera legato al passaggio da win8 a win10
    ...
    a cosa potrebbe essere dovuto il problema?
    Beh, detto così il primo candidato al premio "origine del problema" è proprio il passaggio da win8 a win10 ma dire che si tratta proprio di quello e come risolverlo è arduo.
    A mio avviso devi andare "per esclusione", cioè fare un elenco (corposo) delle possibili cause ed andare per esclusione. Non ho fatto ricerche approfondite sull'uso di CDO su windows10. E' noto che però su CDO pende la spada di Damocle che Microsoft l'ha "dismesso" da anni e non si sa fino a quando sarà compatibile con le novità via via introdotte.
    A titolo di esempio (ma non sono solo questi i controlli da fare)
    1) il codice compila? (non fidarti del fatto che finora magari non ha dato problemi in altre cose)
    2) ci sono riferimenti mancanti?
    3) c'è CDO installato?
    4) se provi a fare una spedizione di un'e-mail tramite CDO senza allegati, funziona?
    5) se provi a fare una spedizione di un'e-mail tramite CDO indicando un allegato ben preciso, funziona?
    5) il database si trova in una posizione attendibile (trusted location)?
    6) prova a mettere il tutto in un percorso semplice: una sottocartella di C: (o di altra partizione del disco, se ne hai più di una), in locale comunque, nomi brevi e senza caratteri strani, percorsi di cui tu abbia il controllo completo da un punto di vista delle autorizzazioni (oltre ad essere indicati come trusted location - posizioni attendibili.
  • Re: Inviare mail metodo CDO con Report

    Phil grazie mille, faccio mea culpa poiché aprendo il db con access 2010 mi segnalava sempre un problema (creato con access 2007) per cui ho importato le form e varie in un nuovo db a meno delle querys e nn avevo attivato la libreria x il CDO...
    Grazie infinite perché ci stavo sbattendo la testa! Buona serataa
Devi accedere o registrarti per scrivere nel forum
11 risposte