takaya030の備忘録

PHP、Laravel、Docker などの話がメインです

Go言語(golang)で Gmail API を使う

検証環境

Windows10 Home Edition

C:\>go version
go version go1.8 windows/amd64

Access Token の取得

以下の記事を参考に Gmail API で使用する Access Token を取得する
takaya030.hatenablog.com

oauth2 関連パッケージの取得

C:\>go get golang.org/x/oauth2
C:\>go get golang.org/x/oauth2/google
C:\>go get google.golang.org/api/gmail/v1

ソースコード

gmailtest.go

package main

import (
  "fmt"
  "time"
  "log"

  "golang.org/x/oauth2"
  "golang.org/x/oauth2/google"
  gmail "google.golang.org/api/gmail/v1"
)

func main() {

  config := oauth2.Config{
    ClientID:     "Your Client ID",
    ClientSecret: "Your Client Secret",
    Endpoint:     google.Endpoint,
    RedirectURL:  "urn:ietf:wg:oauth:2.0:oob",	//今回はリダイレクトしないためこれ
    Scopes:       []string{"https://mail.google.com/"}, //必要なスコープを追加
  }

  expiry,_  := time.Parse("2006-01-02", "2017-07-11")
  token := oauth2.Token{
	AccessToken:  "Your Access Token",
	TokenType:    "Bearer",
	RefreshToken: "Your Refresh Token",
	Expiry:       expiry,
  }

  client := config.Client(oauth2.NoContext, &token)

  srv, err := gmail.New(client)
  if err != nil {
    log.Fatalf("Unable to retrieve gmail Client %v", err)
  }

  r, err := srv.Users.Labels.List("me").Do()
  if err != nil {
    log.Fatalf("Unable to get labels. %v", err)
  }

  if (len(r.Labels) > 0) {
    fmt.Print("Labels:\n")
    for _, l := range r.Labels {
      fmt.Printf("- %s\n",  l.Name)
    }
  } else {
    fmt.Print("No label found.")
  }
}

ビルド

C:\go_src>go build gmailtest.go

動作確認

C:\go_src>gmailtest.exe
Labels:
- CATEGORY_PERSONAL
- プライベート
- 旅行
- CATEGORY_SOCIAL
- 領収書
- IMPORTANT
- 仕事
- CATEGORY_UPDATES
- CATEGORY_FORUMS
- CHAT
- SENT
- INBOX
- TRASH
- CATEGORY_PROMOTIONS
- DRAFT
- SPAM
- STARRED
- UNREAD