Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gmail API-使用Javascript解析消息内容(Base64解码?)_Javascript_Angularjs_Base64_Gmail Api - Fatal编程技术网

Gmail API-使用Javascript解析消息内容(Base64解码?)

Gmail API-使用Javascript解析消息内容(Base64解码?),javascript,angularjs,base64,gmail-api,Javascript,Angularjs,Base64,Gmail Api,我正在尝试使用Gmail API获取用户的电子邮件,获取邮件主题和正文,然后将其显示在网页上。我会用它做其他事情,但这是我遇到困难的部分。我正在使用Angular.js 以下是我的API调用: function makeApiCall() { gapi.client.load('gmail', 'v1', function() { var request = gapi.client.gmail.users.messages.list({ labelIds: ['INBOX

我正在尝试使用Gmail API获取用户的电子邮件,获取邮件主题和正文,然后将其显示在网页上。我会用它做其他事情,但这是我遇到困难的部分。我正在使用Angular.js

以下是我的API调用:

function makeApiCall() {
  gapi.client.load('gmail', 'v1', function() {
    var request = gapi.client.gmail.users.messages.list({
      labelIds: ['INBOX']
    });
    request.execute(function(resp) {
      var content = document.getElementById("message-list");
      angular.forEach(resp, function(message) {
        var email = gapi.client.gmail.users.messages.get({'id': message.id});
        // var raw = email.payload.parts;
        // console.log(raw);
        content.innerHTML += JSON.stringify(email) + "<br>";
      })
    });
  });
}
函数makeApiCall(){
load('gmail','v1',function(){
var request=gapi.client.gmail.users.messages.list({
标签ID:[“收件箱”]
});
请求执行(功能(resp){
var content=document.getElementById(“消息列表”);
angular.forEach(响应、功能(消息){
var email=gapi.client.gmail.users.messages.get({'id':message.id});
//var raw=email.payload.parts;
//控制台日志(原始);
content.innerHTML+=JSON.stringify(电子邮件)+“
”; }) }); }); }
因此
gapi.client.gmail.users.messages.list
返回一个包含我的消息及其ID号的数组。这是有效的

调用
gapi.client.gmail.users.messages.get({})
输出以下内容-
{“B”:{“method”:“gmail.users.messages.get”,“rpcParams”:{},“transport”:{“name”:“googleapis”}}

不确定这是什么,但尝试获取消息负载(
email.payload.parts
)会导致
未定义。那么,我如何获取消息内容


另外,我假设如果我可以得到消息内容,那么我就必须对内容进行Base64解码,从中获得一些英语。任何关于这方面的建议都会有很大的帮助。我发现了这一点:,但由于我不确定如何获取消息内容,以便尝试解码它们,因此不确定php.js是否在这方面有帮助。

取决于您的电子邮件的外观(单文本/纯文本部分?带文本/html的多部分?附件等),您可能有也可能没有任何“部分”在您的email.payload中,您将在“email.payload.body.data”(用于单部分邮件)中找到您想要的内容。这都是假设您正在使用默认格式(“full”)执行message.get。如果您想在message.raw字段中获取整个电子邮件,并在您的语言的电子邮件库中处理它,您可以调用message.get(format=raw)


有关更多信息,请查看“消息”的“正文”和“零件[]”字段文档,网址为

Ah!我想出来了<代码>部件是一个数组,所以我应该像这样调用它:
gapi.client.gmail.users.messages.get({'id':}).payload.parts[0].body.data


现在我的问题是破解电子邮件,这在纯文本电子邮件中证明是成功的,但在非个人位置(企业、社交媒体更新电子邮件等)的电子邮件中却失败了。但是我将提出一个新问题来获得答案。

关于Base64解码,您可以使用

atob(dataToDecode)
对于Gmail,您还需要替换一些字符:

atob( dataToDecode.replace(/-/g, '+').replace(/_/g, '/') ); 
上述函数在JavaScript中可用(请参阅)。我自己用它来解码Gmail信息。不需要安装额外的东西。有趣的是,如果您想将消息编码到Base64,请使用btoa

现在,为了访问消息负载,您可以编写一个函数:

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");
参考我以前的和


您需要搜索给定mime类型的主体所在的位置,我为此编写了一个递归函数:

function searchBodyRec(payload, mimeType){
    if (payload.body && payload.body.size && payload.mimeType === mimeType) {
        return payload.body.data;
    } else if (payload.parts && payload.parts.length) {
        return payload.parts.flatMap(function(part){
            return searchBodyRec(part, mimeType);
        }).filter(function(body){
            return body;
        });
    }
}
现在你可以打电话了

var encodedBody = searchBodyRec(this.message.payload, 'text/plain');
看到上面的平面图方法了吗?js中缺少经典的FP方法,下面是如何添加它(或者如果不想弄乱本机对象,可以使用lodash.js或下划线.js)


当尝试记录
gapi.client.gmail.users.messages.get({}).payload.body.data
时,它输出
未捕获类型错误:无法读取未定义的属性“body”。但是,在测试Gmail API文档中的.get方法调用时(我知道你发布的链接),请尝试!在messages.get部分中,我可以看到消息对象的有效负载字段中的内容,所以它不应该是未定义的。虽然对于第[]部分,它显示为“
for…text/plain”,但此字段为空。
基本电子邮件消息将包含纯文本,对吗?所以也许我不该去那里..你应该用a来编码和解码见我上面的编码/解码答案哦,我的好,谢谢你的GMail提示。我想弄清楚为什么我的解码在
原始信息上出现了混乱。噢,天哪,你的gmail替换提示救了我一命
var encodedBody = searchBodyRec(this.message.payload, 'text/plain');
Array.prototype.flatMap = function(lambda) { 
    return Array.prototype.concat.apply([], this.map(lambda)); 
};