OSSのニュースレターツール比較:Listmonk vs Mautic vs Postal でMailchimp代替をセルフホストする
オープンソースラボ編集部 ・ 2026年6月13日
OSSのニュースレターツール比較:Listmonk vs Mautic vs Postal でMailchimp代替をセルフホストする
Mailchimp(月$13〜・コンタクト数制限)・ConvertKit(月$29〜)・SendGrid(月$19.95〜)に対して、Listmonk(最も軽量・高速なOSSニュースレター配信)・Mautic(マーケティングオートメーション統合)・Postal(セルフホストSMTPサーバー)はOSSのメールマーケティング・ニュースレターツールです。
OSSニュースレターツールを選ぶ理由
- コスト: Mailchimpは50,000コンタクトで月$350。Listmonkセルフホストならインフラ代のみ
- データ主権: 購読者のメールアドレスを自社DBに保管
- 配信制限なし: SaaS版のような月間送信数上限がない
- カスタマイズ: 登録フォーム・メールテンプレート・トラッキングURLを完全カスタム
主要ツールの概要
Listmonk
2019年に公開されたGo製のOSSニュースレター・バルクメール管理システムです。GitHubスター15k+。シングルバイナリで動作・PostgreSQLだけで動く最軽量のニュースレターツールで、登録者管理・キャンペーン作成・テンプレートエンジン・開封率/クリック率トラッキング・セグメント配信・APIを備えます。Amazon SES・Postmark・SendGrid等のSMTPリレーと組み合わせて使います。
# Listmonk をDockerで起動
mkdir listmonk && cd listmonk
curl -OL https://raw.githubusercontent.com/knadh/listmonk/master/docker-compose.yml
curl -OL https://raw.githubusercontent.com/knadh/listmonk/master/config.toml.sample
cp config.toml.sample config.toml
# config.toml を編集 (DB設定・SMTPなど)
# database.host = "listmonk_db"
# database.name = "listmonk"
docker compose up -d
# WebUI: http://localhost:9000
# 初回起動後: docker compose run --rm app ./listmonk --install
# config.toml - Listmonkの設定
[app]
address = "0.0.0.0:9000"
admin_username = "admin"
admin_password = "your-secure-password"
[db]
host = "listmonk_db"
port = 5432
user = "listmonk"
password = "listmonk_password"
database = "listmonk"
# Amazon SES でメール送信(高配信率・低コスト)
[[smtp]]
enabled = true
host = "email-smtp.ap-northeast-1.amazonaws.com"
port = 587
auth_protocol = "login"
username = "AKIAIOSFODNN7EXAMPLE"
password = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
email_headers = []
max_conns = 10
max_msg_retries = 2
idle_timeout = "15s"
wait_timeout = "5s"
tls_type = "STARTTLS"
# Listmonk REST APIでキャンペーンを自動作成
import httpx
LISTMONK_URL = "http://localhost:9000"
AUTH = ("admin", "your-secure-password")
# 購読者を一括インポート(CSVから)
def import_subscribers(csv_file_path: str):
with open(csv_file_path, 'rb') as f:
response = httpx.post(
f"{LISTMONK_URL}/api/import/subscribers",
auth=AUTH,
files={"file": ("subscribers.csv", f, "text/csv")},
data={
"mode": "subscribe",
"lists": "[1]", # リストID 1 に追加
"overwrite": "true",
}
)
return response.json()
# キャンペーンを作成して送信
def create_campaign(
subject: str,
body: str,
list_ids: list[int],
from_email: str = "newsletter@yourcompany.com",
):
# キャンペーン作成
response = httpx.post(
f"{LISTMONK_URL}/api/campaigns",
auth=AUTH,
json={
"name": subject,
"subject": subject,
"lists": list_ids,
"from_email": f"YourCompany Newsletter <{from_email}>",
"body": body,
"content_type": "richtext",
"messenger": "email",
"type": "regular",
}
)
campaign = response.json()["data"]
campaign_id = campaign["id"]
# 送信開始
httpx.put(
f"{LISTMONK_URL}/api/campaigns/{campaign_id}/status",
auth=AUTH,
json={"status": "scheduled"},
)
return campaign_id
# 統計を取得(開封率・クリック率)
def get_campaign_stats(campaign_id: int):
response = httpx.get(
f"{LISTMONK_URL}/api/campaigns/{campaign_id}",
auth=AUTH,
)
data = response.json()["data"]
return {
"sent": data["sent"],
"opens": data["views"],
"clicks": data["clicks"],
"open_rate": round(data["views"] / data["sent"] * 100, 1) if data["sent"] > 0 else 0,
"click_rate": round(data["clicks"] / data["sent"] * 100, 1) if data["sent"] > 0 else 0,
}
// Next.js でListmonkのサブスクライブAPIを呼び出すフォームコンポーネント
// app/api/subscribe/route.ts
export async function POST(req: Request) {
const { email, name } = await req.json();
if (!email || !email.includes("@")) {
return Response.json({ error: "Invalid email" }, { status: 400 });
}
// Listmonk APIに購読者を追加
const response = await fetch(`${process.env.LISTMONK_URL}/api/subscribers`, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Basic ${Buffer.from(
`${process.env.LISTMONK_USER}:${process.env.LISTMONK_PASS}`
).toString("base64")}`,
},
body: JSON.stringify({
email,
name: name || email.split("@")[0],
status: "enabled",
lists: [parseInt(process.env.LISTMONK_LIST_ID || "1")],
preconfirm_subscriptions: false, // ダブルオプトインを有効化
}),
});
if (!response.ok) {
const err = await response.json();
if (err.message?.includes("already exists")) {
return Response.json({ message: "Already subscribed" });
}
return Response.json({ error: "Failed to subscribe" }, { status: 500 });
}
return Response.json({ message: "Confirmation email sent!" });
}
Mautic
2014年に公開されたPHP/Symfony製のOSSマーケティングオートメーションプラットフォームです。GitHubスター7k+。メール・SMS・プッシュ通知・ソーシャルメディアを統合したマーケティングオートメーションで、リードスコアリング・キャンペーン自動化・ランディングページ作成・A/Bテスト・詳細分析を備えます。HubSpotの代替として中〜大規模マーケティングチームに向いています。
# Mautic をDockerでセルフホスト
git clone https://github.com/mautic/docker-mautic
cd docker-mautic
cp .env.example .env
# .env でDB・SMTP・サイトURLを設定
docker compose up -d
# WebUI: http://localhost (初回セットアップウィザード)
機能比較表
| 比較項目 | Listmonk | Mautic | Postal |
|---|---|---|---|
| 主な用途 | ニュースレター・バルクメール | マーケティングオートメーション | SMTPサーバー |
| セットアップ | 最も簡単 | 複雑 | 中 |
| リードスコアリング | ❌ | ✅ | ❌ |
| A/Bテスト | ❌ | ✅ | ❌ |
| ランディングページ | ❌ | ✅ | ❌ |
| メモリ使用量 | 50MB〜 | 512MB〜 | 256MB〜 |
| GitHub Stars | 15k+ | 7k+ | 14k+ |
ListmonkのSMTP配信にはDevOpsカテゴリ/categories/devopsのPostal(セルフホストSMTPサーバー)かAmazon SESを使って高配信率を確保します。購読者をLPから集めるフォームはLow-codeカテゴリ/categories/low-codeのFormbricksやTally等のOSSフォームビルダーと組み合わせます。
FAQ
Q. ListmonkのメールをAmazon SESで送信するときの設定は?
A. SESをSMTPリレーとして使います。①AWS Console → SES → SMTP settings → Create SMTP credentialsでIAMユーザーとパスワードを作成②Listmonkのconfig.tomlのsmtpセクションにSESのSMTPホスト・ポート・認証情報を設定③SES本番環境リクエスト: デフォルトはSandboxモードで認証済みアドレスにしか送れないため、Production Access申請が必要④バウンス・クレームハンドリング: SESのSNSトピックをListmonkのバウンスエンドポイント(/webhooks/service/ses)に向けるとバウンスが自動処理される。SESの料金: 1,000通あたり$0.10。月50万通で$50。Mailchimpの同規模プランより90%以上安い。
Q. Listmonkでダブルオプトイン(確認メール)を設定するには?
A. Listmonk WebUI → Settings → Subscription confirmation で設定します。①preconfirm_subscriptions: falseでAPIから登録(確認メール送信)②確認URLをクリックで購読確定③確認メールのテンプレートはListmonk WebUI → Email Templates → Double opt-in emailからカスタマイズ。Next.jsのAPIルートからはpreconfirm_subscriptions: falseで登録すると自動的に確認メールが送信されます。GDPRのオプトイン要件に対応するにはダブルオプトインが必須です。
Q. MauticとListmonkの使い分けはどうすればいいですか?
A. Listmonkを選ぶケース: ①定期ニュースレター・広告メールの一斉配信②購読者数は多いが自動化は不要③エンジニアがAPIでコントロールしたい④軽量サーバー(256MB)で動かしたい。Mauticを選ぶケース: ①リード獲得からナーチャリング→成約までの自動化②Webサイト訪問者のトラッキングとスコアリング③メール・SMS・プッシュ通知の統合マーケティング④HubSpot・Marketoの代替を探している。両方使うケースも多く、Mauticでリードをセグメントして、Listmonkで配信するという構成もあります。
Q. ListmonkのAPIでNext.jsのニュースレター登録フォームをビルドするには?
A. サーバーサイドAPIルートを経由してListmonkに登録するのが安全です(APIキーをクライアントに露出させない)。app/api/subscribe/route.tsでPOST受信→Listmonk APIに登録→成功レスポンスを返すパターンが標準です。ダブルオプトインを有効にするにはpreconfirm_subscriptions: falseにします。フロントエンドのサクセス表示: 「確認メールを送信しました。メールボックスを確認してください」のメッセージをReact Stateで制御します。reCAPTCHAを追加するにはGoogle reCAPTCHA v3をサーバーサイドで検証してからListmonkを呼びます。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| ニュースレター配信・軽量・Mailchimp代替 | Listmonk |
| マーケティングオートメーション・HubSpot代替 | Mautic |
| セルフホストSMTP・高配信率 | Postal |