Go 言語による軽量 SMTP サービス Hectane のセットアップと構成方法

Hectane は、Go 言語で実装された最小限の SMTP メール送信サービスです。外部依存を極力抑え、設定駆動型の動作を前提として設計されています。以下に、インストールから初期構成までの実践的な手順を示します。

ディレクトリ構成の概要

ソースコードの階層は明確に責務を分離しており、保守性と拡張性を重視しています:

hectane/
├── cmd/
│   └── mailer/              # CLI 実行バイナリのエントリポイント(名前は 'hectane' ではなく 'mailer' に変更可能)
├── conf/                    # 環境別 TOML 設定ファイル群
│   ├── dev.toml             # 開発用:ローカル SMTP(例: MailHog)向け
│   ├── prod.toml            # 本番用:TLS 対応 SMTP サーバー接続設定
├── core/                    # メール送信コアロジック(トランスポート、キュー制御、エラーハンドリング)
├── util/                    # 汎用ユーティリティ(TOML 解析、構造体バインド、時刻フォーマット)
├── app.go                   # アプリケーションライフサイクル管理(初期化・シャットダウンフック含む)
├── runner.go                # CLI コマンド実行器(cobra をベースにカスタマイズ)
├── go.sum
└── go.mod

起動フローの理解

実行時のエントリは cmd/mailer/main.go であり、以下のステップで処理が進行します:

  1. コマンドライン引数(--config, --mode)をパース
  2. conf.Load() を呼び出して指定された TOML ファイルを構造体にマッピング
  3. core.NewTransport() で SMTP 接続プールを初期化
  4. HTTP API(オプション)または CLI モードで即時送信を開始

TOML 設定ファイルの実装例

以下は conf/prod.toml の実際のバリデーション済みサンプルです。セキュリティ上、パスワードは環境変数経由での注入が推奨されます:

[smtp]
server = "smtp.gmail.com"
port = 587
username = "${SMTP_USER}"
password = "${SMTP_PASS}"
timeout = "30s"

[queue]
workers = 8
buffer_size = 128
backoff_base = "2s"

[log]
level = "warn"
output = "stderr"
timestamp = true

[http]
enabled = true
address = ":9001"
read_timeout = "10s"
write_timeout = "15s"

環境変数展開は util/tomlenv パッケージによりサポートされており、Docker や systemd 環境でも安全に利用可能です。

タグ: Go SMTP TOML CLI mail-server

8月20日 06:29 投稿