Gmail API - how to correctly parse message body data?

左心房为你撑大大i 提交于 2020-12-30 09:32:44

问题


I'm using the new Gmail API and am absolutely stuck on how to correctly handle the encoding of the [body][data] portion in Ruby/Rails for both the text/plain message and the text/html message.

Let's say data = the encoded message portion.

Calling Base64.decode64(data).unpack("M") on it returns an US-ASCII encoded text body with lots of missing characters as displayed on a web page.

Calling Base64.decode64(data).encode('UTF-8') throws a conversion error from US-ASCII to UTF-8

Yet if I do Base64.decode64(data).encode('UTF-8', {:invalid => :replace, :undef => :replace, :replace => '?'}), I'm still seeing a ton of question marks.

Can someone point me in the right direction on how to get the message body to be properly encoded and displayed in UTF-8?

The formatting of the email JSON response is as follows:

"parts": [
   {
    "partId": "0",
    "mimeType": "text/plain",
    "filename": "",
    "headers": [
     {
      "name": "Content-Type",
      "value": "text/plain; charset=UTF-8"
     },
     {
      "name": "Content-Transfer-Encoding",
      "value": "quoted-printable"

回答1:


Use Base64.urlsafe_decode64 to decode the message body.




回答2:


var base64toUTF8 = function base64toUTF8(str,urlsafe) {
  if(urlsafe) {
    str = str.replace(/_/g,"/");
    str = str.replace(/-/g,"+");
  }
  if(typeof window) {
    return decodeURIComponent(escape(window.atob( str )));
  }
  else if(typeof module !== 'undefined' && module.exports) {
    return new Buffer("SGVsbG8gV29ybGQ=", 'base64').toString('utf8');
  }
};

just the need to replace base64 encoded chars '-' with '+' and '_' with '/'




回答3:


Based on Bhargav Krishna's answer, here's a nodeJS-friendly version:

var base64toUTF8 = function base64toUTF8(str, urlsafe) {
  if (urlsafe) {
    str = str.replace(/_/g,"/");
    str = str.replace(/-/g,"+");
  }
  return new Buffer(str, 'base64').toString('utf8');
};

I removed the references to window vs module, and also made it so that the NodeJS one actually uses str, not just "Hello World!"



来源:https://stackoverflow.com/questions/24482038/gmail-api-how-to-correctly-parse-message-body-data

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!