How to use Gmail API for sending email

I am trying to use Gmail API for sending emails from my website. Insight of this guideline and attempting to replace the third-party sending service from sendGrid to Gmail in the guideline, I did the followings:
1- Creating the two files “email.jsw” and “index.js”
2- Changing ‘key, ‘sender’, and ‘recipient’ in the ‘email.jsw’ file and putting the ‘index’ content of step 3 in this link inside the export function ‘sendWithService’.
However, several error highlights, ‘not defined’, appear in the ‘index.js’ file, which is related to ‘const fs’, ‘const readline’, ‘const {google}’, and ‘process’.
When I execute the code by pushing the submit button an error message shows up in the ‘Developer console’: Cannot find module ‘googleapis’.
The only step that I skipped, is step 2 that is ‘Install the client library’, which I assume we don’t need that since we use Wix.
Could you please tell me where am I make mistakes?
Here are the codes
In email.jsw

//email.jsw

import { sendWithService } from 'backend/index';

export function sendEmail(subject, body) {
	const key = "MY_API_KEY";
	const sender = "from.MY_ADDRESS@gmail.com";
	const recipient = "to.ANOTHER_ADDRESS@gmail.com";
	return sendWithService(key, sender, recipient, subject, body);
}

export function sendEmailWithRecipient(subject, body, recipient) {
	const key = "MY_API_KEY";
	const sender = "from.MY_ADDRESS@gmail.com";
	return sendWithService(key, sender, recipient, subject, body);
}

In index.js


import { fetch } from 'wix-fetch';
export function sendWithService(key, sender, recipient, subject, body) {
const fs = require('fs');
const readline = require('readline');
const { google } = require('googleapis');
// If modifying these scopes, delete token.json.
const SCOPES = ['https://www.googleapis.com/auth/gmail.readonly'];
// The file token.json stores the user's access and refresh tokens, and is
// created automatically when the authorization flow completes for the first
// time.
const TOKEN_PATH = 'token.json';
// Load client secrets from a local file.
fs.readFile('credentials.json', (err, content) => {
if (err) return console.log('Error loading client secret file:', err);
// Authorize a client with credentials, then call the Gmail API.
authorize(JSON.parse(content), listLabels);
});
/**
* Create an OAuth2 client with the given credentials, and then execute the
* given callback function.
* @param {Object} credentials The authorization client credentials.
* @param {function} callback The callback to call with the authorized client.
*/
function authorize(credentials, callback) {
const { client_secret, client_id, redirect_uris } = credentials.installed;
const oAuth2Client = new google.auth.OAuth2(
client_id, client_secret, redirect_uris[0]);
// Check if we have previously stored a token.
fs.readFile(TOKEN_PATH, (err, token) => {
if (err) return getNewToken(oAuth2Client, callback);
oAuth2Client.setCredentials(JSON.parse(token));
callback(oAuth2Client);
});
}
/**
* Get and store new token after prompting for user authorization, and then
* execute the given callback with the authorized OAuth2 client.
* @param {google.auth.OAuth2} oAuth2Client The OAuth2 client to get token for.
* @param {getEventsCallback} callback The callback for the authorized client.
*/
function getNewToken(oAuth2Client, callback) {
const authUrl = oAuth2Client.generateAuthUrl({
access_type: 'offline',
scope: SCOPES,
});
console.log('Authorize this app by visiting this url:', authUrl);
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.question('Enter the code from that page here: ', (code) => {
rl.close();
oAuth2Client.getToken(code, (err, token) => {
if (err) return console.error('Error retrieving access token', err);
oAuth2Client.setCredentials(token);
// Store the token to disk for later program executions
fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
if (err) return console.error(err);
console.log('Token stored to', TOKEN_PATH);
});
callback(oAuth2Client);
});
});
}
/**
* Lists the labels in the user's account.
*
* @param {google.auth.OAuth2} auth An authorized OAuth2 client.
*/
function listLabels(auth) {
const gmail = google.gmail({ version: 'v1', auth });
gmail.users.labels.list({
userId: 'me',
}, (err, res) => {
if (err) return console.log('The API returned an error: ' + err);
const labels = res.data.labels;
if (labels.length) {
console.log('Labels:');
labels.forEach((label) => {
console.log(`- ${label.name}`);
});
} else {
console.log('No labels found.');
}
});
}
}

The following example will show you how to interface with the Google API:

Save Data to a Google Sheet Using NPM
Use the Google APIs Node.js Client package included in the Wix Package Manager to access a Google Sheet .

Hi Yisrael
Thank you so much for the guides. I got some clue about how to proceed; I installed ‘googleapis’ so now I have two files and one module. It seems to me there is some progress, but I got another error, which refers to the ‘index.js’ file.
This is the image of the error.

Apparently, there is a problem in reading the ‘credentials.json’, which belongs to the step ‘// Load client secrets from a local file.’.
Honestly, I have stuck because I don’t know whether it is about the problem with the setting in the Gmail API (say google part) or about some problem in the code I have adopted from the tutorial about the sending email using sendGrid?
For example, in the index file, should I leave the index file as exactly as it is, with no modification in it, and then change the ‘email.jsw’ and the corresponding page code?
Where the problem might be?
May I ask you to give a little bit more guidance on these issues?

If you search the forum you can find previous posts that can help you.
https://www.wix.com/corvid/forum/community-discussion/javascript-gmail-api
https://www.wix.com/corvid/forum/community-discussion/gmail-api

Hi @Yisrael and @GOS
Thank you for the replies. As a newbie, I have a serious problem regarding following the disparity about this issue. All things are very fragmented and there are many “tutorials”, which are not directly about sending an email using Gmail API within the Wix platform.
I just need a blueprint, which gives components, i.e. files, and structures, i.e. a road-map.
How many module and backend files one needs to get done this sending. I mean I need a content of the book not the body of the that. So, I can decide whether I’m capable of doing this of not.
I will be grateful if you help me go through this confusion.

How to increase deliverability?