Tutorial passo-passo su come configurare Google OAuth-2 in VB.NET per inviare email tramite un account Gmail.
Indice
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:
- Crea un oggetto UserCredentials contenente le credenziali di utilizzo delle API (client secret e id client)
- Crea un oggetto GmailService assegnando le credenziali e un nome per il servizio
- Crea un oggetto MimeMessage contenente tutti i dettagli della email che vuoi inviare (oggetto, testo, destinatario, allegati, ecc.)
- Converti il MimeMessage in una stringa in base64
- 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
- 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.