AI

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 (初回セットアップウィザード)

機能比較表

比較項目ListmonkMauticPostal
主な用途ニュースレター・バルクメールマーケティングオートメーションSMTPサーバー
セットアップ最も簡単複雑
リードスコアリング
A/Bテスト
ランディングページ
メモリ使用量50MB〜512MB〜256MB〜
GitHub Stars15k+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

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。