我在使用GmailAPI解码收到的电子邮件的邮件正文时遇到了严重问题。我想获取邮件内容并将内容放在一个div中。我正在使用base64解码器,我知道它不会解码不同编码的电子邮件,但我不确定如何检查电子邮件以决定使用哪个解码器-说它们是utf-8编码的电子邮件由base64解码器成功解码,但不是utf-8解码器。
我已经研究电子邮件解码好几天了,我知道我在这里有点力不从心。我以前没有做过太多关于电子邮件的编码工作。这是我用来获取电子邮件的代码:
gapi.client.load('gmail', 'v1', function() {
var request = gapi.client.gmail.users.messages.list({
labelIds: ['INBOX']
});
request.execute(function(resp) {
document.getElementById('email-announcement').innerHTML = '<i>Hello! I am reading your <b>inbox</b> emails.</i><br><br>------<br>';
var content = document.getElementById("message-list");
if (resp.messages == null) {
content.innerHTML = "<b>Your inbox is empty.</b>";
} else {
var encodings = 0;
content.innerHTML = "";
angular.forEach(resp.messages, function(message) {
var email = gapi.client.gmail.users.messages.get({
'id': message.id
});
email.execute(function(stuff) {
if (stuff.payload == null) {
console.log("Payload null: " + message.id);
}
var header = "";
var sender = "";
angular.forEach(stuff.payload.headers, function(item) {
if (item.name == "Subject") {
header = item.value;
}
if (item.name == "From") {
sender = item.value;
}
})
try {
var contents = "";
if (stuff.payload.parts == null) {
contents = base64.decode(stuff.payload.body.data);
} else {
contents = base64.decode(stuff.payload.parts[0].body.data);
}
content.innerHTML += '<b>Subject: ' + header + '</b><br>';
content.innerHTML += '<b>From: ' + sender + '</b><br>';
content.innerHTML += contents + "<br><br>";
} catch (err) {
console.log("Encoding error: " + encodings++);
}
})
})
}
});
});
我正在执行一些检查和调试,所以还有剩余的控制台. log
和其他一些仅用于测试的东西。尽管如此,您可以在这里看到我正在尝试做什么。
解码我从GmailAPI中提取的电子邮件的最佳方法是什么?我应该尝试将电子邮件放入吗?
对于我正在编写的原型应用程序,以下代码适用于我:
var base64 = require('js-base64').Base64;
// js-base64 is working fine for me.
var bodyData = message.payload.body.data;
// Simplified code: you'd need to check for multipart.
base64.decode(bodyData.replace(/-/g, '+').replace(/_/g, '/'));
// If you're going to use a different library other than js-base64,
// you may need to replace some characters before passing it to the decoder.
注意:这些要点没有明确记录,可能是错误的:
>
用户消息:get
API默认返回"解析的主体内容"。这些数据似乎总是以UTF-8和Base64编码,而不管Content-Type
和Content-Transtrans-Encode
标头。
例如,我的代码在解析带有以下标题的电子邮件时没有问题:Content-Type: text/平原;charset=ISO-2022-JP
,Content-Transtrans-Encode:7bit
。
Base64编码的映射表因各种实现而异。GmailAPI使用-
和_
作为表的最后两个字符,如RFC4648的URL和文件名安全字母表1所定义。
检查您的Base64库是否使用不同的映射表。如果是,请在将正文传递给解码器之前将这些字符替换为您的库接受的字符。
1留档中有一行支持:“原始”格式返回“正文内容作为base64url编码的字符串”。(谢谢埃里克!)
使用atob在JavaScript中解码消息(参见参考文献)。为了访问您的消息负载,您可以编写一个函数:
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问题和
var part = message.parts.filter(function(part) {
return part.mimeType == 'text/html';
});
var html = atob(part.body.data);
如果以上没有100%正确解码,@cgenco对以下答案的评论可能适用于您。在这种情况下,做
var html = atob(part.body.data.replace(/-/g, '+').replace(/_/g, '/'));
解决方案如下:GmailAPI-"User. message:get"方法响应message.payload.body.data分离的base64数据,它由"-"符号分隔。它不是整个base64编码文本,而是base64文本的一部分。您必须尝试解码其中的每个部分,或者通过联合并替换"-"符号来创建一个单声道字符串。之后,您可以轻松地将其解码为人类文本。您可以在此处手动检查每个部分https://www.base64decode.org