1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SendGrid を Mailpit で確認する

Posted at

やりたいこと

SendGrid を使ったシステムがいくつかあるのですが、開発環境でのテストやシミュレートをうまくやりたいな、とずっと思っていました。

できれば UI 部分は Mailpit を使いたい。
でもプログラムは可能な限り修正したくない。たとえば開発環境だけは SendGrid ではなく SMTP 送信にする、というのは避けたかったのです。

できた

sendgrid-dev は SendGrid API を受け取り、SMTPサーバーにメール送信する Go プログラムです。

SendGrid ではなく、この sendgrid-dev にメール送信 API をなげるようにすれば、sendgrid-dev が SMTP サーバー( Mailpit) にメールを送ります。私は Mailpit のウェブUIでメールを確認できます。

dockerfiles/sendgrid/Dockerfile
FROM golang:1.21-bullseye

# 作業ディレクトリを設定
WORKDIR /app

# 必要なパッケージをインストール
RUN apt-get update && apt-get install -y \
    git \
    && rm -rf /var/lib/apt/lists/*

# sendgrid-dev リポジトリをクローン
RUN git clone https://github.com/yKanazawa/sendgrid-dev.git .

# 依存関係をダウンロード
ENV GOPROXY=https://goproxy.io,direct
RUN go mod download -x

# ビルド
RUN env GOOS=linux GOARCH=amd64 go build -o sendgrid-dev main.go

# 実行コマンドを設定
CMD ["./sendgrid-dev"]
docker-compose.yml
  sendgrid-dev:
    build: ./dockerfiles/sendgrid
    container_name: sendgrid
    hostname: sendgrid-server
    ports:
      - "3030:3030"
    environment:
      - SENDGRID_DEV_API_SERVER=:3030
      - SENDGRID_DEV_API_KEY=SG.xxxxx
      - SENDGRID_DEV_SMTP_SERVER=mail-server:1025
      - SENDGRID_DEV_SMTP_USERNAME=username
      - SENDGRID_DEV_SMTP_PASSWORD=password

  mailpit:
    image: axllent/mailpit
    container_name: mailpit
    hostname: mail-server
    restart: unless-stopped
    volumes:
      - ./data/mailpit:/data
    ports:
      - 8025:8025
      - 1025:1025
    environment:
      MP_MAX_MESSAGES: 5000
      MP_DATABASE: /data/mailpit.db
      MP_SMTP_AUTH_ACCEPT_ANY: 1
      MP_SMTP_AUTH_ALLOW_INSECURE: 1

確認用のコマンド

Dockerホストから
$ curl --request POST \
          --url http://localhost:3030/v3/mail/send \
          --header 'Authorization: Bearer SG.xxxxx' \
          --header 'Content-Type: application/json' \
          --data '{"personalizations": [{
        "to": [{"email": "to@example.com"}]}],
        "from": {"email": "from@example.com"},
        "subject": "Test Subject",
        "content": [{"type": "text/plain", "value": "Test Content"}]
      }'
他のDockerコンテナから
$ curl --request POST \
          --url http://sendgrid-server:3030/v3/mail/send \
          --header 'Authorization: Bearer SG.xxxxx' \
          --header 'Content-Type: application/json' \
          --data '{"personalizations": [{
        "to": [{"email": "to@example.com"}]}],
        "from": {"email": "from@example.com"},
        "subject": "Test Subject",
        "content": [{"type": "text/plain", "value": "Test Content"}]
      }'

Mailpit での確認

すてき!

調査経緯

問題意識にあった記事をみつける

あるとき以下の記事をみつけました。

冒頭の問題意識をずっともっていた私はすぐに読んでみました。

この方と問題意識は同じでしたし、Dockerイメージまで公開されていたので大変うれしかったのですが、その DockerイメージにはメールウェブUI に Maildev というのが使われていました。

Mailpit がいいなぁ、Mailpit が今はお気に入りなんだよなぁ

と思いました。

よく読んでみますと、

  • SendGrid API の受け口は sendgrid-dev
  • SMTP の受け口とメール一覧のUIは Maildev

と明確に分離されていましたので、sendgrid-dev のみの Dockerイメージを作ればいいのだな、と思いました。

sendgrid-dev の Dockerイメージを作る

もうゼロから Dockerfile をつくるの、面倒になりました。perplexity.ai に聞いて作りました。

dockerfiles/sendgrid/Dockerfile(perplexity.aiによる提案)
# Golang の公式イメージを使用(1.21以上)
FROM golang:1.21-bullseye

# 作業ディレクトリを設定
WORKDIR /app

# 必要なパッケージをインストール
RUN apt-get update && apt-get install -y \
    git \
    && rm -rf /var/lib/apt/lists/*

# sendgrid-dev リポジトリをクローン
RUN git clone https://github.com/yKanazawa/sendgrid-dev.git .

# 依存関係をダウンロード
RUN go mod download

# 実行コマンドを設定
CMD ["go", "run", "main.go"]

問題点は2つありました。

  1. docker-compose build で、go mod download の途中でタイムアウトしてしまう場合がある
  2. docker-compose up で、結構待たないと SendGrid API リクエストを受け付けてくれない

そこで、1. は GoProxy を変更する、2. はプログラムをビルドしておく、ということで対応しました。

dockerfiles/sendgrid/Dockerfile(完成版)
FROM golang:1.21-bullseye

# 作業ディレクトリを設定
WORKDIR /app

# 必要なパッケージをインストール
RUN apt-get update && apt-get install -y \
    git \
    && rm -rf /var/lib/apt/lists/*

# sendgrid-dev リポジトリをクローン
RUN git clone https://github.com/yKanazawa/sendgrid-dev.git .

# 依存関係をダウンロード
ENV GOPROXY=https://goproxy.io,direct
RUN go mod download -x

# ビルド
RUN env GOOS=linux GOARCH=amd64 go build -o sendgrid-dev main.go

# 実行コマンドを設定
#CMD ["go", "run", "main.go"]
CMD ["./sendgrid-dev"]

ありがとうございました!

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?