Droid
Email checker with Droid CLI. Verify emails in Droid AI assistant.
Droid는 개발자를 위한 AI 기반 터미널 어시스턴트입니다. Droid 워크플로우에서 이메일 검증을 위해 EmailVerify를 통합하는 방법을 알아보세요.
Droid란?
Droid는 다음을 제공하는 현대적인 AI 터미널 어시스턴트입니다:
- 지능형 명령 제안
- 코드 생성 및 설명
- 셸 자동화
- 다중 모델 지원 (GPT-4, Claude, 로컬 모델)
설정
EmailVerify CLI 설치
npm install -g @emailverify/cli
bv config set api-key YOUR_API_KEY환경 설정
export EMAILVERIFY_API_KEY=your-api-keyDroid와 함께 사용
빠른 검증
사용자: emailverify로 john@example.com 검증해줘
Droid:
Running: bv verify john@example.com --json
{
"email": "john@example.com",
"status": "valid",
"score": 0.88,
"result": {
"deliverable": true,
"disposable": false,
"role": false
}
}
✅ 이메일이 유효합니다 (88% 신뢰도)일괄 작업
사용자: contacts.csv의 모든 이메일을 검증하고 보고서 생성해줘
Droid:
CSV를 처리하고 각 이메일을 검증하겠습니다.
contacts.csv 읽는 중... 250개 항목을 찾았습니다.
진행률: ████████████████████ 100%
요약 보고서:
┌──────────────┬───────┬────────┐
│ 상태 │ 개수 │ % │
├──────────────┼───────┼────────┤
│ 유효 │ 198 │ 79.2% │
│ 유효하지 않음 │ 32 │ 12.8% │
│ 알 수 없음 │ 12 │ 4.8% │
│ 일회용 │ 8 │ 3.2% │
└──────────────┴───────┴────────┘
생성된 파일:
- contacts_valid.csv (198개 이메일)
- contacts_invalid.csv (32개 이메일)
- contacts_review.csv (20개 이메일)
유효하지 않은 이메일에 대해 설명해드릴까요?코드 생성
사용자: 이메일 검증용 Node.js API 엔드포인트 생성해줘
Droid:
// routes/verify.ts
import { Router } from 'express';
import rateLimit from 'express-rate-limit';
const router = Router();
// Rate limit: 분당 100개 요청
const limiter = rateLimit({
windowMs: 60 * 1000,
max: 100,
message: { error: 'Too many requests' }
});
router.post('/verify', limiter, async (req, res) => {
const { email } = req.body;
if (!email) {
return res.status(400).json({ error: 'Email is required' });
}
try {
const response = await fetch('https://api.emailverify.ai/v1/verify', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.EMAILVERIFY_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ email }),
});
const result = await response.json();
return res.json({
email,
isValid: result.status === 'valid',
score: result.score,
flags: {
disposable: result.result.disposable,
role: result.result.role,
}
});
} catch (error) {
return res.status(500).json({ error: 'Verification service unavailable' });
}
});
export default router;routes/verify.ts에 저장되었습니다
셸 자동화
사용자: 매일 새 가입을 검증하는 cron 작업 생성해줘
Droid:
# 검증 스크립트 생성
cat > /usr/local/bin/verify-daily-signups.sh << 'EOF'
#!/bin/bash
set -e
LOG_FILE="/var/log/email-verification.log"
DB_HOST="${DB_HOST:-localhost}"
DB_NAME="${DB_NAME:-myapp}"
echo "$(date): Starting daily email verification" >> $LOG_FILE
# 데이터베이스에서 검증되지 않은 이메일 가져오기
emails=$(psql -h $DB_HOST -d $DB_NAME -t -c \
"SELECT email FROM users WHERE email_verified IS NULL AND created_at > NOW() - INTERVAL '1 day'")
count=0
invalid=0
for email in $emails; do
result=$(bv verify "$email" --json 2>/dev/null)
status=$(echo "$result" | jq -r '.status')
if [ "$status" = "valid" ]; then
psql -h $DB_HOST -d $DB_NAME -c \
"UPDATE users SET email_verified = true WHERE email = '$email'"
else
psql -h $DB_HOST -d $DB_NAME -c \
"UPDATE users SET email_verified = false, email_status = '$status' WHERE email = '$email'"
((invalid++))
fi
((count++))
sleep 0.1 # Rate limiting
done
echo "$(date): Verified $count emails, $invalid invalid" >> $LOG_FILE
EOF
chmod +x /usr/local/bin/verify-daily-signups.sh
# crontab에 추가 (매일 오전 2시에 실행)
(crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/verify-daily-signups.sh") | crontab -
echo "✅ Cron 작업이 생성되었습니다. 매일 오전 2시에 실행됩니다."통합 테스트
사용자: 이메일 검증용 통합 테스트 작성해줘
Droid:
// __tests__/email-verification.test.ts
import { describe, it, expect, beforeAll } from 'vitest';
describe('Email Verification Integration', () => {
const API_URL = 'https://api.emailverify.ai/v1/verify';
let apiKey: string;
beforeAll(() => {
apiKey = process.env.EMAILVERIFY_API_KEY!;
if (!apiKey) {
throw new Error('EMAILVERIFY_API_KEY not set');
}
});
async function verifyEmail(email: string) {
const response = await fetch(API_URL, {
method: 'POST',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ email }),
});
return response.json();
}
it('returns valid for known good email', async () => {
const result = await verifyEmail('test@gmail.com');
expect(result.status).toBe('valid');
expect(result.score).toBeGreaterThan(0.5);
});
it('detects disposable emails', async () => {
const result = await verifyEmail('test@mailinator.com');
expect(result.result.disposable).toBe(true);
});
it('detects role-based emails', async () => {
const result = await verifyEmail('info@example.com');
expect(result.result.role).toBe(true);
});
it('handles invalid domains', async () => {
const result = await verifyEmail('user@thisisnotarealdomain12345.xyz');
expect(result.status).toBe('invalid');
});
it('returns proper structure', async () => {
const result = await verifyEmail('user@example.com');
expect(result).toHaveProperty('email');
expect(result).toHaveProperty('status');
expect(result).toHaveProperty('score');
expect(result).toHaveProperty('result');
expect(result.result).toHaveProperty('deliverable');
expect(result.result).toHaveProperty('disposable');
expect(result.result).toHaveProperty('role');
});
});Droid 별칭
Droid 설정에 다음을 추가하세요:
# ~/.droid/aliases.yml
aliases:
vmail:
description: "Verify an email address"
command: "bv verify $1 --color"
vmail-json:
description: "Verify an email and output JSON"
command: "bv verify $1 --json | jq ."
vmail-batch:
description: "Verify emails from a file"
command: "bv verify --file $1 --output results.csv"
vmail-check:
description: "Quick check if email is valid (returns 0 or 1)"
command: "bv verify $1 --quiet"사용법:
droid vmail user@example.com
droid vmail-batch contacts.txt