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)に以下のメールが追加されていれば成功です
参考サイト
- Google I/O 2014の裏でひっそり公開されたGmail APIを触ってみる - Qiita
- Users.messages: insert | Gmail API | Google Developers
- go言語でoauth2パッケージを使う | go | kido Tech Blog
- Go Quickstart | Gmail API | Google Developers
- oauth2 - GoDoc
- gmail - GoDoc
- go - golang RFC2822 conversion - Stack Overflow
- Golang: 文字列を base64 にエンコードする - Sarabande.jp