11

我正在尝试使用 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>";
      })
    });
  });
}

所以gapi.client.gmail.users.messages.list返回我的消息数组,以及他们的 ID 号。那是有效的。

调用gapi.client.gmail.users.messages.get({<specific message ID>})输出这个 - {"B":{"method":"gmail.users.messages.get","rpcParams":{},"transport":{"name":"googleapis"}}}

不确定那是什么,但尝试获取消息有效负载 ( email.payload.parts) 会导致undefined. 那么,如何获取消息内容呢?

另外,我假设如果我能得到消息内容,我将不得不对内容进行 Base64 解码以从中获取一些英语。对此的任何建议也会有很大帮助。我发现了这个:https ://github.com/kvz/phpjs ,但由于我不确定如何获取消息内容以便我可以尝试解码它们,所以不确定是否是 php.js在这方面有帮助。

4

4 回答 4

38

关于 Base64 解码,您可以使用

atob(dataToDecode)

对于 Gmail,您还需要替换一些字符:

atob( dataToDecode.replace(/-/g, '+').replace(/_/g, '/') ); 

您可以在 JavaScript 中使用上述功能(请参阅ref)。我自己用它来解码 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");

从我之前的SO Question

var part = message.parts.filter(function(part) {
  return part.mimeType == 'text/html';
});
var html = atob(part.body.data.replace(/-/g, '+').replace(/_/g, '/'));
于 2015-02-20T05:19:07.130 回答
4

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

有关更多信息,请查看https://developers.google.com/gmail/api/v1/reference/users/messages的“消息”的“正文”和“部件 []”字段文档

于 2014-07-14T20:15:15.927 回答
3

啊! 我想到了。parts是一个数组,所以我应该这样称呼它:gapi.client.gmail.users.messages.get({'id': <message ID>}).payload.parts[0].body.data

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

于 2014-07-15T16:03:08.280 回答
0

您需要搜索给定 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');

看到上面的 flatMap 方法了吗?js 中缺少经典的 FP 方法,这里是如何添加它(或者你可以使用 lodash.js 或 underscore.js,如果你不想弄乱原生对象)

Array.prototype.flatMap = function(lambda) { 
    return Array.prototype.concat.apply([], this.map(lambda)); 
};
于 2015-11-19T14:14:30.457 回答