Saltar al contenido

API de Gmail para enviar correos en Node.js

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. .jsonagregó 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *