Condividi:        

VBA per cliccare su pulsante in email outlook

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

VBA per cliccare su pulsante in email outlook

Postdi AleRosa » 05/02/23 18:38

Ciao a tutti!
Partendo dal presupposto che non ne capisco nulla, solo il minimo minimo indispensabile (e nemmeno), avrei bisogno di un aiuto per poter fare questa cosa:
Ricevo una mail da un indirizzo email specifico il cui oggetto è "Request". Questa email contiene un pulsante "Accept".
Vorrei creare un VBA (outlook) che (sempre o in determinati momenti, tipo dalle 17 alle 8, da lunedì a lunedì) clicchi sul pulsante "Accept" contenuto in questa email il cui oggetto è "Request".
Any idea?!?
Grazie!
AleRosa
Utente Junior
 
Post: 46
Iscritto il: 09/11/16 09:40

Sponsor
 

Re: VBA per cliccare su pulsante in email outlook

Postdi Anthony47 » 05/02/23 19:10

In linea di massima potresti creare una "regola" che interviene sul mittente, sull'orario e sul subject e come azione ha "Esegui macro"

Senza pero' conoscere il contenuto della mail penso che sia difficile pigiare "il pulsante", che al momento non sappiamo ne' se e' un hyperlink, un oggetto con associato evento Click, una pagina web con qualsiasi cosa al suo interno, etc o addirittura la richiesta di Ricevuta di ritorno...
Avatar utente
Anthony47
Moderatore
 
Post: 19435
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: VBA per cliccare su pulsante in email outlook

Postdi AleRosa » 06/02/23 09:20

Ciao Anthony,
grazie mille per la tua risposta... non saprei da dove iniziare.
Dunque, quello di cui avrei bisogno è una soluzione per "captare" specifiche email con oggetto "request" inviate da un'organizzazione specifica. All'interno di queste email è presente un pulsante "Accept" con collegamento a una pagina web (un portale) dove, in teoria bisogna effettuare l'accesso (ma posso già tenere la pagina aperta con tanto di credenziali memorizzate). All'interno di questa pagina web è presente un pulsante "Accept" (lo stesso della mail) su cui la macro dovrebbe "cliccare".
AleRosa
Utente Junior
 
Post: 46
Iscritto il: 09/11/16 09:40

Re: VBA per cliccare su pulsante in email outlook

Postdi Anthony47 » 07/02/23 11:51

Teoricamente e' possibile identificare l'evento "nuova mail in entrata" (evento Application_NewMail), e teoricamente e' possibile controllare Mittente, Oggetto, Corpo e altre cose. Quindi e' tecnicamente possibile intercettare il link "dietro" il pulsante e collegarsi al relativo indirizzo. Ma la stessa Microsoft non garantisce che possa scattare a ogni mail in arrivo, specialmente nel caso di un blocco di mail in entrata (condizione abbastanza normale, considerando che Outlook controlla ogni N minuti se ci sono nuovi arrivi).
Non e' semplice ma e' possibile usare una sessione gia' aperta di Chrome o Edge per interagire con una pagina web usando l'ambiente "Selenium" (vedi viewtopic.php?f=26&t=112225), ma col rischio che il prossimo aggiornamento (di windows o del browser) sia tutto da rivedere.
E' abbastanza semplice creare una sessione di Chrome (o Edge) dedicata a questa operazione, magari con l'autenticazione gia' completa, e usarla per l'interazione con il link del "pulsante"

E infatti ho gia' fatto qualcosa di simile, ma per le difficolta' suddette ci ho speso qualche giorno "on-site" per avere una versione effettivamente stabile; via forum potrei darti solo qualche indicazione su come procedere, se hai qualche conoscenza di base. Tipo:
-usa l'evento Application_NewMail, che trovi nel modulo ThisOutlookSession
-usa la proprieta' SenderEmailAddress per leggere il mittente
-usa la proprieta' Subject per leggere l'oggetto
-usa HTMLBody per leggere il contenuto della mail e cercare il link
-ottenuto il link, aprirlo con l'istruzione
Codice: Seleziona tutto
lngX = ShellExecute(vbNull, "Open", LinkAddress, "", "", vbMaximizedFocus)

(Richiede la dichiarazione della funzione ShellExcecute)
A questo punto sei sul sito e devi procedere manualmente
Oppure (in aggiunta) installi l'ambiente Selenium e si puo' pensare di
-aprire una sessione Chrome all'avvio di Outlook, dichiarando Public questa sessione
-esegui il login manualmente (ma si potrebbe anche fare con Selenium)
-invece di ShellExcecute attivi la sessione Selenium-Chrome per interagire con essa
NB: ho immaginato che ogni email contenga un link diverso; se e' sempre lo stesso si puo' fare qualche piccola semplificazione


Piu' semplicemente invece il mio suggerimento è:
-crea una "regola" che sposta in un folder specifico le mail in arrivo provenienti da quell' indirizzo e che abbiamo quell'Oggetto;
-periodicamente guarda il folder e processa le richieste; sposta le mail processate in un secondo folder
-periodicamente "esegui" manualmente la regola (anche le "regole" non sono in grado di garantire la loro esecuzione ad ogni nuova mail; eseguirla a mano significa andare a riprendere le mail che non sono state processate alla loro ricezione)

Quindi un aiutino, piu' che un aiutone...
Avatar utente
Anthony47
Moderatore
 
Post: 19435
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: VBA per cliccare su pulsante in email outlook

Postdi AleRosa » 07/02/23 13:56

Non so cosa rispondere se non Grazie e... niente... non lo posso fare perché non ho idea di dove incominciare!
Quello che posso dirti è che il link è sempre il medesimo e compare, all'interno della mail, anche come hyperlink con testo... se può essere utile a semplificare (di tanto) questa cosa. Grazie!
AleRosa
Utente Junior
 
Post: 46
Iscritto il: 09/11/16 09:40

Re: VBA per cliccare su pulsante in email outlook

Postdi Anthony47 » 07/02/23 21:42

Interpreto il tuo messaggio come una richiesta di un "ulteriore" :D aiutino con le macro...
Ci provo ma se non hai "qualche rudimento" rischiamo di non andare lontano (e spero che non abbia abbandonato la strada della "regola Outlook", che rimane sempre valido se con le macro non arriviamo a qualcosa di utilizzabile)

Allora...
1) Intanto devi installare sul tuo Pc l'ambiente Selenium, sequendo le istruzioni che trovi qui: viewtopic.php?f=26&t=112225

2) Apri il Vba do Outlook (Alt-F11 dovrebbe bastare); cerca nel frame "Progetto" il modulo ThisOutlookSession, e inserisci nel frame di destra questo codice:
Codice: Seleziona tutto
Private Sub Application_NewMail()
FromFlag = True
Call ScanForMail
End Sub

Private Sub Application_Startup()
If WPage Is Nothing Then
    Set WPage = CreateObject("Selenium.WebDriver")
    WPage.Start "Chrome"
End If
End Sub

La prima Sub dice di avviare la Sub ScanForMail quando arriva una nuova email
La seconda dice di aprire una sessione Chrome quando avvii Outlook; usa questa sessione per collegarti al portale che serve e a loggarti se necessario.

3) Crea un nuovo modulo standard vba (Menu /Inserisci /Modulo), e in questo modulo inserisci questo codice:
Codice: Seleziona tutto
Option Explicit
Public WPage As Selenium.WebDriver, FromFlag As Boolean

Sub ScanForMail()
Dim myNameSpace As NameSpace
Dim myInFolder As Folder, myItem As Object, myBody As String

Dim dTime As Single, inBody As Long, Memo As Long
Dim Sender As String, LFor As String, LinkHelpr As String
Dim myLink As String, Risp As Long, sHref As Long, eHref As Long
'
Sender = "pippolino@"           '<<< il Mittente
LFor = "Invio"                  '<<< La chiave ca cercare nel Subject
LinkHelpr = "http://www.iv"        '<<< L'inizio del link da cercare

Set myNameSpace = Application.GetNamespace("MAPI")
Set myInFolder = myNameSpace.GetDefaultFolder(olFolderInbox)
'
If FromFlag Then dTime = 0.02 Else dTime = 1000         'Imposta la finestra di tempo in cui cercare
'
Debug.Print String(5, Chr(10))
Debug.Print ">>>>>>>>>>>>>>>>>>>>", Now
If WPage Is Nothing Then
    Set WPage = CreateObject("Selenium.WebDriver")
    WPage.Start "Chrome"
    Memo = 5
    Debug.Print "Creata Wpage"
End If
'
For Each myItem In myInFolder.Items                     'Scansione delle mail in Inbox
    If TypeName(myItem) = "MailItem" Then
        If InStr(1, myItem.Sender, Sender, vbTextCompare) = 1 And _
          InStr(1, myItem.Subject, LFor, vbTextCompare) > 0 Then            'Trovato Mittente e Chiave...
            If myItem.ReceivedTime > (Now - dTime) Then                     '... verifica la finestra di tempo
                If InStr(1, myItem.Subject, "#_#", vbTextCompare) = 0 Then  '... verifica che non sia gia' stata processata
                    myBody = myItem.HTMLBody                                'Esamina il testo...
                    inBody = InStr(1, myBody, LinkHelpr, vbTextCompare)     '... e cerca il link
''                        Debug.Print "A", myItem.Subject, myItem.Sender, myItem.ReceivedTime     'Debug.Print
                    If inBody > 0 Then                                      'Se lo trova presente...
                        Debug.Print "A", myItem.Subject, myItem.Sender, myItem.ReceivedTime     'Debug.Print
                        sHref = InStrRev(Mid(myBody, 1, inBody), Chr(34), , vbTextCompare)   '...lo cerca meglio
                        eHref = InStr(sHref + 1, myBody, """", vbTextCompare)
                        If eHref > (sHref + 2) Then
                            Debug.Print "A1+", Mid(myBody, inBody - 10, 30)                          'Debug.print
                            myLink = Mid(myBody, sHref + 1, eHref - sHref - 1)          '...lo seleziona
                            Risp = cLink(myLink)                                        'Chiama il processo di Click
                            If Risp > 0 Then                                            'Esito positivo
                                Debug.Print "+++", myLink, myItem.Subject, myItem.Sender, myItem.ReceivedTime
                                myItem.Subject = myItem.Subject & " #_#" & Risp
                                myItem.Save
                                WPage.GoBack
                            Else                                                        'Esito negativo
                                MsgBox ("Ambiente Selenium non attivo; chiudere e riaprire Outlook")
                            End If
                        Else
                            Debug.Print "A2-", "Link non trovato"
                        End If
                    End If
                End If
            End If
        End If
    Else
        Debug.Print "---"       'Non e' una mail
    End If
Next myItem
'Chiusura:
If FromFlag = False And Memo > 0 Then      'Se non attivata da New Email
    On Error Resume Next
    WPage.Quit
    Set WPage = Nothing
    On Error GoTo 0
Else
    WPage.GoBack
End If
FromFlag = False
Debug.Print "<<<<<<<<<<<<<<<<<<<<<<<"
Beep
End Sub



Function cLink(Linkkk) As Long
Dim Memo As Long
'
If WPage Is Nothing Then
    If FromFlag Then
        cLink = 0                       'Non ok
        Exit Function
    Else
        If WPage Is Nothing Then
            Set WPage = CreateObject("Selenium.WebDriver")
            WPage.Start "Chrome", Linkkk
            WPage.Get "/"
            Memo = 5
        End If
        If WPage.URL = Linkkk Then
            cLink = 1 + Memo                 'Certamente Ok
        Else
            cLink = 2 + Memo                 'Maybe Ok
        End If
        If Memo > 0 Then
            WPage.Quit
            Set WPage = Nothing
        End If
        Exit Function
    End If
Else
    WPage.Get Linkkk
    If WPage.URL = Linkkk Then
        cLink = 1                   'Certamente Ok
    Else

        cLink = 2                   'Maybe Ok
    End If
End If
End Function

In testa al codice ci sono tre righe marcate <<< che vanno personalizzate come da commento; in particolare nella riga LinkHelpr = etc etc indicherai la parte iniziale del link, piu' lunga possibile (al limite "tutto", se come dici i link e' sempre lo stesso (ma la cosa mi sembra strana)

La macro dovrebbe cercare all'interno dell'Inbox le mail che partono da un certo destinatario, che nel Subject abbiano una certa chiave se esiste un hyperlink simile a quello indicato nella riga LinkHelpr = xxxx; se lo trova allora
-dovrebbe attivare la finestra Chrome per navigare fino a quel link; non so se a questo punto e' prevista una qualche manualita'; ora la macro continua imperterrita cercando altre email con quelle caratteristiche fino alla fine dell'Inbox
La ricerca viene fatta su due finestre di tempo:
-circa 30 minuti, se la ScanForMail parte per azione di una mail in entrata
-1000 giorni se invece viene avviata manualmente (ad esempio la prima volta)

Le mail che attivano l'hyperlink nella finestra Chrome avranno il loro Subject modificato con postambolo "#_#x"; questa appendice viene usata per impedire alla stessa mail di attivare il link piu' volte

Dopo aver inserito tutto il codice puoi avviare la Sub ScanForMail, magari utilizzando un piccolo lotto di email in Inbox, per vedere l'effetto che fa.
Completata la macro (che non causa nessun messaggio oltre a un Beep) puoi andare sul vba, aprire la finestra Immediata (dovrebbe bastare) dove troverai un elenco di informazioni diagnostiche. Controlla nell'elenco mail se le mail col link hanno il suffisso #_# nel Subject.
Ci sono informazioni probabilmente riservate; se vuoi condividere quel log allora fai la sostituzione delle parte riservate con ***** (lo puoi fare in Word con Trova /Sostituisci)

A un certo punto chiudi Outlook: ti chiedera' se vuoi salvare il progetto (le macro) e risponderai Sì. Poi riaprilo: dovrebbe ora aprirsi anche quella finestra di Chrome da riservare alla macro; se c'e' qualche operazione preventiva da fare falla adesso.

Difficile che funzioni tutto, difficile capire se il link ha funzionato o meno, difficile che lo possa debuggare io da remoto; insomma non so quanto lontano arriviamo...

Mi preoccupa anche un'altra cosa: probabilmente cliccare su Accept serve a confermare una assunzione di responsabilita' del ricevente; che questa sia surrogata da una macro mi sembra non conforme
Avatar utente
Anthony47
Moderatore
 
Post: 19435
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "VBA per cliccare su pulsante in email outlook":

Outlook/Hotmail
Autore: valyfilm
Forum: Software Windows
Risposte: 1
Password Imap (email)
Autore: lukarello7
Forum: Discussioni
Risposte: 8
incollare in Outlook
Autore: valyfilm
Forum: Software Windows
Risposte: 1

Chi c’è in linea

Visitano il forum: Nessuno e 10 ospiti