Luego de de nuestra prolongada recopilación de datos hemos podido resolver este inconveniente que pueden tener muchos los lectores. Te brindamos la respuesta y nuestro objetivo es que te resulte de gran apoyo.
Solución:
Ok, entonces encontré el (los) problema (s).
Problema #1
Mientras sigue la guía de inicio rápido de Node.js, el ejemplo en ese tutorial tiene
var SCOPES = ['https://www.googleapis.com/auth/gmail.readonly'];
Y cuando obtuve el .json
eso parece como:
"access_token": "xxx_a_long_secret_string_i_hided_xxx",
"token_type": "Bearer",
"refresh_token": "xxx_a_token_i_hided_xxx",
"expiry_date": 1451721044161
esos tokens fueron producidos teniendo en cuenta solamente la auth/gmail.readonly
scope en el código del tutorial.
Así que borré el primero. .json
agregó los alcances de mi alcance final array (publiqué en la pregunta) y ejecuté la configuración del tutorial nuevamente, recibiendo un nuevo token.
Problema #2
En el objeto pasado a la API que estaba enviando:
auth: auth,
userId: 'me',
message:
raw: raw
pero eso está mal, message
key debe ser llamado resource
.
Configuración definitiva:
Esto es lo que agregué al código del tutorial:
function makeBody(to, from, subject, message)
var str = ["Content-Type: text/plain; charset="UTF-8"n",
"MIME-Version: 1.0n",
"Content-Transfer-Encoding: 7bitn",
"to: ", to, "n",
"from: ", from, "n",
"subject: ", subject, "nn",
message
].join('');
var encodedMail = new Buffer(str).toString("base64").replace(/+/g, '-').replace(///g, '_');
return encodedMail;
function sendMessage(auth)
var raw = makeBody('[email protected]', '[email protected]', 'test subject', 'test message');
gmail.users.messages.send(
auth: auth,
userId: 'me',
resource:
raw: raw
, function(err, response)
res.send(err );
Y llamar a todo con:
fs.readFile(secretlocation, function processClientSecrets(err, content)
if (err)
console.log('Error loading client secret file: ' + err);
return;
// Authorize a client with the loaded credentials, then call the
// Gmail API.
authorize(JSON.parse(content), sendMessage);
);
Entonces, para cualquiera que esté mirando esto tratando de enviar un correo electrónico de prueba desde su API pero no puede hacer que esto funcione, esto es lo que debe hacer:
Paso 1: Reemplace el
var SCOPES = ['https://www.googleapis.com/auth/gmail.readonly'];
con este:
var SCOPES = [
'https://mail.google.com/',
'https://www.googleapis.com/auth/gmail.modify',
'https://www.googleapis.com/auth/gmail.compose',
'https://www.googleapis.com/auth/gmail.send'
];
Paso 2: al final del código de muestra de Google, agregue esto:
function makeBody(to, from, subject, message)
var str = ["Content-Type: text/plain; charset="UTF-8"n",
"MIME-Version: 1.0n",
"Content-Transfer-Encoding: 7bitn",
"to: ", to, "n",
"from: ", from, "n",
"subject: ", subject, "nn",
message
].join('');
var encodedMail = new Buffer(str).toString("base64").replace(/+/g, '-').replace(///g, '_');
return encodedMail;
function sendMessage(auth)
var raw = makeBody('[email protected]', '[email protected]', 'This is your subject', 'I got this working finally!!!');
const gmail = google.gmail(version: 'v1', auth);
gmail.users.messages.send(
auth: auth,
userId: 'me',
resource:
raw: raw
, function(err, response) response)
);
fs.readFile('credentials.json', function processClientSecrets(err, content)
if (err)
console.log('Error loading client secret file: ' + err);
return;
// Authorize a client with the loaded credentials, then call the
// Gmail API.
authorize(JSON.parse(content), sendMessage);
);
Paso 3 (Opcional)
Eliminar esta línea:
authorize(JSON.parse(content), listLabels);
Y estos:
/**
* 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.');
);
(Para que no obtenga las etiquetas aleatorias en su consola)
Si te sientes incitado, tienes el poder dejar una división acerca de qué le añadirías a este artículo.