Catch-All 信箱檢測:2025 年完整指南與技術詳解

Leo
LeoFounder, BillionVerify

了解如何透過我們的綜合指南檢測 Catch-All 信箱地址。深入理解全接收伺服器、檢測演算法、實作策略,以及在信箱驗證工作流程中處理全接收網域的最佳實務。

Cover Image for Catch-All 信箱檢測:2025 年完整指南與技術詳解

在驗證信箱地址時,您會遇到的最具挑戰性的場景之一就是 Catch-All 信箱伺服器。這些伺服器會接收發送到其網域的任何地址的郵件,使得透過標準 SMTP 驗證無法確定特定信箱是否真實存在。理解 Catch-All 信箱檢測對於任何認真維護郵件列表品質和最大化送達率的人來說都至關重要。有關基礎概念,請參閱我們的信箱驗證完整指南

在這份綜合指南中,我們將探討關於 Catch-All 信箱您需要了解的一切:它們是什麼、為何存在、如何檢測它們,以及最重要的是如何在信箱驗證工作流程中處理它們。無論您是建構郵件驗證系統的開發者,還是試圖清理郵件列表的行銷人員,本指南都將為您提供有效處理 Catch-All 網域所需的知識和工具。

強大的信箱驗證策略必須考慮 Catch-All 伺服器。如果沒有正確的檢測和處理,您的驗證結果可能會給您關於郵件送達性的錯誤信心。讓我們深入了解技術細節和實用解決方案。

什麼是 Catch-All 信箱伺服器?

Catch-All 信箱伺服器,也稱為全接收伺服器,被配置為接收發送到其網域的任何地址的傳入郵件,無論該特定信箱是否存在。當您向 anyaddress@catchall-domain.com 發送郵件時,伺服器會接收它而不會退信,即使從未建立過名為 "anyaddress" 的信箱。

Catch-All 配置的運作原理

在典型的信箱伺服器配置中,當為不存在的信箱到達郵件時,伺服器會回應 "550 User not found" 或類似的拒絕訊息。這種行為允許信箱驗證系統透過檢查伺服器的回應來確定地址是否存在。

Catch-All 伺服器的行為有所不同。它們被配置為接收所有傳入郵件,無論收件人地址如何。然後郵件可能會:

  1. 路由到指定信箱 - 單個管理員接收所有訊息
  2. 儲存在常規佇列中 - 訊息被保留以便稍後分類
  3. 靜默丟棄 - 被接收但刪除而不傳遞
  4. 轉發到另一個系統 - 發送到不同的伺服器進行處理

這在 Postfix 郵件伺服器配置中的範例如下:

# /etc/postfix/main.cf
# 標準配置 - 拒絕未知收件人
local_recipient_maps = proxy:unix:passwd.byname $alias_maps

# Catch-all 配置 - 接收所有收件人
local_recipient_maps =

組織使用 Catch-All 伺服器的原因

組織配置 Catch-All 信箱有幾個合法原因:

1. 防止遺失業務通訊

小型企業通常擔心因拼字錯誤或員工姓名變體而錯過重要郵件。如果有人發送郵件到 john.smith@company.com,但實際地址是 jsmith@company.com,Catch-All 配置可確保訊息不會遺失。

2. 彈性的郵件路由

一些組織使用 Catch-All 作為複雜郵件路由系統的一部分。所有傳入郵件都會進入中央佇列,然後根據規則自動分類和分發。

3. 安全監控

安全團隊有時會配置 Catch-All 來監控攻擊者或垃圾郵件發送者正在針對哪些地址。這些情報有助於識別網路釣魚嘗試或資料外洩。

4. 舊系統相容性

從一個郵件系統遷移到另一個系統的組織可能會臨時啟用 Catch-All,以確保在過渡期間不會遺失任何訊息。

5. 隱私保護

一些注重隱私的組織使用 Catch-All 網域為其註冊的每個服務建立唯一的信箱地址,這樣可以更容易地追蹤哪些公司共享或外洩了他們的資料。

信箱驗證面臨的問題

對於信箱驗證目的,Catch-All 伺服器帶來了重大挑戰。當您對 Catch-All 網域執行 SMTP 驗證時,伺服器對您測試的每個地址都會回應 "250 OK" 接受——無論是真實的還是完全虛構的。

考慮這個 SMTP 會話範例:

> MAIL FROM:<test@verify.local>
< 250 OK
> RCPT TO:<real.user@catchall-domain.com>
< 250 OK
> RCPT TO:<completely.fake.address@catchall-domain.com>
< 250 OK
> RCPT TO:<asdfghjkl12345@catchall-domain.com>
< 250 OK

所有三個地址都收到相同的肯定回應,使得僅透過 SMTP 驗證無法區分真實使用者和虛假地址。

如何檢測 Catch-All 信箱伺服器

檢測郵件伺服器是否配置為 Catch-All 需要一個巧妙的方法:使用一個絕對不應該存在的地址進行測試,並觀察伺服器的回應。

檢測演算法

基本的 Catch-All 檢測演算法工作流程如下:

  1. 產生一個隨機的不存在地址 在目標網域上
  2. 對這個虛假地址執行 SMTP 驗證
  3. 分析回應:
    • 如果伺服器接受虛假地址 → 它可能是 Catch-All
    • 如果伺服器拒絕虛假地址 → 正常驗證適用

Node.js 實作

這是一個完整的 Node.js 實作用於 Catch-All 檢測:

const net = require('net');
const dns = require('dns').promises;
const crypto = require('crypto');

class CatchAllDetector {
  constructor(options = {}) {
    this.timeout = options.timeout || 10000;
    this.fromEmail = options.fromEmail || 'verify@verify.local';
    this.fromDomain = options.fromDomain || 'verify.local';
  }

  /**
   * 產生一個絕對不存在的隨機信箱地址
   */
  generateRandomEmail(domain) {
    const randomString = crypto.randomBytes(16).toString('hex');
    const timestamp = Date.now();
    return `nonexistent-${randomString}-${timestamp}@${domain}`;
  }

  /**
   * 取得網域的主 MX 伺服器
   */
  async getMXServer(domain) {
    try {
      const records = await dns.resolveMx(domain);
      if (!records || records.length === 0) {
        return null;
      }
      // 按優先順序排序並傳回主伺服器
      records.sort((a, b) => a.priority - b.priority);
      return records[0].exchange;
    } catch (error) {
      return null;
    }
  }

  /**
   * 對信箱地址執行 SMTP 驗證
   */
  async smtpVerify(email, mxServer) {
    return new Promise((resolve) => {
      const socket = new net.Socket();
      let step = 0;
      let result = { accepted: false, response: '' };

      const commands = [
        null, // 等待問候
        `EHLO ${this.fromDomain}\r\n`,
        `MAIL FROM:<${this.fromEmail}>\r\n`,
        `RCPT TO:<${email}>\r\n`,
        'QUIT\r\n'
      ];

      socket.setTimeout(this.timeout);

      socket.on('data', (data) => {
        const response = data.toString();
        const code = parseInt(response.substring(0, 3));

        if (step === 0 && code === 220) {
          socket.write(commands[1]);
          step++;
        } else if (step === 1 && code === 250) {
          socket.write(commands[2]);
          step++;
        } else if (step === 2 && code === 250) {
          socket.write(commands[3]);
          step++;
        } else if (step === 3) {
          result.response = response.trim();
          result.accepted = code === 250 || code === 251;
          socket.write(commands[4]);
          socket.destroy();
          resolve(result);
        } else if (code >= 400) {
          result.response = response.trim();
          result.accepted = false;
          socket.destroy();
          resolve(result);
        }
      });

      socket.on('timeout', () => {
        result.response = 'Connection timeout';
        socket.destroy();
        resolve(result);
      });

      socket.on('error', (error) => {
        result.response = `Error: ${error.message}`;
        socket.destroy();
        resolve(result);
      });

      socket.connect(25, mxServer);
    });
  }

  /**
   * 檢測網域是否配置為 Catch-All
   */
  async detectCatchAll(domain) {
    // 取得 MX 伺服器
    const mxServer = await this.getMXServer(domain);
    if (!mxServer) {
      return {
        isCatchAll: null,
        reason: 'Could not resolve MX records',
        domain
      };
    }

    // 產生一個隨機的不存在信箱
    const fakeEmail = this.generateRandomEmail(domain);

    // 測試虛假信箱
    const result = await this.smtpVerify(fakeEmail, mxServer);

    return {
      isCatchAll: result.accepted,
      reason: result.accepted
        ? 'Server accepts mail for non-existent addresses'
        : 'Server rejects non-existent addresses',
      domain,
      mxServer,
      testEmail: fakeEmail,
      serverResponse: result.response
    };
  }

  /**
   * 使用 Catch-All 檢測驗證信箱
   */
  async verifyWithCatchAllDetection(email) {
    const domain = email.split('@')[1];

    // 首先,檢測網域是否為 Catch-All
    const catchAllResult = await this.detectCatchAll(domain);

    if (catchAllResult.isCatchAll === null) {
      return {
        email,
        valid: null,
        catchAll: null,
        reason: catchAllResult.reason
      };
    }

    // 取得 MX 伺服器
    const mxServer = await this.getMXServer(domain);

    // 驗證實際信箱
    const verifyResult = await this.smtpVerify(email, mxServer);

    return {
      email,
      valid: verifyResult.accepted,
      catchAll: catchAllResult.isCatchAll,
      reason: catchAllResult.isCatchAll
        ? 'Address accepted but domain is catch-all (deliverability uncertain)'
        : verifyResult.accepted
          ? 'Address verified successfully'
          : 'Address rejected by server',
      serverResponse: verifyResult.response
    };
  }
}

// 使用範例
async function main() {
  const detector = new CatchAllDetector();

  // 測試 Catch-All 檢測
  const domains = ['gmail.com', 'example.com', 'company.com'];

  for (const domain of domains) {
    console.log(`\nTesting domain: ${domain}`);
    const result = await detector.detectCatchAll(domain);
    console.log(`Is Catch-All: ${result.isCatchAll}`);
    console.log(`Reason: ${result.reason}`);
    if (result.serverResponse) {
      console.log(`Server Response: ${result.serverResponse}`);
    }
  }

  // 使用 Catch-All 檢測驗證特定信箱
  const emailResult = await detector.verifyWithCatchAllDetection('user@example.com');
  console.log('\nEmail Verification Result:');
  console.log(JSON.stringify(emailResult, null, 2));
}

main().catch(console.error);

Python 實作

這是等效的 Python 實作:

import socket
import dns.resolver
import secrets
import time
from dataclasses import dataclass
from typing import Optional

@dataclass
class CatchAllResult:
    is_catch_all: Optional[bool]
    reason: str
    domain: str
    mx_server: Optional[str] = None
    test_email: Optional[str] = None
    server_response: Optional[str] = None

@dataclass
class VerificationResult:
    email: str
    valid: Optional[bool]
    catch_all: Optional[bool]
    reason: str
    server_response: Optional[str] = None

class CatchAllDetector:
    def __init__(self, timeout: int = 10, from_email: str = 'verify@verify.local',
                 from_domain: str = 'verify.local'):
        self.timeout = timeout
        self.from_email = from_email
        self.from_domain = from_domain

    def generate_random_email(self, domain: str) -> str:
        """產生一個絕對不存在的隨機信箱地址。"""
        random_string = secrets.token_hex(16)
        timestamp = int(time.time() * 1000)
        return f"nonexistent-{random_string}-{timestamp}@{domain}"

    def get_mx_server(self, domain: str) -> Optional[str]:
        """取得網域的主 MX 伺服器。"""
        try:
            records = dns.resolver.resolve(domain, 'MX')
            mx_records = sorted(
                [(r.preference, str(r.exchange).rstrip('.')) for r in records],
                key=lambda x: x[0]
            )
            return mx_records[0][1] if mx_records else None
        except Exception:
            return None

    def smtp_verify(self, email: str, mx_server: str) -> dict:
        """對信箱地址執行 SMTP 驗證。"""
        result = {'accepted': False, 'response': ''}

        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.settimeout(self.timeout)
            sock.connect((mx_server, 25))

            # 接收問候
            response = sock.recv(1024).decode()
            if not response.startswith('220'):
                result['response'] = response.strip()
                return result

            # 發送 EHLO
            sock.send(f'EHLO {self.from_domain}\r\n'.encode())
            response = sock.recv(1024).decode()
            if not response.startswith('250'):
                result['response'] = response.strip()
                return result

            # 發送 MAIL FROM
            sock.send(f'MAIL FROM:<{self.from_email}>\r\n'.encode())
            response = sock.recv(1024).decode()
            if not response.startswith('250'):
                result['response'] = response.strip()
                return result

            # 發送 RCPT TO
            sock.send(f'RCPT TO:<{email}>\r\n'.encode())
            response = sock.recv(1024).decode()
            result['response'] = response.strip()
            code = int(response[:3])
            result['accepted'] = code in (250, 251)

            # 發送 QUIT
            sock.send(b'QUIT\r\n')
            sock.close()

        except socket.timeout:
            result['response'] = 'Connection timeout'
        except socket.error as e:
            result['response'] = f'Socket error: {str(e)}'
        except Exception as e:
            result['response'] = f'Error: {str(e)}'

        return result

    def detect_catch_all(self, domain: str) -> CatchAllResult:
        """檢測網域是否配置為 Catch-All。"""
        # 取得 MX 伺服器
        mx_server = self.get_mx_server(domain)
        if not mx_server:
            return CatchAllResult(
                is_catch_all=None,
                reason='Could not resolve MX records',
                domain=domain
            )

        # 產生一個隨機的不存在信箱
        fake_email = self.generate_random_email(domain)

        # 測試虛假信箱
        result = self.smtp_verify(fake_email, mx_server)

        return CatchAllResult(
            is_catch_all=result['accepted'],
            reason='Server accepts mail for non-existent addresses' if result['accepted']
                   else 'Server rejects non-existent addresses',
            domain=domain,
            mx_server=mx_server,
            test_email=fake_email,
            server_response=result['response']
        )

    def verify_with_catch_all_detection(self, email: str) -> VerificationResult:
        """使用 Catch-All 檢測驗證信箱。"""
        domain = email.split('@')[1]

        # 首先,檢測網域是否為 Catch-All
        catch_all_result = self.detect_catch_all(domain)

        if catch_all_result.is_catch_all is None:
            return VerificationResult(
                email=email,
                valid=None,
                catch_all=None,
                reason=catch_all_result.reason
            )

        # 取得 MX 伺服器
        mx_server = self.get_mx_server(domain)

        # 驗證實際信箱
        verify_result = self.smtp_verify(email, mx_server)

        if catch_all_result.is_catch_all:
            reason = 'Address accepted but domain is catch-all (deliverability uncertain)'
        elif verify_result['accepted']:
            reason = 'Address verified successfully'
        else:
            reason = 'Address rejected by server'

        return VerificationResult(
            email=email,
            valid=verify_result['accepted'],
            catch_all=catch_all_result.is_catch_all,
            reason=reason,
            server_response=verify_result['response']
        )


# 使用範例
if __name__ == '__main__':
    detector = CatchAllDetector()

    # 測試 Catch-All 檢測
    domains = ['gmail.com', 'example.com', 'company.com']

    for domain in domains:
        print(f"\nTesting domain: {domain}")
        result = detector.detect_catch_all(domain)
        print(f"Is Catch-All: {result.is_catch_all}")
        print(f"Reason: {result.reason}")
        if result.server_response:
            print(f"Server Response: {result.server_response}")

    # 使用 Catch-All 檢測驗證特定信箱
    email_result = detector.verify_with_catch_all_detection('user@example.com')
    print("\nEmail Verification Result:")
    print(f"  Email: {email_result.email}")
    print(f"  Valid: {email_result.valid}")
    print(f"  Catch-All: {email_result.catch_all}")
    print(f"  Reason: {email_result.reason}")

進階檢測技術

基本的 Catch-All 檢測可以透過以下進階技術得到改進:

1. 多探針測試

不僅使用一個虛假地址進行測試,而是使用多個隨機產生的地址進行測試。這有助於識別行為不一致的伺服器:

async detectCatchAllAdvanced(domain, probeCount = 3) {
  const results = [];

  for (let i = 0; i < probeCount; i++) {
    const fakeEmail = this.generateRandomEmail(domain);
    const result = await this.smtpVerify(fakeEmail, await this.getMXServer(domain));
    results.push(result.accepted);

    // 探針之間的小延遲以避免速率限制
    await new Promise(resolve => setTimeout(resolve, 500));
  }

  // 分析結果
  const acceptedCount = results.filter(r => r).length;

  if (acceptedCount === probeCount) {
    return { isCatchAll: true, confidence: 'high' };
  } else if (acceptedCount === 0) {
    return { isCatchAll: false, confidence: 'high' };
  } else {
    return { isCatchAll: null, confidence: 'low', note: 'Inconsistent server behavior' };
  }
}

2. 基於模式的檢測

一些 Catch-All 伺服器配置了模式。測試不同格式的地址:

const testPatterns = [
  `nonexistent${Date.now()}@${domain}`,           // 帶時間戳記的隨機
  `zzz-fake-user-zzz@${domain}`,                  // 明顯的虛假模式
  `test.${crypto.randomUUID()}@${domain}`,        // UUID 格式
  `admin-backup-${Date.now()}@${domain}`          // 管理員外觀
];

3. 回應碼分析

分析特定的 SMTP 回應碼和訊息以獲得額外洞察:

function analyzeResponse(response) {
  const code = parseInt(response.substring(0, 3));
  const message = response.toLowerCase();

  if (code === 250) {
    if (message.includes('accepted for delivery')) {
      return { accepted: true, type: 'explicit_accept' };
    }
    return { accepted: true, type: 'standard_accept' };
  }

  if (code === 550) {
    if (message.includes('user unknown') || message.includes('no such user')) {
      return { accepted: false, type: 'user_not_found' };
    }
    if (message.includes('rejected') || message.includes('denied')) {
      return { accepted: false, type: 'policy_rejection' };
    }
  }

  if (code === 451 || code === 452) {
    return { accepted: null, type: 'temporary_failure' };
  }

  return { accepted: code < 400, type: 'unknown' };
}

處理 Catch-All 信箱的最佳實務

一旦檢測到 Catch-All 網域,您需要一個策略來在信箱驗證工作流程中處理這些地址。

策略 1: 基於風險的分類

實施一個風險分類系統,分配不同的可信度層級:

function classifyEmailRisk(verificationResult) {
  const { valid, catchAll, domain } = verificationResult;

  if (!valid) {
    return { risk: 'high', action: 'reject', reason: 'Invalid email address' };
  }

  if (!catchAll) {
    return { risk: 'low', action: 'accept', reason: 'Verified deliverable' };
  }

  // Catch-All 網域 - 評估額外風險因素
  const riskFactors = [];

  // 檢查網域年齡和聲譽(需要外部資料)
  // 檢查網域是否為已知的業務網域
  // 檢查信箱模式(基於角色、隨機等)

  const localPart = verificationResult.email.split('@')[0];

  if (isRoleBasedAddress(localPart)) {
    riskFactors.push('role_based');
  }

  if (looksRandomlyGenerated(localPart)) {
    riskFactors.push('random_looking');
  }

  if (riskFactors.length >= 2) {
    return { risk: 'high', action: 'reject', reason: 'Catch-all with multiple risk factors' };
  }

  if (riskFactors.length === 1) {
    return { risk: 'medium', action: 'flag', reason: 'Catch-all with one risk factor' };
  }

  return { risk: 'medium', action: 'accept_with_caution', reason: 'Catch-all domain' };
}

function isRoleBasedAddress(localPart) {
  const rolePatterns = [
    'admin', 'info', 'support', 'sales', 'contact',
    'help', 'webmaster', 'postmaster', 'noreply', 'no-reply'
  ];
  return rolePatterns.some(pattern =>
    localPart.toLowerCase().includes(pattern)
  );
}

function looksRandomlyGenerated(localPart) {
  // 檢查高熵(看起來隨機的字串)
  const consonants = localPart.match(/[bcdfghjklmnpqrstvwxyz]/gi) || [];
  const vowels = localPart.match(/[aeiou]/gi) || [];

  if (consonants.length > 0 && vowels.length === 0) {
    return true; // 沒有母音表明隨機
  }

  if (localPart.length > 20) {
    return true; // 非常長的本地部分是可疑的
  }

  // 檢查數字序列
  if (/\d{5,}/.test(localPart)) {
    return true; // 長數字序列
  }

  return false;
}

策略 2: 基於參與度的過濾

對於行銷目的,考慮使用參與度資料來過濾 Catch-All 地址:

function shouldIncludeInCampaign(email, engagementData, catchAllStatus) {
  // 如果有積極的參與歷史,總是包括
  if (engagementData.hasOpened || engagementData.hasClicked) {
    return { include: true, reason: 'Previous engagement confirmed' };
  }

  // 非 Catch-All 驗證過的信箱是安全的
  if (!catchAllStatus.isCatchAll && catchAllStatus.verified) {
    return { include: true, reason: 'Verified deliverable' };
  }

  // 沒有參與歷史的 Catch-All - 保持謹慎
  if (catchAllStatus.isCatchAll) {
    // 檢查我們之前是否成功投遞過
    if (engagementData.previousDeliveries > 0 && engagementData.bounceRate < 0.1) {
      return { include: true, reason: 'Previous successful deliveries' };
    }

    // 沒有歷史記錄的新 Catch-All 地址
    return {
      include: false,
      reason: 'Catch-all domain with no engagement history',
      recommendation: 'Send verification email first'
    };
  }

  return { include: true, reason: 'Default include' };
}

策略 3: 逐步預熱

在處理 Catch-All 地址時,實施逐步發送策略:

class CatchAllWarmingStrategy {
  constructor() {
    this.warmingGroups = {
      verified: { dailyLimit: 1000, priority: 1 },
      catchAllEngaged: { dailyLimit: 500, priority: 2 },
      catchAllNew: { dailyLimit: 100, priority: 3 }
    };
  }

  categorizeAddress(email, verification, engagement) {
    if (!verification.catchAll) {
      return 'verified';
    }

    if (engagement.hasInteracted) {
      return 'catchAllEngaged';
    }

    return 'catchAllNew';
  }

  buildSendingQueue(emails, verifications, engagements) {
    const categorized = {
      verified: [],
      catchAllEngaged: [],
      catchAllNew: []
    };

    emails.forEach(email => {
      const category = this.categorizeAddress(
        email,
        verifications[email],
        engagements[email] || {}
      );
      categorized[category].push(email);
    });

    // 建構遵守每日限制的佇列
    const queue = [];

    Object.entries(this.warmingGroups)
      .sort((a, b) => a[1].priority - b[1].priority)
      .forEach(([category, config]) => {
        const addresses = categorized[category].slice(0, config.dailyLimit);
        queue.push(...addresses.map(email => ({
          email,
          category,
          priority: config.priority
        })));
      });

    return queue;
  }
}

真實世界案例研究

案例研究 1: 電子商務公司列表清理

一家擁有 500,000 郵件訂閱者的中型電子商務公司希望提高其送達率。他們的分析顯示:

初始狀態:

  • 總共 500,000 訂閱者
  • 活動退信率 12%
  • 45,000 個地址(9%)在 Catch-All 網域上

驗證結果:

  • 425,000 驗證可送達(非 Catch-All)
  • 識別出 45,000 個 Catch-All 地址
  • 刪除了 30,000 個無效地址

Catch-All 處理策略:

他們沒有刪除所有 Catch-All 地址,而是實施了分層方法:

  1. 第 1 層 - 保留: 15,000 個之前有參與(6 個月內開啟或點選)的 Catch-All 地址
  2. 第 2 層 - 驗證: 20,000 個 Catch-All 地址發送重新參與活動
  3. 第 3 層 - 刪除: 10,000 個沒有參與歷史且模式可疑的 Catch-All 地址

3 個月後的結果:

  • 退信率降至 2.1%
  • 開啟率提高了 18%
  • 寄件人聲譽得分顯著提高
  • 郵件送達率達到 98.5%

案例研究 2: B2B SaaS 潛在客戶驗證

一家每月收到 10,000 個新潛在客戶的 B2B SaaS 公司在其註冊流程中實施了 Catch-All 檢測:

挑戰: 許多 B2B 潛在客戶來自配置為 Catch-All 的公司網域,使驗證變得困難。他們不能簡單地拒絕所有 Catch-All 地址而不遺失有價值的潛在客戶。

解決方案:

async function validateB2BLead(email, companyInfo) {
  const verification = await verifyEmail(email);
  const catchAllResult = await detectCatchAll(email.split('@')[1]);

  if (!verification.valid) {
    return { accept: false, reason: 'Invalid email' };
  }

  if (!catchAllResult.isCatchAll) {
    return { accept: true, reason: 'Verified deliverable', confidence: 'high' };
  }

  // Catch-All 網域 - 使用公司資訊驗證
  const domainMatchesCompany = email.split('@')[1].includes(
    companyInfo.name.toLowerCase().replace(/\s+/g, '')
  );

  if (domainMatchesCompany) {
    // 信箱網域與公司名稱匹配 - 可能是合法的
    return {
      accept: true,
      reason: 'Catch-all but matches company domain',
      confidence: 'medium',
      requireVerification: true
    };
  }

  // 網域不相關的 Catch-All
  return {
    accept: true,
    reason: 'Catch-all domain',
    confidence: 'low',
    requireVerification: true,
    sendDoubleOptIn: true
  };
}

結果:

  • 潛在客戶接受率保持在 95%
  • 假陽性拒絕減少了 60%
  • Catch-All 的雙重確認率: 72%
  • 整體潛在客戶品質提高了 25%

使用 BillionVerify 進行 Catch-All 檢測

雖然建構自己的 Catch-All 檢測是可能的,但使用像 BillionVerify 這樣的專業信箱驗證服務可以提供顯著優勢:

API 整合範例

const axios = require('axios');

async function verifyWithBillionVerify(email) {
  const response = await axios.post(
    'https://api.billionverify.com/v1/verify',
    { email },
    {
      headers: {
        'Authorization': `Bearer ${process.env.BV_API_KEY}`,
        'Content-Type': 'application/json'
      }
    }
  );

  const result = response.data;

  return {
    email: result.email,
    deliverable: result.deliverable,
    isCatchAll: result.is_catch_all,
    isDisposable: result.is_disposable,
    isRoleBased: result.is_role_address,
    qualityScore: result.quality_score,
    recommendation: result.recommendation
  };
}

// 使用 Catch-All 處理的批次驗證
async function bulkVerifyWithStrategy(emails) {
  const results = await Promise.all(
    emails.map(email => verifyWithBillionVerify(email))
  );

  return {
    safe: results.filter(r => r.deliverable && !r.isCatchAll),
    catchAll: results.filter(r => r.deliverable && r.isCatchAll),
    invalid: results.filter(r => !r.deliverable),
    stats: {
      total: results.length,
      safeCount: results.filter(r => r.deliverable && !r.isCatchAll).length,
      catchAllCount: results.filter(r => r.deliverable && r.isCatchAll).length,
      invalidCount: results.filter(r => !r.deliverable).length
    }
  };
}

使用 BillionVerify 的優勢

  1. 更高的準確性: 我們的 Catch-All 檢測使用多種驗證技術,並維護一個廣泛的已知 Catch-All 網域資料庫。

  2. 額外的情報: 除了 Catch-All 檢測之外,您還可以獲得拋棄式信箱檢測、基於角色的地址識別和品質評分。

  3. 速率限制管理: 我們處理速率限制和 IP 輪換,確保一致的驗證而不會被阻擋。

  4. 歷史資料: 存取歷史驗證資料有助於識別模式並改進決策制定。

  5. 即時更新: 隨著網域配置的變化,我們的 Catch-All 資料庫會持續更新。

結論

Catch-All 信箱檢測是任何全面信箱驗證策略的關鍵組成部分。雖然這些伺服器給驗證帶來了挑戰,但了解它們的運作原理並實施適當的檢測和處理策略可以讓您在不遺失有價值聯絡人的情況下保持高送達率。

本指南的關鍵要點:

  1. Catch-All 伺服器接收所有郵件 無論特定信箱是否存在
  2. 檢測涉及測試 使用絕對不存在的地址
  3. 不要自動拒絕 Catch-All 地址——實施基於風險的策略
  4. 使用參與度資料 對 Catch-All 聯絡人做出明智的決定
  5. 考慮專業服務BillionVerify 用於生產系統

準備好在您的工作流程中實施 Catch-All 檢測了嗎?試用我們的信箱檢測工具測試單個地址,或探索 BillionVerify API 以無縫整合到您的應用程式中。

透過正確處理 Catch-All 網域,您將提高郵件送達性,保護寄件人聲譽,並對您的郵件聯絡人做出更好的決策。

在選擇驗證服務商之前,比較 BillionVerify 與 ZeroBounce 在準確率和速度方面的差異。

BillionVerify 可直接與 HubSpotMailchimpActiveCampaign 整合,自動保持聯絡人名單的整潔。

使用 InstantlySmartlead 的團隊,在每次活動前透過 BillionVerify 清洗名單,可顯著提升送達率。

進行 B2B 行銷活動時,ApolloZoomInfo 的匯出資料在匯入前可透過 BillionVerify 驗證。

Leo
LeoFounder, BillionVerify
電子郵件驗證洞察

立即開始驗證

立即使用 BillionVerify 開始驗證電子郵件。註冊即可獲得 100 個免費積分——無需信用卡。加入數千家企業的行列,透過精準的電子郵件驗證提升電子郵件行銷的投資報酬率。

無需信用卡 · 每日 100+ 免費積分 · 30 秒後開始

99.9%
準確率
Real-time
API 速度
$0.00014
每封郵件費用
100/day
永久免費