Saltar al contenido

Gmail API decodificación de mensajes en Javascript

Esta es la respuesta más exacta que te podemos compartir, sin embargo estúdiala pausadamente y valora si se adapta a tu trabajo.

Solución:

Para una aplicación prototipo que estoy escribiendo, el siguiente código funciona para mí:

var base64 = require('js-base64').Base64;
// js-base64 is working fine for me.

var bodyData = message.payload.body.data;
// Simplified code: you'd need to check for multipart.

base64.decode(bodyData.replace(/-/g, '+').replace(/_/g, '/'));
// If you're going to use a different library other than js-base64,
// you may need to replace some characters before passing it to the decoder.

Precaución: estos puntos no están explícitamente documentados y podrían estar equivocados:

  1. los users.messages: get La API devuelve “contenido del cuerpo analizado” de forma predeterminada. Estos datos parecen estar siempre codificados en UTF-8 y Base64, independientemente del Content-Type y Content-Transfer-Encoding encabezamiento.

    Por ejemplo, mi código no tuvo problemas para analizar un correo electrónico con estos encabezados: Content-Type: text/plain; charset=ISO-2022-JP, Content-Transfer-Encoding: 7bit.

  2. La tabla de mapeo de la codificación Base64 varía entre varias implementaciones. Usos de la API de Gmail - y _ como los dos últimos caracteres de la tabla, según lo definido por “Alfabeto seguro de URL y nombre de archivo” de RFC 46481.

    Compruebe si su biblioteca Base64 está utilizando una tabla de mapeo diferente. Si es así, reemplace esos caracteres con los que acepta su biblioteca antes de pasar el cuerpo al decodificador.


1 Hay una línea de apoyo en la documentación: el formato “en bruto” devuelve “contenido del cuerpo como una url codificada en base64 string”. (¡Gracias Eric!)

Use atob para decodificar los mensajes en JavaScript (ver ref). Para acceder a la carga útil de su mensaje, puede escribir una función:

var extractField = function(json, fieldName) 
  return json.payload.headers.filter(function(header) 
    return header.name === fieldName;
  )[0].value;
;
var date = extractField(response, "Date");
var subject = extractField(response, "Subject");

al que se hace referencia en mi pregunta SO anterior y

var part = message.parts.filter(function(part) 
  return part.mimeType == 'text/html';
);
var html = atob(part.body.data);

Si lo anterior no se decodifica al 100% correctamente, los comentarios de @cgenco sobre esta respuesta a continuación pueden aplicarse a usted. En ese caso, haz

var html = atob(part.body.data.replace(/-/g, '+').replace(/_/g, '/'));

Aquí está la solución: API de Gmail: el método “Users.messages: get” tiene en respuesta message.payload.body.data partió los datos de base64, está separado por el símbolo “-“. No es todo el texto codificado en base64, son partes del texto base64. Tienes que tratar de decodificar cada parte de esto o hacer un mono string por unir y reemplazar el símbolo “-“. Después de esto, puede decodificarlo fácilmente en texto humano. Puede verificar manualmente cada parte aquí https://www.base64decode.org

Si haces scroll puedes encontrar los comentarios de otros usuarios, tú igualmente tienes el poder mostrar el tuyo si lo crees conveniente.

¡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 *