Search code examples
gogmailgmail-api

Fetching new Gmail emails after a timestamp


I am going through Gmail API docs(https://developers.google.com/gmail/api), I am able to read all the user emails which are present in the inbox.

eg snippet (reading complete list of emails):

for {
        req := svc.Users.Messages.List("me")
        r, _ := req.Do()
        for _, m := range r.Messages {
            msg, _ := svc.Users.Messages.Get("me", m.Id).Do()
            date := ""
            for _, h := range msg.Payload.Headers {
                if h.Name == "Date" {
                    date = h.Value
                    break
                }
            }
            msgs = append(msgs, message{
                ...
            })
        }
    }

Now, when new emails come I want to read them as well (either immediately or after some time). I can write a scheduled job for that purpose, But I am not sure if I can fetch email after a particular timestamp or after an email identifier. I don't want to read a whole bunch of emails, again and again, to figure out the new emails, in this way, there is a lot of unnecessary computation being involved. Is there any way I can make this task easier?


Solution

  • Looking at the docs, it looks like it supports a query parameter, q.

    The query parameter supports the same options as available in the Gmail search bar:

    Only return messages matching the specified query. Supports the same query format as the Gmail search box. For example, "from:[email protected] rfc822msgid:[email protected] is:unread". Parameter cannot be used when accessing the api using the gmail.metadata scope.

    This means you can do something like "after:YYYY/MM/DD" or with a timestamp "after:1616819452".

    req := svc.Users.Messages.List("me").Q("after:2021/01/01")
    

    See the full usage here https://pkg.go.dev/google.golang.org/api/gmail/v1#UsersMessagesListCall.Q