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설정 단계:
- Zapier에서 새 Zap 생성
- 트리거: Mailchimp - New Subscriber
- 액션: Webhooks - POST to
https://api.emailverify.ai/v1/verify - 필터: status = "valid"인 경우에만 계속
- 액션: 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에서 내보내기
- Audience → All contacts 이동
- Export Audience 클릭
- CSV 파일 다운로드
단계 2: EmailVerify로 검증
대시보드 사용:
- EmailVerify에 로그인
- Bulk Verification 이동
- CSV 파일 업로드
- 처리 대기
- 결과 다운로드
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;
}가져오기 단계:
- Audience → Import contacts 이동
- CSV 업로드
- 필드 매핑: Email Address와 Tags
- Update existing contacts 선택
- 가져오기 완료
웹훅 통합
검증 완료 시 알림 수신:
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_based | info@, support@ | 제외 고려 |
needs_reverify | 마지막 검증 90일 이상 | 재검증 |
5. 지표 모니터링
구현 후 다음 지표 추적:
- 반송률: 크게 감소해야 함
- 오픈율: 개선되어야 함
- 전달률 점수: 증가해야 함
- 목록 성장 품질: 검증됨 vs 미검증 가입 추적
비용 절감 계산기
목록 정리로 인한 절감액 추정:
| 지표 | 정리 전 | 정리 후 |
|---|---|---|
| 목록 크기 | 100,000 | 85,000 |
| 무효한 이메일 | 15% | 1% 미만 |
| 반송률 | 8% | 2% 미만 |
| 월별 ESP 비용 | $250 | $212 |
| 연간 절감액 | - | $456 |
더 작고 깨끗한 목록은 종종 더 높은 참여율을 가지며, 발신자 평판과 전달률을 개선합니다.
문제 해결
정리 후에도 높은 반송률
- 정리 프로세스가 성공적으로 완료되었는지 확인
- 최근 추가된 미검증 구독자 확인
- 유효로 표시되었지만 반송되는 이메일 재검증
태그가 적용되지 않음
- API 권한에 태그 관리가 포함되어 있는지 확인
- 구독자 상태 확인 (보관된 회원은 태그할 수 없음)
- 태그 이름이 문자 제한을 초과하지 않는지 확인
속도 제한
Mailchimp와 EmailVerify 모두 속도 제한이 있습니다:
| 서비스 | 제한 |
|---|---|
| Mailchimp Marketing API | 10 요청/초 |
| EmailVerify | 플랜에 따름 |
대량 작업에 지연 구현:
async function processWithDelay(items, processFn, delayMs = 100) {
for (const item of items) {
await processFn(item);
await new Promise((r) => setTimeout(r, delayMs));
}
}