[VB.NET] Tutorial invio mail tramite Google OAuth-2 (Gmail)

Tutorial passo-passo su come configurare Google OAuth-2 in VB.NET per inviare email tramite un account Gmail.

Introduzione

Spesso è necessario far si che un software possa inviare delle email. Solitamente questo viene fatto utilizzando il SMTP.

Tuttavia, nel caso di G-Mail questo non è possibile. La classica autenticazione smtp infatti non funzionerà e avremo bisogno di utilizzare le API messe a disposizione da Google.

Le API di google funzionano su protocollo OAuth 2.0 e possono essere utilizzate da server web e lato client.

Ottenere le credenziali

Prima di iniziare è necessario creare le proprie chiavi API. Per fare questo recati sulla Google Cloud Console e accedi alla sezione API e servizi.

Da qui, abilita un nuovo servizio API e cerca il servizio chiamato Gmail API. Una volta trovato clicca sul pulsante blu ‘Abilita’ per abilitare le api di gmail.

Adesso otteniamo le credenziali per utilizzare questo servizio. Dalla pagina del servizio spostati sulla scheda ‘Credenziali’ e fai click su ‘+ Crea credenziali’, dal menu di scelta seleziona ‘ID client OAuth’.

Potrebbe esserti richiesto di configurare la schermata del consenso. Si tratta di quella schermata che l’utente vedrà al momento del login e elenca i permessi richiesti dalla tua applicazione. Configura queste impostazioni in base alle necessità del tuo progetto, nel mio caso ho selezionato uso Esterno e come ambito ho selezionato ‘Inviare email per tuo conto’.

Fino a quando il tuo progetto non sarà approvato potranno accedere al servizio solamente gli utenti approvati da te, quindi aggiungi alla lista degli Utenti di prova il tuo indirizzo gmail.

Una volta terminato il processo avrai un ID Client e un Client secret che useremo nelle prossime fasi.

Configura il progetto

Adesso configuriamo il progetto su Visual Studio 2022 per poter utilizzare le api di google.

In particolare dovrai aggiungere al progetto i seguenti pacchetti da nuget:

Imports Google.Apis.Auth.OAuth2
Imports Google.Apis.Gmail.v1
Imports Google.Apis.Gmail.v1.Data
Imports Google.Apis.Services
Imports Google.Apis.Util.Store
Imports MimeKit

Il processo di invio

Il processo di invio di una email usando le api di google è abbastanza semplice e può essere riassunto come segue:

  1. Crea un oggetto UserCredentials contenente le credenziali di utilizzo delle API (client secret e id client)
  2. Crea un oggetto GmailService assegnando le credenziali e un nome per il servizio
  3. Crea un oggetto MimeMessage contenente tutti i dettagli della email che vuoi inviare (oggetto, testo, destinatario, allegati, ecc.)
  4. Converti il MimeMessage in una stringa in base64
  5. Crea un oggetto Google.Apis.Gmail.v1.Data.Message() che sarà l’email da inviar e assegna al parametro Raw la stringa creata in precedenza
  6. Invia l’email usando “me” come user id

Il codice

Iniziamo creando l’oggetto UserCredentials. Per facilitare utilizzeremo una funzione:

Dim credential As UserCredential = GetUserCredentials()
Private Function GetUserCredentials() As UserCredential

        Dim credPath As String = Path.Combine(My.Settings.appDataPath, "google_oauth2_credentials.json")

        Dim secret As ClientSecrets = New ClientSecrets() With {
            .ClientId = My.Settings.clientId,
            .ClientSecret = My.Settings.clientSecret
        }

        Return GoogleWebAuthorizationBroker.AuthorizeAsync(
            secret,
            {GmailService.Scope.GmailCompose, GmailService.Scope.GmailSend},
            "user",
            CancellationToken.None,
            New FileDataStore(credPath, True)
        ).Result

End Function

In questa funzione andiamo a stabilire un percorso nel quale verrà memorizzato il file delle credenziali. Questo file verrà usato per non richiedere il login ad ogni utilizzo delle api.

Successivamente si crea un oggetto ClientSecrets contenente il client id e il client secret.

La funzione poi restituisce l’oggetto UserCredential generato usando il metodo fornito da Google.Apis.Auth.OAuth2 (importato in precedenza).

Adesso si procede creando il servizio gmail:

Dim service As GmailService = CreateGmailService(credential)
Private Function CreateGmailService(ByVal credential As UserCredential) As GmailService
        Return New GmailService(New BaseClientService.Initializer() With {
            .HttpClientInitializer = credential,
            .ApplicationName = "My Gmail Service"
        })
End Function

In questa funzione si va semplicemente a creare un oggetto GmailService al quale vengono associate le credenziali e un nome.

Adesso si procede creando l’oggetto MimeMessage() che andrà a rappresentare la nostra email:

' Crea messaggio MIME
Dim mimeMessage As New MimeMessage()
mimeMessage.From.Add(New MailboxAddress("Timothy Franceschi", "timothy@franceschi.es"))
mimeMessage.To.Add(New MailboxAddress("Utente", recipientEmail))
mimeMessage.Subject = subject

' Crea corpo del messaggio (HTML)
Dim bodyBuilder As New BodyBuilder()
bodyBuilder.HtmlBody = body

' Aggiunta di un allegato al messaggio
Dim attachmentPath As String = path ' Percorso del file allegato
Dim attachment As New MimePart("application", "pdf") With {
                    .ContentDisposition = New ContentDisposition(ContentDisposition.Attachment),
                    .ContentTransferEncoding = ContentEncoding.Base64,
                    .FileName = System.IO.Path.GetFileName(attachmentPath)
                }
attachment.Content = New MimeContent(File.OpenRead(attachmentPath))
bodyBuilder.Attachments.Add(attachment)

' Aggiungi il body alla mail
mimeMessage.Body = bodyBuilder.ToMessageBody()

' Conversione del messaggio in formato MIME in una rappresentazione di stringa
Using stream = New MemoryStream()
            mimeMessage.WriteTo(stream)
            Dim rawMessage As String = Convert.ToBase64String(stream.ToArray())

            ' Create the email message
            Dim email As New Google.Apis.Gmail.v1.Data.Message()
            email.Raw = rawMessage

            ' Invio del messaggio
            Dim userId As String = "me"

            Try
                service.Users.Messages.Send(email, userId).Execute()
            Catch ex As Exception

                ' Gestire errore

            End Try

End Using

Conclusioni

In questa breve guida abbiamo visto come inviare email tramite l’API di Google per Gmail usando OAuth 2.0 in un software VB.NET.

Se vuoi approfondire l’argomento di consiglio di consultare la documentazione ufficiale dell’API di Google per Gmail e del protocollo OAtuh 2.0.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *