はじめに
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
└─ DockerfileDockerfile
とりあえずGoが使える環境を構築します。
FROM golang:1.19-alpine
RUN apk update && apk add git
# appディレクトリの作成
RUN mkdir /go/src/app
# ワーキングディレクトリの設定
WORKDIR /go/src/appdocker-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.gomailhogで送信されたメールを確認
http://localhost:8025/を開くとMailhogでローカル環境で送信したメールを確認することができます。

クリックすると送信内容の詳細を確認することができます。

