Efter opsætning af Gmail APi kan den genererede API-nøgle og OAuth Client ID bruges til at sende mails fra den anvendte Gmail-konto i f.eks. javascript.
Ud over API-nøgle og Client-ID skal angives scope, der skal modsvare, hvad Client-ID undersætning også er blevet autoriseret til:
https://www.googleapis.com/auth/gmail.modify
https://www.googleapis.com/auth/gmail.compose
https://www.googleapis.com/auth/gmail.send
I dette tilfælde er “https://www.googleapis.com/auth/gmail.send”relevant. Endvidere Discovery_docs der er endpoint for Javascript Client-biblioteket.
const params = { API_KEY: "[API_NØGLE]", //API-nøgle fra Developer Console CLIEN_ID: "[CLIENT_ID].apps.googleusercontent.com", //OAuth 2.0 Client ID fra Developer Console DISCOVERY_DOCS: ['https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest'], // Array af API discovery doc URLs for APIs SCOPE: "https://www.googleapis.com/auth/gmail.readonly https://www.googleapis.com/auth/gmail.send" // Scopes nødvendige for API; flere kan tilføjes i strengen, separeret med mellemrum. }
Initialiser clienten med de anførte oplysninger og forsøg at logge ind:
Følgende updateSigninStatus holder os opdateret med login-status, og så snart det er lykkes at logge ind, skal mailen konverteres til Base64 og kan herefter sendes:
//Logget ind og klar til send // Send e-mail i en RFC 2822 formateret og base64url kodet streng. function updateSigninStatus(isSignedIn) { if (isSignedIn) { console.log("Logget ind... Sender email...") const headers = { 'To': to, 'Subject': subject, 'Content-Type': 'text/html; charset="UTF-8"' } let email = ''; for (const key in headers) { email += `${key}: ${headers[key]}` + '\r\n' } email += '\r\n' + body const b64Encoded = btoa(encodeURIComponent(email).replace(/%([0-9A-F]{2})/g, function toSolidBytes(match, p1) { return String.fromCharCode('0x' + p1) })) const base64EncodedEmail = b64Encoded.replace(/\+/g, '-').replace(/\//g, '_') gapi.client.gmail.users.messages.send({ // Afsenders email-adresse, 'me' kan bruges til at angive den autentificerede bruger. userId: 'me', resource: { //RFC 2822 formateret og base64url kodet streng. //Returneres i messages.get og drafts.get svar, når format = RAW parameter leveres. raw: base64EncodedEmail } }).then(function () { // Success: Log ud gapi.auth2.getAuthInstance().signOut(); console.log("Email er blevet sendt!") }); } }
Første gang – og kun første gang – popper nogle beskeder frem, hvor applikationens adgang til Gmail-kontoen bekræftes.

Vælg den aktuelle gmail-konto og fortsæt:

Klik på avancerede instillinger og gå videre. Giv de nødvendige tilladelser til applikationen:

Email’en er nu blevet sendt. Tjek postkassen. Man skal selvfølgelig huske, at script skal afvikles på et domæne, der under opsætning af API-en blev White-listet. I denne demo har jeg, for lokal test, white-listet localhost (hvilket nok er noget af det dummeste man i almindelighed kan gøre). Hvis jeg i stedet for http://localhost forsøger http://127.0.0.1 vil jeg ikke få lov til at sende:

Ændrer jeg url til http://localhost, så lykkes det:

Den samlede javascript-kode kan se således ud, og afprøves med den efterfølgende HTML-stump
function Gmail(to, subject, body) { const params = { API_KEY: "[API_NØGLE]", //API-nøgle fra Developer Console CLIEN_ID: "[CLIENT_ID].apps.googleusercontent.com", //OAuth 2.0 Client ID fra Developer Console DISCOVERY_DOCS: ['https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest'], // Array af API discovery doc URLs for APIs SCOPE: "https://www.googleapis.com/auth/gmail.readonly https://www.googleapis.com/auth/gmail.send" // Scopes nødvendige for API; flere kan tilføjes i strengen, separeret med mellemrum. } gapi.load('client', function initClient() { //Initialiser javascript client library console.log("Initialiserer mail...") gapi.client.init({ apiKey: params.API_KEY, discoveryDocs: params.DISCOVERY_DOCS, clientId: params.CLIEN_ID, scope: params.SCOPE }).then(function () { //Login console.log("Logger ind...") gapi.auth2.getAuthInstance() .isSignedIn .listen(updateSigninStatus); updateSigninStatus(gapi.auth2.getAuthInstance().isSignedIn.get()); gapi.auth2.getAuthInstance().signIn(); }); }); //Logget ind og klar til send // Send e-mail i en RFC 2822 formateret og base64url kodet streng. function updateSigninStatus(isSignedIn) { if (isSignedIn) { console.log("Logget ind... Sender email...") const headers = { 'To': to, 'Subject': subject, 'Content-Type': 'text/html; charset="UTF-8"' } let email = ''; for (const key in headers) { email += `${key}: ${headers[key]}` + '\r\n' } email += '\r\n' + body const b64Encoded = btoa(encodeURIComponent(email).replace(/%([0-9A-F]{2})/g, function toSolidBytes(match, p1) { return String.fromCharCode('0x' + p1) })) const base64EncodedEmail = b64Encoded.replace(/\+/g, '-').replace(/\//g, '_') gapi.client.gmail.users.messages.send({ // Afsenders email-adresse, 'me' kan bruges til at angive den autentificerede bruger. userId: 'me', resource: { //RFC 2822 formateret og base64url kodet streng. //Returneres i messages.get og drafts.get svar, når format = RAW parameter leveres. raw: base64EncodedEmail } }).then(function () { // Success: Log ud gapi.auth2.getAuthInstance().signOut(); console.log("Email er blevet sendt!") }); } } }
html> <head> <script src="https://apis.google.com/js/api.js"></script> <script src="gmail.js"></script> </head> <body> <button id="button" onclick="Gmail('modtager@whatever.com', 'Emne for mailen', 'indhold i mailen')">Send Email</button> </body> </html>