はじめに
Docker環境で構築したGoからメール送信する方法をご紹介します。
メールサーバーには、開発環境でメール送信を確認できるmailhogを使用します。
メール送信には標準パッケージのnet/smtpを用います。
今回の実装以外にもいろいろ追加していますが、
下記でメール送信を実装しているので参考にしてみてください!
GitHub - shungo0525/doker_go
Contribute to shungo0525/doker_go development by creating an account on GitHub.
コード
ファイル構成
./root_dir
├─ app
│ ├─ main.go
│ ├─ go.mod
│ └─ go.sum
├─ docker-compose.yml
└─ Dockerfile
Dockerfile
とりあえずGoが使える環境を構築します。
FROM golang:1.19-alpine
RUN apk update && apk add git
# appディレクトリの作成
RUN mkdir /go/src/app
# ワーキングディレクトリの設定
WORKDIR /go/src/app
docker-compose.yml
開発環境用のメールサーバーであるmailhogを使用します。
service名のmailhogとSMPTポートである1025はメール送信するときに指定します。
version: '3'
services:
app:
build: .
tty: true
volumes:
- ./app:/go/src/app
depends_on:
- mysql
ports:
- 8000:8000
mailhog:
image: mailhog/mailhog:latest
ports:
- "8025:8025" # MailhogのWebとAPI用のポート
- "1025:1025" # SMTPポート
main.go
docker-compose.yml
で指定したservice名のmailhogをhostnameに、portを1025に指定します。
docker-compose.yml
の値とここで指定する値が異なるとメール送信できないので注意しましょう。
送信元、送信先、メッセージ内容は必要に応じて変更してください。
package main
import (
"fmt"
"net/smtp"
"os"
"strings"
)
var (
hostname = "mailhog" // docker-composeで指定したサービス名
port = 1025 // mailhogのSMPTポート
username = "user@example.com"
password = "password"
from = "from@example.net"
subject = "hello"
body = "Hello World!"
receiver = []string{"receiver@example.com"}
)
func main() {
SendEmail()
}
func SendEmail() {
smtpServer := fmt.Sprintf("%s:%d", hostname, port)
auth := smtp.CRAMMD5Auth(username, password)
msg := []byte(fmt.Sprintf("To: %s\nSubject: %s\n\n%s", strings.Join(receiver, ","), subject, body))
if err := smtp.SendMail(smtpServer, auth, from, receiver, msg); err != nil {
fmt.Fprintln(os.Stderr, err)
}
}
メール送信
コンテナに入りmain.goを実行
コンテナに入ってmain.go
を実行することで、SendEmail()
が実行されメール送信されます。
% dc exec app sh
# go run main.go
mailhogで送信されたメールを確認
http://localhost:8025/を開くとMailhogでローカル環境で送信したメールを確認することができます。
クリックすると送信内容の詳細を確認することができます。
コメント