Google App EngineでGmailからメールを送信する

2020-03-03

Google App Engineで、Gmailを使ってメールを送信する方法を紹介します。

Google App Engineの第二世代では、今まで使用できていたメールAPIが使用できなくなり、サードパーティのメールサービスを使用しないといけなくなりました。
今までコンタクトフォームから問い合わせがあったときに、その内容を知らせる程度にしか使用していなかったので、わざわざサードパーティのサービスを使用するほどでもないため、Gmailを使用してみることにしました。

ウェブアプリからのGmailメール送信に関して調べてみると、Oauth2を使用した認証でGmail APIへのアクセス権を得てメールを送信する方法が多く紹介されています。しかしこの方法は本来、サイトにアクセスした人のGmailアカウントの権限を取得するための方法ですので、意図していたのとは異なります。

Googleのアプリパスワードの認証を利用すると、もっと簡単な方法でGmailからメール送信することができます。この方法で認証されるのは自分のGoogleアカウントのみですが、私の目的には合致しているので、これでやっていきたいと思います。Googleのアプリパスワードは、自分のGoogleアカウント管理画面から、セキュリティタブを開いて、以下の画像の「アプリパスワード」から設定できます。

このアプリパスワードを使用して、以下のようなコードでメールが送信可能です。

package main

import (
   "fmt"
   "log"
   "net/http"
   "net/smtp"
   "os"
)

func main() {
   http.HandleFunc("/mail", mail)
   http.HandleFunc("/", hello)
   port := os.Getenv("PORT")
   if port == "" {
      port = "8080"
      log.Printf("Defaulting to port %s", port)
   }

   log.Printf("Listening on port %s", port)
   if err := http.ListenAndServe(":"+port, nil); err != nil {
      log.Fatal(err)
   }
}

func hello(w http.ResponseWriter, r *http.Request) {
   fmt.Fprint(w, "Hello!")
}

func mail(w http.ResponseWriter, r *http.Request) {
   if r.Method == "POST" {
      msg := r.FormValue("msg")
      fmt.Fprintf(w, "Message is %s", msg)

      auth := smtp.PlainAuth(
         "",
         "送信元メルアド@gmail.com",
         "アプリパスワード",
         "smtp.gmail.com",
      )
      err := smtp.SendMail(
         "smtp.gmail.com:587",
         auth,
         "送信元メルアド@gmail.com",
         []string{"送信先のメルアド"},
         []byte(fmt.Sprintf("To:送信先のメルアド\r\nSubject:コンタクトフォームから問合せ\r\n\r\n%s", msg)),
      )
      if err != nil {
         log.Fatal(err)
      }
      return
   }
   w.Header().Add("Content-Type", "text/html; charset=utf-8")
   fmt.Fprint(w, `<form method="POST"><textarea name="msg"></textarea><input type="submit"></form>`)
}
GolangGoogle App Engine