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