EmailVerify LogoEmailVerify

Mailchimp

Email checker for Mailchimp. Clean your email list before sending campaigns.

EmailVerify로 구독자 이메일을 검증하여 Mailchimp 목록을 깨끗하게 유지하고, 전달률을 개선하고, 비용을 줄이세요.

Mailchimp 목록을 검증해야 하는 이유

문제영향해결책
무효한 이메일높은 반송률발송 전 검증
일회용 이메일낮은 참여도가입 시 필터링
오래된 목록평판 손상정기적 정리
스팸 트랩블랙리스트 위험위험한 주소 식별

통합 방법

방법사용 사례자동화
API 통합실시간 검증완전
Zapier노코드 자동화완전
내보내기/가져오기대량 목록 정리수동
웹훅새 구독자 검증완전

방법 1: Zapier 통합 (권장)

Mailchimp 구독자를 자동으로 검증하는 가장 쉬운 방법입니다.

새 구독자 검증

Trigger: Mailchimp → New Subscriber

Action: EmailVerify → Verify Email

Filter: Based on verification result

Action: Mailchimp → Update subscriber / Unsubscribe

설정 단계:

  1. Zapier에서 새 Zap 생성
  2. 트리거: Mailchimp - New Subscriber
  3. 액션: Webhooks - POST to https://api.emailverify.ai/v1/verify
  4. 필터: status = "valid"인 경우에만 계속
  5. 액션: Mailchimp - Update Subscriber with tags

구성:

Webhook Settings:
  URL: https://api.emailverify.ai/v1/verify
  Method: POST
  Headers:
    Authorization: Bearer YOUR_API_KEY
    Content-Type: application/json
  Body: {"email": "{{email}}"}

품질별 구독자 태그 지정

검증 결과에 따라 태그 추가:

If status = "valid" AND disposable = false
  → Add tag: "verified"

If disposable = true
  → Add tag: "disposable"
  → Update: Marketing permissions = false

If status = "invalid"
  → Unsubscribe member
  → Add tag: "invalid_email"

방법 2: 직접 API 통합

커스텀 애플리케이션의 경우 두 API와 직접 통합하세요.

Node.js 예시

const mailchimp = require('@mailchimp/mailchimp_marketing');
const { EmailVerify } = require('@emailverify/node');

// Initialize clients
mailchimp.setConfig({
  apiKey: process.env.MAILCHIMP_API_KEY,
  server: 'us1', // Your server prefix
});

const emailVerify = new EmailVerify({
  apiKey: process.env.EMAILVERIFY_API_KEY,
});

// Verify a subscriber
async function verifySubscriber(listId, email) {
  // Get verification result
  const result = await emailVerify.verify(email);

  // Get subscriber hash (MD5 of lowercase email)
  const subscriberHash = crypto
    .createHash('md5')
    .update(email.toLowerCase())
    .digest('hex');

  // Update subscriber based on result
  if (result.status === 'invalid') {
    // Unsubscribe invalid emails
    await mailchimp.lists.updateListMember(listId, subscriberHash, {
      status: 'unsubscribed',
    });

    // Add tag
    await mailchimp.lists.updateListMemberTags(listId, subscriberHash, {
      tags: [{ name: 'invalid_email', status: 'active' }],
    });
  } else if (result.status === 'valid') {
    // Tag as verified
    const tags = [{ name: 'verified', status: 'active' }];

    if (result.result.disposable) {
      tags.push({ name: 'disposable', status: 'active' });
    }

    await mailchimp.lists.updateListMemberTags(listId, subscriberHash, { tags });
  }

  return result;
}

Python 예시

import mailchimp_marketing as mailchimp
from emailverify import Client as EmailVerify
import hashlib
import os

# Initialize clients
mailchimp_client = mailchimp.Client()
mailchimp_client.set_config({
    "api_key": os.environ["MAILCHIMP_API_KEY"],
    "server": "us1"
})

bv_client = EmailVerify(api_key=os.environ["EMAILVERIFY_API_KEY"])

def verify_subscriber(list_id: str, email: str):
    # Verify email
    result = bv_client.verify(email)

    # Get subscriber hash
    subscriber_hash = hashlib.md5(email.lower().encode()).hexdigest()

    if result.status == "invalid":
        # Unsubscribe invalid emails
        mailchimp_client.lists.update_list_member(
            list_id,
            subscriber_hash,
            {"status": "unsubscribed"}
        )

        # Add tag
        mailchimp_client.lists.update_list_member_tags(
            list_id,
            subscriber_hash,
            {"tags": [{"name": "invalid_email", "status": "active"}]}
        )

    elif result.status == "valid":
        tags = [{"name": "verified", "status": "active"}]

        if result.result.disposable:
            tags.append({"name": "disposable", "status": "active"})

        mailchimp_client.lists.update_list_member_tags(
            list_id,
            subscriber_hash,
            {"tags": tags}
        )

    return result


# Bulk verify entire list
def clean_list(list_id: str):
    # Get all subscribers
    members = mailchimp_client.lists.get_list_members_info(
        list_id,
        count=1000,
        status="subscribed"
    )

    results = {"valid": 0, "invalid": 0, "unknown": 0}

    for member in members["members"]:
        result = verify_subscriber(list_id, member["email_address"])
        results[result.status] = results.get(result.status, 0) + 1

    return results

방법 3: 대량 목록 정리

대규모 목록의 경우 내보내기 후 EmailVerify의 대량 검증을 사용하세요.

단계 1: Mailchimp에서 내보내기

  1. AudienceAll contacts 이동
  2. Export Audience 클릭
  3. CSV 파일 다운로드

단계 2: EmailVerify로 검증

대시보드 사용:

  1. EmailVerify에 로그인
  2. Bulk Verification 이동
  3. CSV 파일 업로드
  4. 처리 대기
  5. 결과 다운로드

API 사용:

const fs = require('fs');
const { EmailVerify } = require('@emailverify/node');

const client = new EmailVerify({
  apiKey: process.env.EMAILVERIFY_API_KEY,
});

async function cleanMailchimpExport(csvPath) {
  // Read CSV and extract emails
  const csv = fs.readFileSync(csvPath, 'utf-8');
  const lines = csv.split('\n');
  const emails = lines
    .slice(1) // Skip header
    .map((line) => line.split(',')[0]) // First column is email
    .filter((email) => email);

  // Submit bulk job
  const job = await client.verifyBulk(emails);
  console.log(`Job ID: ${job.job_id}`);

  // Wait for completion (poll or use webhook)
  let status;
  do {
    await new Promise((r) => setTimeout(r, 10000)); // Wait 10s
    status = await client.getBulkJobStatus(job.job_id);
    console.log(`Progress: ${status.progress_percent}%`);
  } while (status.status !== 'completed');

  // Get results
  const results = await client.getBulkJobResults(job.job_id);

  // Separate by status
  const valid = results.results.filter((r) => r.status === 'valid');
  const invalid = results.results.filter((r) => r.status === 'invalid');

  console.log(`Valid: ${valid.length}, Invalid: ${invalid.length}`);

  return { valid, invalid };
}

단계 3: 결과 다시 가져오기

Mailchimp 가져오기용 CSV 생성:

function createMailchimpImportCSV(verificationResults) {
  const header = 'Email Address,Tags\n';

  const validRows = verificationResults.valid
    .map((r) => {
      const tags = ['verified'];
      if (r.result.disposable) tags.push('disposable');
      return `${r.email},"${tags.join(',')}"`;
    })
    .join('\n');

  const invalidRows = verificationResults.invalid
    .map((r) => `${r.email},"invalid_email,unsubscribe"`)
    .join('\n');

  return header + validRows + '\n' + invalidRows;
}

가져오기 단계:

  1. AudienceImport contacts 이동
  2. CSV 업로드
  3. 필드 매핑: Email Address와 Tags
  4. Update existing contacts 선택
  5. 가져오기 완료

웹훅 통합

검증 완료 시 알림 수신:

EmailVerify에서 웹훅 설정

// Create webhook
const webhook = await client.webhooks.create({
  url: 'https://your-server.com/api/emailverify-webhook',
  events: ['verification.completed'],
  secret: 'your-webhook-secret',
});

웹훅 처리

// Express.js endpoint
app.post('/api/emailverify-webhook', express.json(), async (req, res) => {
  const { event, data } = req.body;

  if (event === 'verification.completed') {
    const { email, status, result } = data;

    // Update Mailchimp subscriber
    await updateMailchimpSubscriber(email, status, result);
  }

  res.status(200).send('OK');
});

async function updateMailchimpSubscriber(email, status, result) {
  const subscriberHash = crypto
    .createHash('md5')
    .update(email.toLowerCase())
    .digest('hex');

  const tags = [];

  if (status === 'valid') {
    tags.push({ name: 'verified', status: 'active' });
  } else if (status === 'invalid') {
    tags.push({ name: 'invalid_email', status: 'active' });
  }

  if (result.disposable) {
    tags.push({ name: 'disposable', status: 'active' });
  }

  await mailchimp.lists.updateListMemberTags(
    process.env.MAILCHIMP_LIST_ID,
    subscriberHash,
    { tags }
  );
}

모범 사례

1. 추가 전 검증

Mailchimp에 추가하기 전에 이메일 검증:

async function addSubscriber(listId, email, firstName, lastName) {
  // Verify first
  const verification = await emailVerify.verify(email);

  if (verification.status === 'invalid') {
    throw new Error('Invalid email address');
  }

  if (verification.result.disposable) {
    throw new Error('Disposable emails not allowed');
  }

  // Add to Mailchimp
  await mailchimp.lists.addListMember(listId, {
    email_address: email,
    status: 'subscribed',
    merge_fields: {
      FNAME: firstName,
      LNAME: lastName,
    },
    tags: ['verified'],
  });
}

2. 정기적으로 목록 정리

월별 목록 정리 예약:

// Cron job example (monthly)
const cron = require('node-cron');

cron.schedule('0 0 1 * *', async () => {
  console.log('Starting monthly list cleaning...');

  const lists = await mailchimp.lists.getAllLists();

  for (const list of lists.lists) {
    await cleanList(list.id);
  }

  console.log('List cleaning complete');
});

3. 이메일 품질별 세분화

타겟팅을 위한 세그먼트 생성:

고품질 세그먼트:

{
  "name": "High Quality Subscribers",
  "conditions": {
    "match": "all",
    "conditions": [
      {
        "field": "tag",
        "op": "contains",
        "value": "verified"
      },
      {
        "field": "tag",
        "op": "notcontain",
        "value": "disposable"
      }
    ]
  }
}

4. 효과적인 태그 사용

태깅 전략 구현:

태그의미조치
verified이메일이 유효함캠페인에 포함
disposable임시 이메일발송 제한
invalid_email이메일이 반송됨캠페인에서 제외
role_basedinfo@, support@제외 고려
needs_reverify마지막 검증 90일 이상재검증

5. 지표 모니터링

구현 후 다음 지표 추적:

  • 반송률: 크게 감소해야 함
  • 오픈율: 개선되어야 함
  • 전달률 점수: 증가해야 함
  • 목록 성장 품질: 검증됨 vs 미검증 가입 추적

비용 절감 계산기

목록 정리로 인한 절감액 추정:

지표정리 전정리 후
목록 크기100,00085,000
무효한 이메일15%1% 미만
반송률8%2% 미만
월별 ESP 비용$250$212
연간 절감액-$456

더 작고 깨끗한 목록은 종종 더 높은 참여율을 가지며, 발신자 평판과 전달률을 개선합니다.

문제 해결

정리 후에도 높은 반송률

  • 정리 프로세스가 성공적으로 완료되었는지 확인
  • 최근 추가된 미검증 구독자 확인
  • 유효로 표시되었지만 반송되는 이메일 재검증

태그가 적용되지 않음

  • API 권한에 태그 관리가 포함되어 있는지 확인
  • 구독자 상태 확인 (보관된 회원은 태그할 수 없음)
  • 태그 이름이 문자 제한을 초과하지 않는지 확인

속도 제한

Mailchimp와 EmailVerify 모두 속도 제한이 있습니다:

서비스제한
Mailchimp Marketing API10 요청/초
EmailVerify플랜에 따름

대량 작업에 지연 구현:

async function processWithDelay(items, processFn, delayMs = 100) {
  for (const item of items) {
    await processFn(item);
    await new Promise((r) => setTimeout(r, delayMs));
  }
}

관련 리소스

On this page