Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Pagina 1 di 3 123 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23

Forzare invio mail OUTLOOK

  1. #1
    Riker66 non è in linea Novello
    Salve,
    ho un progetto access che parte in batch di notte creando dei report e inviandoli per mail.
    Lo ho migrato su una macchina nuova e passato a Access2013 e si verifica un problema strano...

    Le mai le invio tramite outlook con la consueta chiamata a outlook creando un oggetto mail di outlook.

    Set NewMail = OutApp.CreateItem(MailItem) ecc ecc
    
    il processo di invio mail che comprende l'inserimento di diversi allagati si conclude con:


    NewMail.Send
    Set NewMail = Nothing
    
    Ecco il problema:
    il progetto access crea le mail più velocemente di quanto outlook riesca a spedirle, quindi accade che il processo di access venga chiuso prima che tutte le mail siano inviate.
    Quindi alcune mail (a volte 3 a volte 4) rimangono in "posta in uscita" e non vengono spedite perché il processo "padre" (access) viene chiuso prima che outlook abbia inviato tutto.
    Se si apre outlook le mail le trovi in "posta in uscita" e vengono regolarmente inviate all'avvio di outlook.


    Domanda: esiste in modo da codice di forzare l'invio delle mail?
    Potrei inserire il codice al termine della procedura prima di chiudere outlook.

    Ho fatto delle ricerche ma non ho trovato niente, forse perché non cerco con le parole chiave giuste.

    Qualcuno mi può aiutare?

    Grazie 1000.

  2. #2
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Hai usato LateBinding o EarlyBinding...?
    Solitamente si usa LateBinding per evitare i riferimenti alle librerie esterne, in questo caso se tu usassi invece EarlyBinding potresti sfruttare la dichiarazione dell'oggetto MailItem ereditando gli eventi.
    Private WithEvents NewMail As Outlook.MailItem
    
    In questo modo avrai accesso all'evento SENT nel quale puoi sfruttare una variabile Boolean che viene messa a true al verificarsi dell'avvenuto invio...
    Quindi subito dopo l'invocazione del metodo Send... fainun Loop che attende il true di MailSent.
    NewMail.Send
    Do while MailSent = False
        DoEvents
    Loop
    
    Questo l'evento dell'oggetto MilItem da intercettare.
    Private Sub NewMail_Send(Cancel As Boolean)
        MailSent = True
    End SuB
    
    Questo è il modo che rispecchia l'invio SINCRONO, ovviamente con i contro dell'associazione preventiva.
    ℹ️ Leggi di più su @Alex ...

  3. #3
    Riker66 non è in linea Novello
    Purtroppo ho usato LateBinding perché più semplice, non ho pratica con l'EarlyBinding.
    Potresti indicarmi un link con codice da analizzare per capire come implementare l'EB?
    Questa è una di quelle occasioni che per risolvere un problema ti obbligano ad evolverti e studiare.
    Grazie!

  4. #4
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Devi aggiungere i riferimenti alla libreria Outlook e dichiarare in modo esplicito gli Oggetti e non come Object...
    Prova a fare una ricerca e trovi tutto molto facilmente, poi nel caso vediamo.
    ℹ️ Leggi di più su @Alex ...

  5. #5
    Riker66 non è in linea Novello
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Devi aggiungere i riferimenti alla libreria Outlook e dichiarare in modo esplicito gli Oggetti e non come Object...
    Prova a fare una ricerca e trovi tutto molto facilmente, poi nel caso vediamo.
    Buongiorno,
    penso di essere riuscito a trasformare il codice utilizzando l'earlybuilding ma non capisco come fare ad intercettare il send dell'imvio della mail.

    Se testo o metto in un loop OutlookMail.send ottengo un errore.

    Forse non ho capito bene come funziona l'earlybuilding.

    Ho cercato in rete ma non ho trovato esempi che mi fossero utili... un aiuto?

  6. #6
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    L'oggetto MailItem espone degli Eventi, che puoi intercettare... come appunto ti ho scritto sopra dichairando l'Oggetto a livello di Modulo di Classe...
    Option Compare Database
    Option Explicit
    
    Private applOutlook As Outlook.Application
    Private WithEvents NewMail As Outlook.MailItem
    Private MailSent  As Boolean
    
    Private Sub InvioMail()
        Set applOutlook = New Outlook.Application
        'create and display a new email item:
        Set NewMail = applOutlook.CreateItem(olMailItem)
    
        'set properties of the new mail item:
        With NewMail 
    
        .Display
        .Subject = "Sending a Test Mail"
        .Body = "Wish the best in learning Outlook Automation!"
      
        .Send
        Do while MailSent = False
            DoEvents
        Loop
        End With
    End Sub
    
    Private Sub NewMail_Send(Cancel As Boolean)
        MailSent = True
    End SuB
    
    Una cosa simile...
    ℹ️ Leggi di più su @Alex ...

  7. #7
    Quote Originariamente inviato da Riker66 Visualizza il messaggio
    ... l'earlybuilding
    Earlybinding, non earlybuilding, perché è il binding, l'associazione, che conta, non la costruzione - building.
    Quello che ti ha spiegato @Alex cioè l'uso di WithEvents in VBA è argomento tosto, figuriamoci trovare esempi utili, nel senso di pronti all'uso, di facile comprensione e magari calati al caso concreto.
    Devi armarti di tanta pazienza, di certo non trovi la soluzione in un videocorso su youtube (con tutto il rispetto per i videocorsi su youtube)
    Mi permetto di evidenziarti le parte cruciali del post di @Alex
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    ...dichairando l'Oggetto a livello di Modulo di Classe...
    ...
    Private WithEvents NewMail As Outlook.MailItem  '<=========
    ...
        Do while MailSent = False
            DoEvents
        Loop
    ...
    Private Sub NewMail_Send(Cancel As Boolean)
        MailSent = True
    End Sub
    

  8. #8
    Riker66 non è in linea Novello
    Grazie,
    ho creato un modulo di classe "ClasseOutlook" con all'interno quello che metto sotto, ma se chiamo la funzione "inviomail" dal codice in quwesot modo:

    Call InvioMail(x_To, x_Cc, x_Bcc, x_Obj, x_Body, x_Allegati)
    
    mi dice "Sub o Functioni indefinita", stesso errore anche ricompilando il progetto.
    Ancora mi sfugge qualcosa...


    Ecco la Classe "ClasseOutlook"

    Option Compare Database
    Option Explicit
    
    Private applOutlook As Outlook.Application
    Private WithEvents NewMail As Outlook.MailItem
    Private MailSent As Boolean
     
    Private Sub InvioMail(x_To As String, x_Cc As String, x_Bcc As String, x_Obj As String, x_Body As String, x_Allegati As String)
        Dim RsAllegati As New ADODB.Recordset
        
        Set applOutlook = New Outlook.Application
        'create and display a new email item:
        Set NewMail = applOutlook.CreateItem(olMailItem)
     
        'set properties of the new mail item:
        With NewMail
     
        ' .Display
        .To = x_To
        .CC = x_Cc
        .BCC = x_Bcc
        .Subject = x_Obj
        .Body = x_Body
        
       
       RsAllegati.Open "SELECT * FROM Nomefile WHERE ordine='A' AND serie='" & x_Allegati & "' ", CurrentProject.Connection, adOpenDynamic, adLockBatchOptimistic
        While Not RsAllegati.EOF
            .Attachments.Add (RsAllegati.Fields("nomefile"))
            RsAllegati.MoveNext
            Wend
        RsAllegati.Close
    
        .Send
        
        Do While MailSent = False
            DoEvents
        Loop
        End With
        
        
    End Sub
     
    Private Sub NewMail_Send(Cancel As Boolean)
        MailSent = True
    End Sub
    

  9. #9
    Riker66 non è in linea Novello
    Quote Originariamente inviato da Phil_cattivocarattere Visualizza il messaggio
    Devi armarti di tanta pazienza, di certo non trovi la soluzione in un videocorso su youtube (con tutto il rispetto per i videocorsi su youtube)
    Ho già deciso di prendere questa occasione per imparare qualcosa di nuovo.
    Ovviamente non pretendo di trovare la soluzione già confezionata, ma non ho trovato in rete neanche siti con una trattazione esaustiva del tema, probabilmente perché non so neanche cercarlo nel modo giusto.
    Sai per caso indicarmi qualcosa? o anche un "libro" alla vecchia maniera da studiare per bene?
    Grazie.

  10. #10
    L'avatar di gibra
    gibra non è in linea Very Important Person
    Quote Originariamente inviato da Riker66 Visualizza il messaggio
    mi dice "Sub o Functioni indefinita", stesso errore anche ricompilando il progetto.
    Ancora mi sfugge qualcosa...
    Se imposti la funzione come Private, chiaro che non la trova.
    ℹ️ Leggi di più su gibra ...

+ Rispondi al messaggio
Pagina 1 di 3 123 ultimoultimo

Potrebbero interessarti anche ...

  1. Invio mail con outlook
    Da Joe01 nel forum Visual Basic .Net
    Risposte: 1
    Ultimo Post: 01-03-2017, 23:47
  2. macro per creazione pdf e invio per mail (outlook)
    Da Fra79 nel forum Microsoft Excel
    Risposte: 2
    Ultimo Post: 04-07-2015, 19:46
  3. Errore - invio mail da outlook da elenco excel
    Da laica nel forum Microsoft Excel
    Risposte: 6
    Ultimo Post: 24-12-2014, 17:01
  4. Utilizzare Outlook da Access per l'invio di una e-mail
    Da Syrinx_ nel forum Microsoft Access
    Risposte: 14
    Ultimo Post: 19-01-2011, 16:27
  5. Invio mail da Outlook/Access
    Da MorleyMan nel forum Microsoft Access
    Risposte: 10
    Ultimo Post: 13-03-2005, 20:16