LoginSignup
2
1

More than 1 year has passed since last update.

Golangを使ってローカル環境からGmailを送信する

Last updated at Posted at 2023-04-24

こんにちは。
Golang では"net/smtp"パッケージを使用して、
簡単にローカル環境からメール送信できる機能が実装できます。
掲題の通り、Golangを使ってローカル環境からGmailを送信する方法を記載します。


■やること

  1. GooogleテストアカウントのGmail設定
  2. 実装

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が好きになりました。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1