我正在尝试使用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是否有帮助方面。
答案 0 :(得分:25)
关于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, '/'));
答案 1 :(得分:3)
根据您的电子邮件的样子(单文/普通部分?带文字/ 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
上“消息”的“正文”和“部分[]”字段文档答案 2 :(得分:3)
啊!我想到了。 parts
是一个数组,所以我应该称之为:gapi.client.gmail.users.messages.get({'id': <message ID>}).payload.parts[0].body.data
现在我的问题是解码电子邮件,这在纯文本电子邮件中证明是成功的,但在非个人位置(商家,社交媒体更新电子邮件等)的电子邮件中失败。但我会提出一个新问题来获得答案。
答案 3 :(得分: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));
};