5

In the code below I am signing in, authorising the app, and getting console output via the GMail API. I believe I am getting the threads and thread IDs, but I am not seeing the messages in the console.

I am not getting any errors and I am getting output, just what seems like keys with no values.

Here is what the console output looks like: enter image description here

Here is the code:

var CLIENT_ID = 'YOUR_CLIENT_ID';
var SCOPES = ['https://www.googleapis.com/auth/gmail.readonly'];
var USER = 'me';

  /**
   * Called when the client library is loaded to start the auth flow.
   */
  function handleClientLoad() {
    window.setTimeout(checkAuth, 1);
  }

  /**
   * Check if the current user has authorized the application.
   */
  function checkAuth() {
    gapi.auth.authorize(
        {'client_id': CLIENT_ID, 'scope': SCOPES, 'immediate': true},
        handleAuthResult);
  }

  /**
   * Called when authorization server replies.
   *
   * @param {Object} authResult Authorization result.
   */
  function handleAuthResult(authResult) {
    var authButton = document.getElementById('authorizeButton');
    var outputNotice = document.getElementById('notice');
    authButton.style.display = 'none';
    outputNotice.style.display = 'block';
    if (authResult && !authResult.error) {
      // Access token has been successfully retrieved, requests can be sent to the API.
      gapi.client.load('gmail', 'v1', function() {
        listThreads(USER, function(resp) {
          var threads = resp.threads;
          for (var i = 0; i < threads.length; i++) {
            var thread = threads[i];
            console.log(thread);
            console.log(thread['id']);
          }
        });
      });
    } else {
      // No access token could be retrieved, show the button to start the authorization flow.
      authButton.style.display = 'block';
      outputNotice.style.display = 'none';
      authButton.onclick = function() {
          gapi.auth.authorize(
              {'client_id': CLIENT_ID, 'scope': SCOPES, 'immediate': false},
              handleAuthResult);
      };
    }
  }


  /**
   * Get a page of Threads.
   *
   * @param  {String} userId User's email address. The special value 'me'
   * can be used to indicate the authenticated user.
   * @param  {Function} callback Function called when request is complete.
   */
  function listThreads(userId, callback) {
    var request = gapi.client.gmail.users.threads.list({
      'userId': userId
    });
    request.execute(callback);
  }

How can I retrieve the from address, subject, and body of the messages? with the GMAIL API in js

**Update: What I am currently working with: **

listThreads('me', function(dataResult){
    $.each(dataResult, function(i, item){
        getThread('me', item.id, function(dataMessage){
            console.log(dataMessage);
            var temp = dataMessage.messages[0].payload.headers;
            $.each(temp, function(j, dataItem){
                if(dataItem.name == 'From'){
                    console.log(dataItem.value);
                }
            });
         });
      });
   });

When I log dataMessage, I get a 400 error, ' id required '. When I log dataItem.value, I get a dataMessage.messages is undefined and can not have an index of 0.

I'd greatly appreciate help in getting this working!

wordSmith
  • 2,993
  • 8
  • 29
  • 50

3 Answers3

1

GMail api in Javascript does not explicit methods to access particular email part - to/from/etc. GMail api in Java has this feature. Gmail api in Javascript are still in Beta. api list

You still wanna do it: Here is outline:

Instead of getting list of threads get list of messages: message list

Parse message id from json retrieved from previous call, use it with following: message get

Get raw message in URL encoded base64 format. Decode and parse. safe encoding encoding

Difficult... You bet... :)

Community
  • 1
  • 1
Amit G
  • 2,293
  • 3
  • 24
  • 44
  • can you show me how to get the threads list? With what I am currently doing, I get the id in the console. But how do I get the messages from there? Here is a live example: irfanknow.com/gmail.html – wordSmith Aug 18 '14 at 18:29
1

Here's what i did to get the from email id from message
After calling the listThread() method, i called getThread() method to fetch the from email ID from that thread as following.

listThreads("me", "", function (dataResult) {
         $.each(dataResult, function (i, item) {
           getThread("me", item.id, function (dataMessage) {
             var temp = dataMessage.messages[0].payload.headers;
             $.each(temp, function (j, dataItem) {
                   if (dataItem.name == "From") {
                       Console.log(dataItem.value);
                    }
             });
        });
    });
});

Similarly you can fetch other details from the message.

Reference : JSON Format for the message

AbdulRahman Ansari
  • 3,007
  • 1
  • 21
  • 29
  • What does your entire code look like? I am trying what you have above and am still getting nothing in the console. Here is what all my code looks like: https://gist.github.com/theirf/f142d3b02e5e2343403a What am I doing wrong? – wordSmith Sep 09 '14 at 22:06
  • Okay, that makes more sense. I ran it and was getting an error that `string is not a function`, but then I removed the second argument from listThreads and I got no errors. Except now, I am again getting nothing in console. No errors or results. Here is what I have: https://gist.github.com/theirf/71464ac6e9ead6425074 – wordSmith Sep 11 '14 at 17:45
  • @user3743069 debug your code using F12 in chrome or FireFox, check if you are getting proper response or not... – AbdulRahman Ansari Sep 12 '14 at 05:04
  • @user3743069 have you added the getThreads() method, if not then check `gist.github.com/theirf/71464ac6e9ead6425074`, i have added the method there – AbdulRahman Ansari Sep 12 '14 at 05:13
  • Thank you. Now, I am using your getThread() function, but am getting an error. it says `.messages` is undefined? and there is no index 0 of .messages since it is undefined. Here is the code: https://gist.github.com/theirf/71464ac6e9ead6425074 – wordSmith Sep 12 '14 at 22:13
  • @user3743069 check if you are getting anything in `dataResult` or is it also `undefined`??? – AbdulRahman Ansari Sep 15 '14 at 05:06
  • I am getting a 400 error saying that the id is required. I have put my code and the errors at the bottom of my question. Thank you for the help! – wordSmith Sep 16 '14 at 02:28
1

Like Amit says above you can use messages.list() to get a list of message ids. With those you can simply call messages.get() and that will return an email in parsed form and you can get to the headers via message.payload.headers. You don't need to get the 'raw' message base64 encoded.

Eric D
  • 6,901
  • 1
  • 15
  • 26