はじめに
新しいプロダクトを作るたびに「ユーザー登録メール」「パスワードリセット」「ニュースレター配信」の仕組みをどう組むか悩んだことはありませんか。SendGridやMailchimpのような商用SaaSは便利な反面、利用者数やメール送信数が増えるにつれて料金がじわじわと膨らんでいきます。また、ベンダーロックインによって将来的な移行コストが高くなる懸念もあります。
そんな課題を解決してくれるのが、オープンソースのメールプラットフォーム「Plunk」です。トランザクショナルメール、マーケティングキャンペーン、ワークフロー自動化までを1つのプラットフォームにまとめており、セルフホストすることで自社のインフラ上に完全なメール基盤を構築できます。
Plunkとは
Plunkは、SendGrid・Resend・Mailgunなどの商用メールサービスの代替となることを目指して開発された、オープンソース(AGPL-3.0ライセンス)のメールプラットフォームです。APIやSDKを通じてトランザクショナルメールを送信できるだけでなく、ユーザーの行動イベントをトラッキングしてワークフローを自動化する機能も備えています。Dockerイメージが提供されているため、自前のサーバーやクラウド環境に手早くデプロイできる点も魅力です。
主な特徴
- トランザクショナルメール送信 - APIから変数差し込み対応のテンプレートメールを送信できます
- イベントトラッキングとワークフロー - ユーザーの行動(サインアップ、購入など)をイベントとして記録し、条件分岐や遅延を含む自動化フローを組めます
- キャンペーン・セグメント配信 - 配信リストをセグメントで絞り込み、ニュースレターやお知らせを一括配信できます
- 独自ドメイン対応 - DKIM/SPFの設定により、自社ドメインからの送信で到達率を高められます
- セルフホスト可能 - Docker Composeで自社インフラに構築でき、SaaSの利用料や機能制限に縛られません
インストール
Plunkは公式のDockerイメージを使ってセルフホストするのが最も簡単な導入方法です。docker-compose.ymlを用意し、必要な環境変数(データベース接続情報やSMTP設定など)を設定した上で起動します。
# 公式イメージの取得
docker pull ghcr.io/useplunk/plunk:latest
# docker-compose.yml を用意した上で起動
docker compose up -d
詳細な環境変数やデプロイ手順は公式ドキュメント(docs.useplunk.com)に記載されているため、初回構築時は必ず参照してください。ダッシュボードにログインしたら、プロジェクトを作成してAPIキー(sk_から始まるシークレットキー、pk_から始まるパブリックキー)を発行します。
基本的な使い方
Plunkの操作はシンプルなREST APIで完結します。まずはトランザクショナルメールの送信から見ていきましょう。認証はAuthorization: Bearer <APIキー>ヘッダーで行います。
// トランザクショナルメールを送信する
async function sendWelcomeEmail(to: string, apiKey: string) {
const response = await fetch("https://api.useplunk.com/v1/send", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${apiKey}`,
},
body: JSON.stringify({
to,
subject: "ご登録ありがとうございます",
body: "<p>アカウント登録が完了しました。ぜひご活用ください。</p>",
}),
});
if (!response.ok) {
throw new Error(`メール送信に失敗しました: ${response.status}`);
}
return response.json();
}
続いて、ユーザーの行動をイベントとしてトラッキングする例です。パブリックキー(pk_)を使えば、フロントエンドから直接呼び出すこともできます。
// ユーザーのサインアップイベントを記録する
async function trackSignupEvent(email: string, publicKey: string) {
const response = await fetch("https://api.useplunk.com/v1/track", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${publicKey}`,
},
body: JSON.stringify({
email,
event: "signed_up",
}),
});
return response.json();
}
トラッキングしたイベントはダッシュボード上でワークフローのトリガーとして使えます。「signed_upイベントを受け取ったら3日後にオンボーディングメールを送る」といった自動化を、コードを書かずに設定できるのが便利なところです。
実践的なユースケース
実際のプロダクト開発では、以下のような組み合わせでPlunkを活用できます。
1. ユーザーオンボーディングの自動化
サインアップ直後にウェルカムメールを送り、signed_upイベントをトラッキングしておけば、「3日以内にログインしなかったユーザーにリマインドメールを送る」といったワークフローをダッシュボード上で構築できます。エンジニアがバッチ処理を書かなくても、マーケティング担当者がフローを調整できる点は大きなメリットです。
2. サーバーサイドからの通知メール共通化
パスワードリセットや請求書送付など、バックエンドの各所に散らばりがちな通知メール処理を、Plunkの/v1/sendエンドポイントに集約できます。テンプレートをPlunk側で管理すれば、文面修正のたびにアプリケーションをデプロイし直す必要もなくなります。
// 汎用的な通知メール送信関数として共通化する例
async function notifyByEmail(
to: string,
subject: string,
htmlBody: string,
apiKey: string,
) {
const res = await fetch("https://api.useplunk.com/v1/send", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${apiKey}`,
},
body: JSON.stringify({ to, subject, body: htmlBody }),
});
if (!res.ok) {
console.error("通知メールの送信に失敗しました", await res.text());
}
}
3. セルフホストによるコストコントロール
送信数が伸びるスタートアップやサイドプロジェクトでは、SaaSの従量課金が予算を圧迫しがちです。PlunkをDockerで自社インフラに構築しておけば、送信数の増加によるコスト増を気にせずメール基盤を運用できます。
まとめ
Plunkは、トランザクショナルメールの送信からイベントトラッキング、ワークフロー自動化、キャンペーン配信までを1つのオープンソースプラットフォームにまとめたツールです。REST APIはシンプルで、テンプレート機能やワークフローを使えばコードを増やさずに通知フローを拡張できます。セルフホストによってSaaSのコストやロックインから解放されたい方は、まずDockerで手元の環境に立ち上げて、/v1/sendと/v1/trackから試してみてはいかがでしょうか。