Gmail API-使用Javascript解析消息内容(Base64解码?)
我正在尝试使用Gmail API获取用户的电子邮件,获取邮件主题和正文,然后将其显示在网页上。我会用它做其他事情,但这是我遇到困难的部分。我正在使用Angular.js 以下是我的API调用: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
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));
};