こんにちは。
Golang では"net/smtp"パッケージを使用して、
簡単にローカル環境からメール送信できる機能が実装できます。
掲題の通り、Golangを使ってローカル環境からGmailを送信する方法を記載します。
■やること
- GooogleテストアカウントのGmail設定
- 実装
GooogleテストアカウントのGmail設定
A. テストアカウントの作成
まずは頑張ってGoogleのテストアカウントを作成します。
B. 2段階認証プロセスを有効にする
アカウント作成後、アカウントのセキュリティーから、2段階認証プロセスを有効にします。
C. アプリパスワードを生成する
アプリ:メール
デバイス:その他 で生成します。(名前はなんでもよいです)
※ "お使いのデバイスのアプリパスワード" が表示されるので、忘れずにコピっておきます。
■実装
今回は、yamlファイルにSMTPサーバ情報を記載し、
そのyamlファイルを読み込みメール送信する方法を実装しました。
開発環境
go 1.20
github.com/labstack/echo/v4 v4.10.2
ファイル構成
test/
├── config/
│ └── smtpserver.yaml -- SMTP接続情報が記載
├── functions/
│ └── functions.go
├── handler/
│ └── handler.go
├── models/
│ └── models.go -- yamlから取得した接続情報を入れる
├── util/
│ └── util.go
└── main.go
SMTP接続情報
config/smtpserver.yaml
smtpserver: smtp.gmail.com
smtpport: 587
authaddress: <テストアカウントのメールアドレス>
authpassword: <生成したアプリパスワード>
データ構造
models/models.go
package models
type SmtpServerConfig struct {
SmtpServer string `yaml:"smtpserver"`
SmtpPort string `yaml:"smtpport"`
AuthAddress string `yaml:"authaddress"`
AuthPassword string `yaml:"authpassword"`
}
メール送信機能
util/util.go
package util
import (
"io/ioutil"
"net/smtp"
"strings"
"test/models"
"gopkg.in/yaml.v2"
)
// ---------------------------------------
// SMTPサーバ情報取得
// ---------------------------------------
func SmtpServerConfig() (models.SmtpServerConfig, error) {
var smtpServerInfo []byte
var err error
smtpServerInfo, err = ioutil.ReadFile("config/smtpserver.yaml")
if err != nil {
return models.SmtpServerConfig{}, err
}
var smtpConfig models.SmtpServerConfig
err = yaml.Unmarshal([]byte(smtpServerInfo), &smtpConfig)
if err != nil {
return models.SmtpServerConfig{}, err
}
return smtpConfig, nil
}
// ---------------------------------------
// メール送信
// param1. 送信するメールアドレス string
// param2. 送信するメールの件名 string
// param3. 送信するメールの本文 string
// return: error
// ---------------------------------------
func SmtpSendMail(mailAddress string, mailSubject string, mailBody string) error {
var smtpConn models.SmtpServerConfig
var err error
smtpConn, err = SmtpServerConfig()
if err != nil {
return err
}
// メールの内容を定義
toMailAddress := []string{mailAddress}
// 本文を設定する
var mailBody string
mailMessage := []byte("To: " + mailAddress + "\r\n" +
"Subject: " + mailSubject + "\r\n" +
"\r\n" +
mailBody + "\r\n")
// SMTPサーバ接続
var auth smtp.Auth
auth = smtp.PlainAuth("", smtpConn.AuthAddress, smtpConn.AuthPassword, smtpConn.SmtpServer)
// メール送信
err = smtp.SendMail(smtpConn.SmtpServer+":"+smtpConn.SmtpPort, auth, smtpConn.AuthAddress, toMailAddress, mailMessage)
if err != nil {
return err
}
return nil
}
yaml 記載のSMTP設定ファイルを読み込み、Gmailでメールを送信するやり方でした。
テストなどで、ローカルからメールを飛ばす際に役に立つと思います。
Golang初心者でも簡単に実装できたので、Goが好きになりました。