takaya030の備忘録

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

Go言語(golang)で Gmail の受信トレイにメールを追加してみる

Gmail API を使うとメール送信無しに Gmail の受信トレイに直接メールを追加することができます。その検証をしたときのメモ。

検証環境

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

ソースコード

insertmail.go

package main

import (
  "fmt"
  "time"
  "log"
  "encoding/base64"

  "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)
  }

  // email date
  const rfc2822 = "Mon Jan 02 15:04:05 -0700 2006"
  email_date  := time.Now().Format(rfc2822)

  // an email data
  message := gmail.Message{
    Raw: base64.URLEncoding.EncodeToString([]byte("Date: " + email_date + "\r\n" +
         "From: hoge@example.com\r\n" +
         "To: fuga@gmail.com\r\n" +
         "Subject: test mail\r\n" +
         "Content-Type: text/html; charset=UTF-8\r\n" +
         "\r\n" +
         "<html><body>This is a test mail.</body></html>")),
    LabelIds:       []string{"INBOX"},
  }

  // insert message
  m, err := srv.Users.Messages.Insert("me", &message).Do()
  if err != nil {
    log.Fatalf("Unable to insert messages. %v", err)
  }
  fmt.Printf("Finish inserting message. id:%s", m.Id)
}

ビルド

C:\go_src>go build insertmail.go

動作確認

C:\go_src>insertmail.exe
Finish inserting message. id:15d37199b2d9xxxx

Gmail の受信トレイ(INBOX)に以下のメールが追加されていれば成功です
f:id:takaya030:20170712232850p:plain