Gmail-API-Dekodierung von Nachrichten in Javascript
Ich bin mit ernsthaften Problemen, die Decodierung der Nachricht Textkörper der E-Mails erhalte ich über die Gmail-API. Ich will schnappen Sie sich den Inhalt der Nachricht und setzen Sie den Inhalt in ein div. Ich bin mit einem base64-decoder, die ich kenne, nicht entschlüsseln von E-Mails kodiert anders, aber ich bin nicht sicher, wie Sie Sie zu prüfen, eine E-Mail zu entscheiden, welcher decoder zu verwenden-E-Mails, die sagen, Sie sind utf-8 kodiert sind, werden erfolgreich decodiert die base64-decoder, aber nicht einen utf-8-decoder.
Ich habe recherche E-Mail-Decodierung für mehrere Tage jetzt, und ich habe gelernt, dass ich ein wenig aus meiner Liga hier. Ich habe nicht viel getan, Arbeit mit Codierung um E-Mail vor. Hier ist der code, den ich verwende, um die E-Mails:
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++);
}
})
})
}
});
});
War ich durchführen einige Prüfungen und Debuggen, so dass es überbleibsel console.log
's und einige andere Dinge, die sind nur da zum testen. Noch, Sie hier sehen können was ich versuche zu tun.
Was ist der beste Weg, um zu entschlüsseln, E-Mails, die ich ziehen aus dem Gmail-API? Sollte ich versuchen, die E-Mails in <script>
's mit charset
und type
Attribute matching die Kodierung Inhalt der E-Mail? Ich glaube, ich erinnere mich, charset funktioniert nur mit einem src
Attribut, die ich nicht hier haben. Irgendwelche Vorschläge?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für einen Prototyp app, die ich Schreibe, ist der folgende code funktioniert für mich:
Achtung: diese Punkte sind nicht explizit dokumentiert, und könnte falsch sein:
Den
Benutzer.Nachrichten: get
- API gibt "analysiert body-content" standardmäßig. Dies scheinen Daten zu sein, die immer codiert in UTF-8 und Base64, unabhängig von derContent-Type
undContent-Transfer-Encoding
header.Zum Beispiel, mein code hatte kein problem in der Analyse einer E-Mail mit Header:
Content-Type: text/plain; charset=ISO-2022-JP
,Content-Transfer-Encoding: 7bit
.Die mapping-Tabelle des Base64-Codierung variiert zwischen verschiedenen Implementierungen. Gmail-API verwendet
-
und_
als die letzten beiden Zeichen in der Tabelle, definiert durch RFC 4648's" - URL und dem Dateinamen sicher Alphabet"1.Prüfen Sie, ob Ihr Base64-Bibliothek ist mit einem anderen mapping-Tabelle. Wenn dem so ist, ersetzen Sie diese Zeichen mit denen Sie Ihre Bibliothek akzeptiert, bevor Sie den Körper an den decoder.
1 Es ist eine unterstützende Leitung in der Dokumentation: die "raw" - format gibt "der Inhalt als base64url kodierten string". (Danke Eric!)
Verwenden atob zum Dekodieren der Nachrichten in JavaScript (siehe ref). Für den Zugriff auf die message-payload, können Sie eine Funktion schreiben:
verwiesen aus meiner früheren ALSO Frage und
Wenn die oben nicht entschlüsseln 100% richtig, die Kommentare von @cgenco auf diese Antwort unten auf Sie zutreffen. In diesem Fall tun
.replace(/-/g, '+').replace(/_/g, '/')
noch getan werden muss, für die es zu entschlüsseln richtig.replace
Funktionen? Ich werde glücklich sein, revidiere meine Antwort.-
statt+
und_
statt/
.Hier ist die Lösung:
Gmail API - "Benutzer.Nachrichten: get" - Methode hat in der Antwort-Nachricht.Nutzlast.Körper.Daten geteilt base64-Daten, getrennt durch ein "-" symbol. Es ist nicht der gesamte base64-codierten text, es ist Teile von base64-text. Sie haben, um zu versuchen zu entschlüsseln, jedes einzelne Teil von dieser oder machen eine mono-Schnur von vereinen und ersetzen " - " - symbol. Nach diesem können Sie leicht entschlüsseln der menschlichen text.
Sie können manuell überprüfen, jeden Teil hier https://www.base64decode.org
Bitte verwenden Sie websichere decoder für die Decodierung gmail-E-Mails und Anhänge. Ich habe leere Seiten, wenn ich nur base64decoder, hatte zu verwenden: https://www.npmjs.com/package/urlsafe-base64
Kann ich problemlos decodiert Sie mit einem anderen Werkzeug auf https://simplycalc.com/base64-decode.php
In JS: https://www.npmjs.com/package/base64url
In Python 3: