11

Gmail API を使用してユーザーのメールを取得し、メッセージの件名と本文を取得して、Web ページに表示しようとしています。私はそれで他のことをしますが、これは私が苦労している部分です. 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

4

メールがどのように見えるかに応じて (単一のテキスト/プレーン パーツ? テキスト/html を含むマルチパート? 添付ファイルなど)、email.payload に「パーツ」がある場合とない場合があります。 「email.payload.body.data」を探します (単一部分のメッセージの場合)。これはすべて、デフォルトの形式 ("full") で message.get を実行していることを前提としています。代わりに、message.raw フィールドでメール全体を取得し、それを自分の言語のメール ライブラリで処理したい場合は、message.get(format=raw) を呼び出すことができます。

詳細については、https://developers.google.com/gmail/api/v1/reference/users/messagesの「Message」の「body」および「parts[]」フィールドのドキュメントを確認してください。

于 2014-07-14T20:15:15.927 に答える
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 に答える