quickstart node javascript email character-encoding decoding gmail-api

javascript - node - send gmail api



Mensajes de descodificación de la API de Gmail en Javascript (2)

Para un prototipo de aplicación que estoy escribiendo, el siguiente código me funciona:

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 documentados explícitamente y podrían ser incorrectos:

  1. Los users.messages: get 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 .

    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-Type: text/plain; charset=ISO-2022-JP , Content-Transfer-Encoding: 7bit .

  2. La tabla de asignación de la codificación Base64 varía entre varias implementaciones . La API de Gmail usa - y _ como los dos últimos caracteres de la tabla, tal como lo define RFC 4648 ''URL and Filename safe Alphabet'' 1 .

    Compruebe si su biblioteca Base64 está utilizando una tabla de asignación 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 cadena codificada en base64url". (Gracias Eric!)

Tengo problemas graves para decodificar el cuerpo del mensaje de los correos electrónicos que recibo usando la API de Gmail. Quiero tomar el contenido del mensaje y poner el contenido en un div. Estoy usando un decodificador base64, que sé que no decodificará los correos electrónicos codificados de manera diferente, pero no estoy seguro de cómo consultar un correo electrónico para decidir qué decodificador usar: los correos electrónicos que dicen que están codificados en utf-8 son decodificados con éxito por el decodificador base64, pero no sea un decodificador utf-8.

He estado investigando la decodificación del correo electrónico durante varios días, y he aprendido que estoy un poco fuera de mi alcance aquí. No he trabajado mucho con la codificación del correo electrónico antes. Aquí está el código que estoy usando para recibir los correos electrónicos:

gapi.client.load(''gmail'', ''v1'', function() { var request = gapi.client.gmail.users.messages.list({ labelIds: [''INBOX''] }); request.execute(function(resp) { document.getElementById(''email-announcement'').innerHTML = ''<i>Hello! I am reading your <b>inbox</b> emails.</i><br><br>------<br>''; var content = document.getElementById("message-list"); if (resp.messages == null) { content.innerHTML = "<b>Your inbox is empty.</b>"; } else { var encodings = 0; content.innerHTML = ""; angular.forEach(resp.messages, function(message) { var email = gapi.client.gmail.users.messages.get({ ''id'': message.id }); email.execute(function(stuff) { if (stuff.payload == null) { console.log("Payload null: " + message.id); } var header = ""; var sender = ""; angular.forEach(stuff.payload.headers, function(item) { if (item.name == "Subject") { header = item.value; } if (item.name == "From") { sender = item.value; } }) try { var contents = ""; if (stuff.payload.parts == null) { contents = base64.decode(stuff.payload.body.data); } else { contents = base64.decode(stuff.payload.parts[0].body.data); } content.innerHTML += ''<b>Subject: '' + header + ''</b><br>''; content.innerHTML += ''<b>From: '' + sender + ''</b><br>''; content.innerHTML += contents + "<br><br>"; } catch (err) { console.log("Encoding error: " + encodings++); } }) }) } }); });

Estaba realizando algunas comprobaciones y depuraciones, por lo que quedan restos de console.log y algunas otras cosas que solo están ahí para probar. Aún así, puedes ver aquí lo que estoy tratando de hacer.

¿Cuál es la mejor manera de decodificar los correos electrónicos que extraigo de la API de Gmail? ¿Debería intentar poner los correos electrónicos en <script> con juego de charset y type atributos que coincidan con el contenido de codificación del correo electrónico? Creo que recuerdo que Charset solo funciona con un atributo src , que no tendría aquí. ¿Alguna sugerencia?


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");

referenciado de 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 en esta respuesta a continuación pueden aplicarse a usted. En ese caso, hazlo

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