ブログに戻る
セキュリティ

使い捨てメールドメインリスト:ブロック方法

Josselin Liebe
Josselin Liebe

製品が無料プランを提供すると、偽の登録が増えます。ほとんどのチームは、メールのバウンス率が上がったり、トライアルから有料への転換率が理由もなく下がったり、紹介クレジットが悪用されたりしたときに初めて問題に気づきます。そのころには、すでに被害が生じています。

私たちはフリーミアム製品を運営するB2B SaaS企業と協力しました。しっかりとしたオンボーディングフロー、効果的なアクティベーションメール、構造化されたドリップシーケンスを備えていました。しかし何も期待通りに機能していませんでした。登録データを一緒に確認すると、8件に1件近くの新規アカウントが使い捨てメールアドレスで作られていることがわかりました。Veille APIを使って登録時に使い捨てメール検出を追加した後、最初の月で偽の登録が10%以上減少しました。転換率の指標が再び意味のある数字になり、メールのパフォーマンスデータがようやく現実を反映するようになりました。

このガイドでは、その検出レイヤーの構築方法を説明します。どのオープンソースのブロックリストが役立つか、どこで限界があるか、そしてリアルタイムのAPI検査と組み合わせて登録フローをクリーンに保つ方法です。

使い捨てメールドメインとは?

使い捨てメールドメインは、オンデマンドでメールボックスを作成するサービスが所有するドメインです。アカウント作成は不要です。身元確認もありません。ユーザーは数秒で機能するアドレスを取得します。メールボックスは数分または数時間後に消え、時間制限がない場合もあります。ウェルカムメールを送る前に、アドレスはすでに消えているか放棄されています。

最もよく知られているサービスには、Mailinator、Guerrilla Mail、YOPmail、10MinuteMail、Temp-Mailがあります。しかし、これらは最も目立つものに過ぎません。明らかなサービスを狙うブロックリストを避けるために作られたドメインを含め、より小さく知名度の低いプロバイダーが何百もあります。

使い捨てメールを使うすべての人がプラットフォームを悪用しようとしているわけではありません。プライバシーを重視するユーザー、統合をテストする開発者、マーケティングメールを避けたい人には、一時的なアドレスを使う正当な理由があります。問題は、悪意のある人物 - 複数の偽アカウントを作ったり、無料トライアルを繰り返し利用したり、紹介プログラムを悪用したりする人 - も使い捨てメールを使うという点です。そして彼らは後からフィルタリングするのがずっと難しいです。

重要なポイント:使い捨てメールは配信可能性の問題ではなく、登録の問題です。バウンス、送信者スコアのダメージ、受信ボックスへの到達率の低下は結果であって原因ではありません。登録フォームで問題を止める方が、数週間後にメール分析から問題を診断するよりずっと良いです。

使う価値があるブロックリスト

GitHubにはコミュニティが管理する複数のリストがあります。カバーするドメイン数、更新頻度、精度が異なります。

disposable-email-domains/disposable-email-domains

証拠を要求するコミュニティの貢献によって更新される約4,000のドメインです。慎重な選択肢です。誤検知は少ないですが、完全なカバレッジではありません。初めて設定する場合の良い出発点です。

disposable/disposable-email-domains

毎日自動更新される約100,000のドメインです。より広いカバレッジですが精度は低めです。一部のエントリには、真の意味での使い捨てではないプライバシーサービスが含まれています。誤検知よりも見逃しの方がコストが高い高リスクプラットフォーム - ゲームプラットフォーム、クーポンサイト、暗号通貨サービスなど - に適しています。

7c/fakefilter

約5,000のドメインで、毎日更新され、各エントリがその出典にリンクされています。ドメインがリストされている理由を追跡できるため、実際のユーザーがブロックされたケースを調査するときに役立ちます。

FGRibreau/mailchecker

Node.js、PHP、Rubyなど複数の言語向けのライブラリとして利用できます。生のテキストファイルより統合されたライブラリを好む場合の良い選択肢です。

これらのリストはどれも完全ではありません。最も一般的なプロバイダーをカバーし、ある程度最新の状態を保っていますが、常に新しいサービスより遅れています。

ブロックすべき主要な使い捨てドメイン

適切な検出システムを構築する間、すぐに使える出発点が必要な場合、これらのドメインは偽の登録活動でよく見られます。

mailinator.com
guerrillamail.com
temp-mail.org
yopmail.com
10minutemail.com
trashmail.com
emailondeck.com
maildrop.cc
sharklasers.com
guerrillamailblock.com
grr.la
mailnesia.com
getnada.com
mohmal.com
throwam.com
dispostable.com
tempail.com
fakeinbox.com
throwaway.email
tempinbox.com

このリストは一時的な対策であり、長期的な解決策ではありません。新しい使い捨てドメインは毎週登場します。すぐに消えるものもあれば、数ヶ月間活動を続けるものもあります。一度作ってそのまま更新しないリストは、最終編集後に作られたものをすべて見逃します。

静的リストが時間とともに古くなる理由

使い捨てメールサービスが変化しています。多くのサービスが今やRESTまたはGraphQL APIを提供しており、ブラウザを開かずに自動で新しいメールアドレスを作れるようになっています。新しい使い捨てドメインは登録後1時間以内にメールを受信できる状態になることがあり、どの公開リストにも載る前です。

既存のサービスをまったく使わない攻撃者もいます。代わりに、低コストのドメインを登録し、基本的なメールサーバー設定を行い、アドレスを1回使って次に移ります。これらのドメインはどの静的リストの検査でも合法に見えます。検出する唯一の方法は、DNS設定、ドメインが登録された時期、メールサーバーが正しく応答するかどうかといったシグナルを分析することです。

ここで静的リストは限界に達します。既知のプロバイダーを遅延なくブロックするのには効果的です。チェックは既知の値のセットを検索するだけだからです。しかし、1回限りのカスタムドメインや新しく作られたサービスは対応できません。

Veille APIによるリアルタイム検出

Veille メール検証API(GET /v1/intelligence/email)は、継続的に更新される100,000以上の既知の使い捨てドメインのデータベースと、ライブDNSおよびメールサーバー分析を組み合わせてメールアドレスを確認します。返す情報:

  • disposable - ドメインが既知の使い捨てプロバイダーである場合 true
  • risk_score - 0(安全)から100(高リスク)のスコアで、利用可能なすべてのシグナルを組み合わせます
  • role_account / role_type - info@noreply@admin@ などの共有メールボックスを検出します
  • dns.mx - ドメインに有効なメールサーバーが設定されているかどうか
  • smtp_valid - 特定のメールボックスがメールを受信できるかどうか(qualification_check=true が必要)

risk_score フィールドは細かい判断をするのに最も役立ちます。単純にブロックまたは許可するのではなく、しきい値を設定できます。スコアが低ければ通過させ、中程度なら追加認証を求め、高ければフォームで直接拒否します。

使い捨てメールのブロックを実装する方法

Python - 静的ブロックリストの確認

GitHubからリストをダウンロードしてメモリに保存します。アプリケーションの起動時、またはスケジュールに従って一度だけ行い、リクエストごとには行いません。

import requests

BLOCKLIST_URL = (
    "https://raw.githubusercontent.com/"
    "disposable-email-domains/disposable-email-domains/"
    "refs/heads/main/disposable_email_blocklist.conf"
)

def load_blocklist() -> set[str]:
    response = requests.get(BLOCKLIST_URL, timeout=10)
    return set(response.text.strip().splitlines())

DISPOSABLE_DOMAINS = load_blocklist()

def is_known_disposable(email: str) -> bool:
    domain = email.rsplit("@", 1)[-1].lower()
    return domain in DISPOSABLE_DOMAINS

スケジュールされたタスクを使って週1回リストを更新します。リストは古いバージョンが実際の悪用を見逃すほど十分に変化しますが、継続的な更新が必要なほど頻繁には変わりません。

Python - リアルタイム検出のためのVeille API使用

import requests

API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.veille.io/v1"

def validate_email(email: str) -> dict:
    response = requests.get(
        f"{BASE_URL}/intelligence/email",
        params={"query": email},
        headers={"x-api-key": API_KEY},
        timeout=3,
    )
    response.raise_for_status()
    return response.json()

def signup_gate(email: str) -> tuple[bool, str]:
    data = validate_email(email)

    if data["disposable"]:
        return False, "Please use a permanent email address to sign up."

    if data["risk_score"] >= 75:
        return False, "We could not verify this email address. Please try a different one."

    return True, ""

TypeScript - Express用バリデーションミドルウェア

import express, { Request, Response, NextFunction } from "express";

const API_KEY = "YOUR_API_KEY";
const BASE_URL = "https://api.veille.io/v1";

interface EmailValidation {
  disposable: boolean;
  risk_score: number;
  smtp_valid: boolean;
}

async function validateEmailMiddleware(
  req: Request,
  res: Response,
  next: NextFunction
): Promise<void> {
  const { email } = req.body as { email: string };

  try {
    const response = await fetch(
      `${BASE_URL}/intelligence/email?query=${encodeURIComponent(email)}`,
      { headers: { "x-api-key": API_KEY }, signal: AbortSignal.timeout(3000) }
    );

    const data = (await response.json()) as EmailValidation;

    if (data.disposable || data.risk_score >= 75) {
      res.status(422).json({ error: "This email address cannot be used for registration." });
      return;
    }

    next();
  } catch {
    // If the API is unreachable, allow the request through and log the failure
    console.warn(`[veille] email validation failed for ${email}, allowing through`);
    next();
  }
}

const app = express();
app.use(express.json());
app.post("/auth/signup", validateEmailMiddleware, (req, res) => {
  res.json({ status: "ok" });
});

重要な実装上の注意:検証APIに到達できない場合やエラーが返った場合は、リクエストを通過させます。ネットワークの問題でユーザーをブロックしないでください。失敗をログに記録し、該当の登録を別途確認します。

バリデーションを追加する場所

登録フォームが最も重要な場所ですが、唯一の場所ではありません。

  • メール変更フロー - 既存ユーザーが使い捨てアドレスに切り替えようとするのは警告サインです
  • ウェイトリストとアーリーアクセスの登録フォーム
  • クーポンとプロモーションコードフォーム
  • 紹介プログラムへの登録

使い捨てアドレスを早く検出するほど、後でデータを整理する作業が少なくなります。

誤検知を避ける方法

一部の正当なサービスは使い捨てに似たメールアドレスを生成します。Apple Hide My Email、Firefox Relay、Proton Mailのエイリアス、SimpleLogin、addy.ioはすべて、特殊なパターンの転送アドレスを作ります。過度に厳しいブロックリストはこれらを誤ってブロックする場合があります。

重要な違い:これらのアドレスは、プライバシーを守ることを選んだ実際の人が所有する実際のメールボックスに転送されます。これらのユーザーをブロックすることは、詐欺を防ぐのではなく、実際の顧客を失うことを意味します。

2つのステップでこの問題を避けられます。まず、既知のプライバシーリレーサービスのリストを管理し、それらのドメインに対してはすべての検査をスキップします。

PRIVACY_RELAY_DOMAINS = {
    "privaterelay.appleid.com",
    "relay.firefox.com",
    "simplelogin.co",
    "addy.io",
    "anonaddy.com",
}

def should_skip_check(email: str) -> bool:
    domain = email.rsplit("@", 1)[-1].lower()
    return domain in PRIVACY_RELAY_DOMAINS

次に、単純なドメインマッチングではなく risk_score のしきい値を使います。既知のプライバシーサービスからの転送アドレスは通常スコアが低いです。先週作られた未知の使い捨てドメインはスコアが高くなります。この2つのスコアの差こそVeille APIが最も価値を発揮する部分です。

ブロックロジックを本番環境で有効にする前に、1週間テストモードで実行します。実際にリクエストを拒否せず、ブロックされたはずのものをログに記録します。結果を手動で確認します。ログに実際のユーザーが見つかった場合は、しきい値を調整します。

レイヤードアプローチ

単一の検査だけでは不十分です。信頼性の高い設定は複数のレイヤーを組み合わせます。

  1. プライバシーリレー許可リスト - 最初に確認し、これらのドメインのアドレスは他のすべての検査をスキップします
  2. 静的ブロックリスト - 高速な検索で、最もよく知られた使い捨てプロバイダーを即座にブロックします
  3. Veille API - 静的リストを通過したすべてのものをリアルタイムで検査し、disposabledns.mxrisk_score を使います
  4. 登録後の行動 - メールを一度も開かず、オンボーディングを完了せず、7日後も活動のないアカウントは、最初の検査をどう通過したかに関わらず確認する必要があります

意思決定ロジック:

シグナル アクション
プライバシーリレー許可リストのドメイン 許可
静的ブロックリストのドメイン 登録フォームで拒否
APIからの disposable: true 登録フォームで拒否
risk_score ≥ 75 登録フォームで拒否
risk_score 50–74 許可して手動確認のためにフラグ
7日後も活動なし アーカイブしてアクティブリストから削除

よくある質問

ブロックリストはどのくらいの頻度で更新すべきですか?

ほとんどのチームには週1回で十分です。最新バージョンをダウンロードしてメモリに再読み込みする自動タスクを設定します。更新頻度を上げてもほとんど効果はなく、頻度を下げると新たに特定されたプロバイダーを見逃します。

info@company.com のようなロールベースのアドレスをブロックすべきですか?

製品によります。消費者向けの登録では、info@admin@ のような共有アドレスは低品質なリードや共有メールボックスのサインであることが多いです。ビジネス向け製品では、これが企業の唯一の公開アドレスである場合があります。Veille APIの role_account フィールドを使って、直接ブロックするのではなく別途フラグを立て、別のオンボーディングフローで対応します。

キャッチオールドメインはどうすればいいですか?

一部のドメインは実際のメールボックスが存在しなくても、あらゆるアドレスへのメールを受け付けます。静的ブロックリストではこれを検出できません。Veille APIで qualification_check=true と共に smtp_valid を使って、特定のメールボックスが実際にメールを受信できるかどうかを確認します。ドメインが設定されているかどうかだけを確認するのでは不十分です。

無料メールプロバイダーをすべてブロックできますか?

いいえ。実際のユーザーの多くはGmail、Outlook、Yahooなどの無料プロバイダーで登録します。無料プロバイダーをブロックすると、実際のユーザーの大部分を失うことになります。正しい区別は無料対有料ではなく、使い捨て対永続的です。

すべての使い捨てドメインを網羅するリストはありますか?

いいえ。新しい使い捨てメールサービスは定期的に作られており、多くの場合、既存のブロックリストを避けることを目的としています。最も効果的なアプローチは、既知のプロバイダー向けの静的リストと、その他すべてのためのリアルタイムAPIを組み合わせることです。

Veilleリソース

Veilleは953以上の使い捨てメールプロバイダーを追跡しており、9つのカテゴリに整理されています。10分受信ボックス、一時サービス、バーナーアドレス、ゴミ受信ボックス、偽メールジェネレーター、匿名転送サービス、エイリアスとリレーサービス、プライバシーツール、その他です。データベースは毎週更新されます。

このガイドと一緒に使える2つの無料ツール:

  • 使い捨てメールプロバイダーディレクトリ - 追跡されている953以上のプロバイダーをすべて閲覧し、各プロバイダーのカテゴリラベルと説明を確認できます
  • ブロックリスト比較ツール - 任意のドメインを入力して、disposable-email-domains/disposable-email-domainsdisposable/disposable-email-domains7c/fakefilterFGRibreau/mailchecker などを含む12のオープンソースブロックリストで同時に確認できます

登録時に disposablerisk_scoresmtp_valid がリアルタイムで返される必要があるプロダクション環境での検出には、Veille メール検証API が静的リストでは対応できない部分をカバーします。