ã¡ãŒã«ã¢ãã¬ã¹ãåéããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã«ã¯ãåºæ¬çãªãã©ãŒã ããªããŒã·ã§ã³ä»¥äžã®ãã®ãå¿ èŠã§ããã¡ãŒã«æ€èšŒ API ã¯ãã¡ãŒã«ã¢ãã¬ã¹ãããŒã¿ããŒã¹ã«å ¥ãåã«ãããããå®åšããé ä¿¡å¯èœã§ãå®å šã«äœ¿çšã§ããããšã確èªããã€ã³ãã©ã¹ãã©ã¯ãã£ãæäŸããŸãããã®å æ¬çãªã¬ã€ãã¯ãèªèšŒãšãšã³ããã€ã³ããããšã©ãŒãã³ããªã³ã°ãšæé©åæŠç¥ãŸã§ãéçºè ãã¡ãŒã«æ€èšŒ API ãã¢ããªã±ãŒã·ã§ã³ã«çµ±åããããã«ç¥ã£ãŠããã¹ããã¹ãŠãã«ããŒããŠããŸãã
ã¡ãŒã«æ€èšŒ API ã®çè§£
ã¡ãŒã«æ€èšŒ API ã¯ãã¡ãŒã«ã¢ãã¬ã¹ãåãåããè©³çŽ°ãªæ€èšŒçµæãè¿ã Web ãµãŒãã¹ã§ãã圢åŒã®ã¿ããã§ãã¯ããã¯ã©ã€ã¢ã³ãåŽããªããŒã·ã§ã³ãšã¯ç°ãªãããããã® API ã¯ãæ§ææ€èšŒããã¡ã€ã³ç¢ºèªãMX ã¬ã³ãŒãæ€çŽ¢ãSMTP æ€èšŒãããã³äœ¿ãæšãŠã¡ãŒã«æ€åºããã£ãããªãŒã«ãã¡ã€ã³èå¥ãªã©ã®è¿œå ã€ã³ããªãžã§ã³ã¹ãå«ãå æ¬çãªãµãŒããŒåŽãã§ãã¯ãå®è¡ããŸãã
BillionVerify ã®ãããªãããã§ãã·ã§ãã«ãªã¡ãŒã«ç¢ºèªãµãŒãã¹ã¯ãRESTful API ãéããŠæ€èšŒæ©èœãå ¬éããéçºè ãç»é²ãããŒãããŒã¿åŠçãã€ãã©ã€ã³ããããæ€èšŒã¯ãŒã¯ãããŒã«çŽæ¥ã¡ãŒã«ããªããŒã·ã§ã³ãçµ±åã§ããããã«ããŸãã
ãªãã¡ãŒã«æ€èšŒ API ã䜿çšããã®ãïŒ
ãªã¢ã«ã¿ã€ã æ€èšŒ ãŠãŒã¶ãŒç»é²ããã©ãŒã éä¿¡äžã«ã¡ãŒã«ã¢ãã¬ã¹ãå³åº§ã«æ€èšŒããŸãããŠãŒã¶ãŒã¯ç¡å¹ãªã¢ãã¬ã¹ã«ã€ããŠå³åº§ã«ãã£ãŒãããã¯ãåãåããæåã®ããåãããããŒã¿å質ãåäžããŸãã
ã¹ã±ãŒã©ãã«ãªã€ã³ãã©ã¹ãã©ã¯ã㣠ã¡ãŒã«ç¢ºèªã€ã³ãã©ã¹ãã©ã¯ãã£ã®æ§ç¯ãšç¶æã«ã¯å€§ããªãªãœãŒã¹ãå¿ èŠã§ããAPI ã¯ãéçšäžã®ãªãŒããŒããããªãã«ã忣æ€èšŒã·ã¹ãã ãã¯ãªãŒã³ãª IP ã¬ãã¥ããŒã·ã§ã³ããŒã«ãç¶ç¶çã«æŽæ°ãããã€ã³ããªãžã§ã³ã¹ãžã®ã¢ã¯ã»ã¹ãæäŸããŸãã
å æ¬çãªãã§ã㯠ãããã§ãã·ã§ãã«ãªã¡ãŒã«æ€èšŒ API ã¯ãè€è£œããã®ã«å€å€§ãªéçºåªåãå¿ èŠãšããè€æ°ã®æ€èšŒæè¡ãçµã¿åãããŠããŸãã1 åã® API åŒã³åºãã§ãæ§ææ€èšŒããã¡ã€ã³ãã§ãã¯ãSMTP æ€èšŒãäœ¿ãæšãŠã¡ãŒã«æ€åºãªã©ãå®è¡ã§ããŸãã
粟床ãšä¿¡é Œæ§ ã¡ãŒã«ããªããŒã·ã§ã³ãµãŒãã¹ã¯ç²ŸåºŠã«å€é¡ã®æè³ãããŠããŸããäœ¿ãæšãŠãã¡ã€ã³ã®ããŒã¿ããŒã¹ãç¶æãããã£ãããªãŒã«èšå®ã远跡ããæéãšãšãã«æ¹åãããæŽç·Žãããæ€åºã¢ã«ãŽãªãºã ãå®è£ ããŠããŸãã
API èªèšŒæ¹æ³
API ã¢ã¯ã»ã¹ã®ã»ãã¥ãªãã£ç¢ºä¿ã¯ããã¹ãŠã®ã¡ãŒã«ç¢ºèªçµ±åã®åºæ¬ã§ããã»ãšãã©ã®ãµãŒãã¹ã¯ãããŸããŸãªãŠãŒã¹ã±ãŒã¹ã«é©ããè€æ°ã®èªèšŒã¡ã«ããºã ãæäŸããŠããŸãã
API ããŒèªèšŒ
æãäžè¬çãªèªèšŒæ¹æ³ã¯ããªã¯ãšã¹ãããããŒãŸãã¯ã¯ãšãªãã©ã¡ãŒã¿ã§æž¡ããã API ããŒã䜿çšããŸããAPI ããŒã¯ã䜿çšç¶æ³ã®è¿œè·¡ãšã¬ãŒãå¶éãå¯èœã«ããªãããã·ã³ãã«ãªçµ±åãæäŸããŸãã
ããããŒããŒã¹èªèšŒ
const response = await fetch('https://api.billionverify.com/v1/verify', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({ email: 'user@example.com' })
});
Bearer ããŒã¯ã³ã䜿çšãã Authorization ããããŒãæšå¥šãããã¢ãããŒãã§ããããã«ãããè³æ Œæ
å ±ã URL ããé€å€ããããµãŒããŒã¢ã¯ã»ã¹ãã°ãžã®å¶çºçãªãã°èšé²ã鲿¢ãããŸãã
ã¯ãšãªãã©ã¡ãŒã¿èªèšŒ
äžéšã® API ã¯ãç¹å®ã®ã³ã³ããã¹ãã§ã®ããç°¡åãªçµ±åã®ããã«ãã¯ãšãªãã©ã¡ãŒã¿ãšããŠããŒãåãå ¥ããŸãïŒ
GET https://api.billionverify.com/v1/verify?email=user@example.com&api_key=YOUR_API_KEY
䟿å©ã§ãããã¯ãšãªãã©ã¡ãŒã¿èªèšŒã¯ããã°ããã©ãŠã¶å±¥æŽã«è³æ Œæ å ±ãå ¬éããŸããå¯èœãªéãããããŒããŒã¹èªèšŒã䜿çšããŠãã ããã
API ããŒã®ãã¹ããã©ã¯ãã£ã¹
ç°å¢å€æ° API ããŒããœãŒã¹ã³ãŒãã«ããŒãã³ãŒãã£ã³ã°ããªãã§ãã ãããç°å¢å€æ°ã«ä¿åããŠãã ããïŒ
const apiKey = process.env.BILLIONVERIFY_API_KEY;
ããŒã®ããŒããŒã·ã§ã³ API ããŒã宿çã«ããŒããŒã·ã§ã³ãã䟵害ãçãããå Žåã¯çŽã¡ã«ããŒããŒã·ã§ã³ããŠãã ãããã»ãšãã©ã®ãµãŒãã¹ã¯ãã·ãŒã ã¬ã¹ãªããŒããŒã·ã§ã³ãå¯èœã«ããããã«è€æ°ã®ã¢ã¯ãã£ãããŒãèš±å¯ããŠããŸãã
ç°å¢ããšã«åå¥ã®ã㌠éçºãã¹ããŒãžã³ã°ãæ¬çªç°å¢ã§ç°ãªã API ããŒã䜿çšããŠãã ãããããã«ããããã¹ããã©ãã£ãã¯ãæ¬çªç°å¢ã®ã¯ã©ãŒã¿ã«åœ±é¿ããã®ãé²ãããããã°ãç°¡çŽ åãããŸãã
ããŒã®æš©éãå¶é API ãã¹ã³ãŒãä»ãæš©éããµããŒãããŠããå Žåã¯ãåããŒãå¿ èŠãªæäœã®ã¿ã«å¶éããŠãã ãããåäžã®ã¡ãŒã«æ€èšŒã«ã®ã¿äœ¿çšãããããŒã«ã¯ããã«ã¯åŠçã®æš©éã¯å¿ èŠãããŸããã
ã³ã¢ API ãšã³ããã€ã³ã
ã¡ãŒã«æ€èšŒ API ã¯éåžžãããŸããŸãªãŠãŒã¹ã±ãŒã¹çšã®ãšã³ããã€ã³ããæäŸããŸããåãšã³ããã€ã³ãã®ç®çãçè§£ããããšã§ãçµ±åã«é©ããã¢ãããŒããéžæã§ããŸãã
åäžã¡ãŒã«æ€èšŒ
åºæ¬çãªãšã³ããã€ã³ãã¯ããªã¯ãšã¹ãããšã« 1 ã€ã®ã¡ãŒã«ã¢ãã¬ã¹ãæ€èšŒããŸãïŒ
POST /v1/verify
{
"email": "user@example.com"
}
ã¬ã¹ãã³ã¹æ§é
{
"email": "user@example.com",
"is_valid": true,
"is_deliverable": true,
"is_disposable": false,
"is_role_based": false,
"is_catch_all": false,
"is_free_provider": true,
"syntax_valid": true,
"domain_valid": true,
"mx_found": true,
"smtp_check": "passed",
"risk_score": 15,
"suggestion": null,
"verification_time_ms": 1234
}
äž»èŠãªã¬ã¹ãã³ã¹ãã£ãŒã«ã
| ãã£ãŒã«ã | ã¿ã€ã | 説æ |
|---|---|---|
is_valid | boolean | å šäœçãªæå¹æ§è©äŸ¡ |
is_deliverable | boolean | ã¡ãŒã«ãã¡ãã»ãŒãžãåä¿¡ã§ãããã©ãã |
is_disposable | boolean | äžæç/äœ¿ãæšãŠã¡ãŒã«ã¢ãã¬ã¹ |
is_role_based | boolean | info@ãsupport@ ãªã©ã®æ±çšã¢ãã¬ã¹ |
is_catch_all | boolean | ãã¡ã€ã³ããã¹ãŠã®ã¢ãã¬ã¹ãåãå ¥ãã |
smtp_check | string | SMTP æ€èšŒçµæ |
risk_score | number | ãªã¹ã¯è©äŸ¡ïŒ0-100ãäœãã»ã©è¯ãïŒ |
suggestion | string | æ€åºãããå Žåã®ã¿ã€ãä¿®æ£ææ¡ |
ãããã¡ãŒã«æ€èšŒ
倧ããªãªã¹ããæ€èšŒããããã«ãããããšã³ããã€ã³ãã¯è€æ°ã®ã¡ãŒã«ãåãå ¥ããŸãïŒ
POST /v1/verify/batch
{
"emails": [
"user1@example.com",
"user2@example.com",
"user3@example.com"
]
}
ããããšã³ããã€ã³ãã¯ã¡ãŒã«ã䞊ååŠçããé æ¬¡çãªåäžã¡ãŒã«ãªã¯ãšã¹ããããéãçµæãè¿ããŸããã»ãšãã©ã®ãµãŒãã¹ã¯ããããµã€ãºãå¶éãïŒéåžžããªã¯ãšã¹ãããã 100-1000 ã¡ãŒã«ïŒãéåžžã«å€§ããªãããã¯éåæã§åŠçãããå ŽåããããŸãã
ãã«ã¯ãã¡ã€ã«ã¢ããããŒã
ããããšã³ããã€ã³ãã«ã¯å€§ãããããªã¹ãã®å Žåããã¡ã€ã«ã¢ããããŒã API ã¯æ°çŸäžã®ã¬ã³ãŒããåŠçããŸãïŒ
const formData = new FormData();
formData.append('file', emailListFile);
const uploadResponse = await fetch('https://api.billionverify.com/v1/bulk/upload', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
},
body: formData
});
const { job_id } = await uploadResponse.json();
ãã¡ã€ã«ã¢ããããŒããšã³ããã€ã³ãã¯ãé²è¡ç¶æ³ã远跡ããããã®ãžã§ã ID ãè¿ããŸããåŠçãå®äºãããšçµæãååŸãããŸãïŒ
// ãžã§ãã¹ããŒã¿ã¹ã確èª
const statusResponse = await fetch(
`https://api.billionverify.com/v1/bulk/status/${job_id}`,
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const { status, progress, estimated_completion } = await statusResponse.json();
// å®äºæã«çµæãããŠã³ããŒã
if (status === 'completed') {
const resultsResponse = await fetch(
`https://api.billionverify.com/v1/bulk/download/${job_id}`,
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
}
Webhook éç¥
éåæåŠçã®å Žåãæ€èšŒãå®äºãããšãã«éç¥ãåãåãããã« Webhook ãèšå®ããŸãïŒ
POST /v1/webhooks
{
"url": "https://yourapp.com/webhooks/email-verification",
"events": ["bulk.completed", "bulk.failed"],
"secret": "your_webhook_secret"
}
Webhook ã¯ããŒãªã³ã°ãæé€ãããã«ã¯æäœã®å¹çãåäžãããŸãã
ãšã©ãŒãã³ããªã³ã°æŠç¥
å ç¢ãªãšã©ãŒãã³ããªã³ã°ã«ãããçµ±åããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã劚ããããšãªãé害ãé©åã«åŠçã§ããŸãã
HTTP ã¹ããŒã¿ã¹ã³ãŒã
ã¡ãŒã«æ€èšŒ API ã¯æšæºã® HTTP ã¹ããŒã¿ã¹ã³ãŒãã䜿çšããŸãïŒ
| ã³ãŒã | æå³ | ã¢ã¯ã·ã§ã³ |
|---|---|---|
| 200 | æå | ã¬ã¹ãã³ã¹ãåŠç |
| 400 | äžæ£ãªãªã¯ãšã¹ã | ãªã¯ãšã¹ã圢åŒãä¿®æ£ |
| 401 | æªèªèšŒ | API ããŒãç¢ºèª |
| 403 | çŠæ¢ | æš©éãç¢ºèª |
| 404 | èŠã€ãããªã | ãšã³ããã€ã³ã URL ãç¢ºèª |
| 429 | ã¬ãŒãå¶é | ããã¯ãªããå®è£ |
| 500 | ãµãŒããŒãšã©ãŒ | ããã¯ãªãããŠãªãã©ã€ |
| 503 | ãµãŒãã¹å©çšäžå¯ | åŸã§ãªãã©ã€ |
ãªãã©ã€ããžãã¯ã®å®è£
ãããã¯ãŒã¯ã®åé¡ãšäžæçãªãšã©ãŒã«ã¯ããªãã©ã€ã¡ã«ããºã ãå¿ èŠã§ãïŒ
async function verifyEmailWithRetry(email, maxRetries = 3) {
const delays = [1000, 2000, 4000]; // ææ°ããã¯ãªã
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const response = await fetch('https://api.billionverify.com/v1/verify', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.BILLIONVERIFY_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ email })
});
if (response.status === 429) {
// ã¬ãŒãå¶é - åŸ
æ©ããŠãªãã©ã€
const retryAfter = response.headers.get('Retry-After') || delays[attempt];
await sleep(parseInt(retryAfter) * 1000);
continue;
}
if (response.status >= 500) {
// ãµãŒããŒãšã©ãŒ - ããã¯ãªãããŠãªãã©ã€
await sleep(delays[attempt]);
continue;
}
if (!response.ok) {
throw new Error(`API error: ${response.status}`);
}
return await response.json();
} catch (error) {
if (attempt === maxRetries - 1) {
throw error;
}
await sleep(delays[attempt]);
}
}
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
æ€èšŒçµæã®åŠç
ãã¹ãŠã®æ€èšŒãæç¢ºãªçããè¿ãããã§ã¯ãããŸãããäžç¢ºå®ãªçµæãé©åã«åŠçããŸãïŒ
function handleVerificationResult(result) {
if (result.is_valid && result.is_deliverable) {
return { status: 'valid', action: 'accept' };
}
if (!result.syntax_valid || !result.domain_valid) {
return { status: 'invalid', action: 'reject' };
}
if (result.is_disposable) {
return { status: 'risky', action: 'reject_or_warn' };
}
if (result.is_catch_all) {
// æç¢ºã«æ€èšŒã§ããªã - ç£èŠä»ãã§åãå
¥ããããšãæ€èš
return { status: 'uncertain', action: 'accept_with_caution' };
}
if (result.risk_score > 70) {
return { status: 'high_risk', action: 'manual_review' };
}
return { status: 'unknown', action: 'accept_with_monitoring' };
}
ã¬ãŒãå¶éãšæé©å
ã¡ãŒã«æ€èšŒ API ã¯ãå ¬å¹³ãªäœ¿çšãšã·ã¹ãã ã®å®å®æ§ã確ä¿ããããã«ã¬ãŒãå¶éãå®è£ ããŠããŸãã广çãªçµ±åã¯ãããã®å¶éãå°éããªãããã¹ã«ãŒããããæå€§åããŸãã
ã¬ãŒãå¶éã®çè§£
ã¬ãŒãå¶éã¯éåžžãè€æ°ã®ã¬ãã«ã§é©çšãããŸãïŒ
- ç§ãããã®ãªã¯ãšã¹ãæ°ïŒ1 ç§ãããã®æå€§ API åŒã³åºãæ°
- å/æéãããã®ãªã¯ãšã¹ãæ°ïŒæç¶çãªã¬ãŒãå¶é
- æ¥æ¬¡/ææ¬¡ã¯ã©ãŒã¿ïŒåèšæ€èšŒèš±å®¹é
- åææ¥ç¶æ°ïŒåæãªã¯ãšã¹ãå¶é
ã¬ãŒãå¶éæ å ±ã®ã¬ã¹ãã³ã¹ããããŒã確èªããŠãã ããïŒ
const response = await fetch('https://api.billionverify.com/v1/verify', {
// ... ãªã¯ãšã¹ããªãã·ã§ã³
});
const rateLimit = response.headers.get('X-RateLimit-Limit');
const remaining = response.headers.get('X-RateLimit-Remaining');
const resetTime = response.headers.get('X-RateLimit-Reset');
console.log(`Rate limit: ${remaining}/${rateLimit}, resets at ${resetTime}`);
ã¬ãŒãå¶éã®å®è£
å¶éã«éããã®ãé¿ããããã«ããªã¯ãšã¹ãã¬ãŒããç©æ¥µçã«ç®¡çããŸãïŒ
class RateLimiter {
constructor(requestsPerSecond) {
this.interval = 1000 / requestsPerSecond;
this.lastRequest = 0;
}
async waitForSlot() {
const now = Date.now();
const timeSinceLastRequest = now - this.lastRequest;
if (timeSinceLastRequest < this.interval) {
await sleep(this.interval - timeSinceLastRequest);
}
this.lastRequest = Date.now();
}
}
// äœ¿çšæ¹æ³
const limiter = new RateLimiter(10); // ç§ããã 10 ãªã¯ãšã¹ã
async function verifyEmailsWithRateLimit(emails) {
const results = [];
for (const email of emails) {
await limiter.waitForSlot();
const result = await verifyEmail(email);
results.push(result);
}
return results;
}
ãããåŠçã®æé©å
è€æ°ã®ã¡ãŒã«ãæ€èšŒããéã®å¹çãæå€§åããŸãïŒ
ããããšã³ããã€ã³ããäœ¿çš åã¡ãŒã«ã«å¯Ÿããåäžã®ãªã¯ãšã¹ãã¯ããããã¯ãŒã¯ã©ãŠã³ãããªãããç¡é§ã«ããŸããããããšã³ããã€ã³ãã¯ããªã¯ãšã¹ãããšã«è€æ°ã®ã¡ãŒã«ãæ€èšŒããŸãïŒ
// éå¹çïŒ100 ã®åå¥ãªã¯ãšã¹ã
for (const email of emails) {
await verifyEmail(email);
}
// å¹ççïŒ1 ã€ã®ããããªã¯ãšã¹ã
const results = await verifyEmailBatch(emails);
倧ããªãªã¹ãããã£ã³ã¯å éåžžã«å€§ããªãªã¹ããæé©ãªããããµã€ãºã«åå²ããŸãïŒ
function chunkArray(array, chunkSize) {
const chunks = [];
for (let i = 0; i < array.length; i += chunkSize) {
chunks.push(array.slice(i, i + chunkSize));
}
return chunks;
}
async function verifyLargeList(emails) {
const chunks = chunkArray(emails, 100); // ãããããã 100 ã¡ãŒã«
const results = [];
for (const chunk of chunks) {
const batchResults = await verifyEmailBatch(chunk);
results.push(...batchResults);
}
return results;
}
å¶éä»ã䞊ååŠç ã¬ãŒãå¶éãå°éããªãããè€æ°ã®ããããåæã«åŠçããŸãïŒ
async function verifyWithConcurrency(emails, concurrency = 5) {
const chunks = chunkArray(emails, 100);
const results = [];
for (let i = 0; i < chunks.length; i += concurrency) {
const batch = chunks.slice(i, i + concurrency);
const batchResults = await Promise.all(
batch.map(chunk => verifyEmailBatch(chunk))
);
results.push(...batchResults.flat());
}
return results;
}
ãã£ãã·ã³ã°æŠç¥
æ€èšŒçµæããã£ãã·ã¥ããããšã§ãAPI ã³ã¹ããåæžããç¹°ãè¿ãã¡ãŒã«ã®å¿çæéãæ¹åããŸãã
ãã€ãã£ãã·ã¥ããã
次ã®å Žåã«æ€èšŒçµæããã£ãã·ã¥ããŸãïŒ
- åãã¡ãŒã«ãè€æ°åæ€èšŒãããå¯èœæ§ããã
- ãªã¢ã«ã¿ã€ã æ€èšŒãéèŠã§ã¯ãªã
- ã³ã¹ãã®æé©åãéèŠ
次ã®å Žåã¯ãã£ãã·ã¥ããªãã§ãã ããïŒ
- 鮮床ãéèŠïŒäŸïŒé«é¡ååŒïŒ
- ãŠãŒã¹ã±ãŒã¹ã§ã¡ãŒã«ã®ã¹ããŒã¿ã¹ãé »ç¹ã«å€ãã
- ã¹ãã¬ãŒãžã³ã¹ãã API ã³ã¹ããè¶ ãã
ãã£ãã·ã¥ã®å®è£
class VerificationCache {
constructor(ttlMs = 24 * 60 * 60 * 1000) { // ããã©ã«ã 24 æé TTL
this.cache = new Map();
this.ttl = ttlMs;
}
get(email) {
const entry = this.cache.get(email.toLowerCase());
if (!entry) return null;
if (Date.now() > entry.expiry) {
this.cache.delete(email.toLowerCase());
return null;
}
return entry.result;
}
set(email, result) {
this.cache.set(email.toLowerCase(), {
result,
expiry: Date.now() + this.ttl
});
}
}
// äœ¿çšæ¹æ³
const cache = new VerificationCache();
async function verifyEmailCached(email) {
const cached = cache.get(email);
if (cached) {
return { ...cached, fromCache: true };
}
const result = await verifyEmail(email);
cache.set(email, result);
return { ...result, fromCache: false };
}
ãã£ãã·ã¥ TTL ã®èæ ®äºé
çµæã¿ã€ããç°ãªãã°ããã£ãã·ã¥æéãç°ãªããŸãïŒ
| çµæã¿ã€ã | æšå¥š TTL | çç± |
|---|---|---|
| ç¡å¹ãªæ§æ | 30 æ¥ | å€ãããªã |
| ãã¡ã€ã³ãååšããªã | 7 æ¥ | ãã¡ã€ã³ã¯ãã£ãã«çŸããªã |
| æå¹ + é ä¿¡å¯èœ | 24-48 æé | ã¹ããŒã¿ã¹ãå€ããå¯èœæ§ããã |
| äœ¿ãæšãŠ | 7 æ¥ | äœ¿ãæšãŠã¹ããŒã¿ã¹ã¯å®å® |
| ãã£ãããªãŒã« | 24 æé | èšå®ãå€ããå¯èœæ§ããã |
ã»ãã¥ãªãã£ã®ãã¹ããã©ã¯ãã£ã¹
å€éš API ã®çµ±åã¯ãèªèšŒä»¥å€ã®ã»ãã¥ãªãã£ã®èæ ®äºé ãå°å ¥ããŸãã
å ¥åæ€èšŒ
API ã«éä¿¡ããåã«ã¡ãŒã«ãæ€èšŒããŸãïŒ
function isValidEmailFormat(email) {
if (typeof email !== 'string') return false;
if (email.length > 254) return false;
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(email);
}
async function verifyEmailSafely(email) {
if (!isValidEmailFormat(email)) {
return { is_valid: false, reason: 'Invalid format' };
}
return await verifyEmail(email);
}
ã»ãã¥ã¢ãªãã°èšé²
å®å šãª API ããŒãæ©å¯ããŒã¿ããã°ã«èšé²ããªãã§ãã ããïŒ
function logApiRequest(email, response) {
// ãã°ã«èšé²ããªãïŒAPI ããŒãæ¬çªç°å¢ã§ã®å®å
šãªã¡ãŒã«ã¢ãã¬ã¹
console.log({
email_domain: email.split('@')[1],
status: response.status,
is_valid: response.is_valid,
timestamp: new Date().toISOString()
});
}
HTTPS ã®ã¿
API éä¿¡ã«ã¯åžžã« HTTPS ã䜿çšããŠãã ãããæ¬çªç°å¢ã§ã¯ SSL èšŒææžãæ€èšŒããŸãïŒ
// Node.js - æ¬çªç°å¢ã§èšŒææžæ€èšŒãç¡å¹ã«ããªãã§ãã ãã
const https = require('https');
const agent = new https.Agent({
rejectUnauthorized: true // ããã©ã«ãã§ãããæç€ºçã«
});
人æ°ã®ãã¬ãŒã ã¯ãŒã¯ãšã®çµ±å
Express.js ããã«ãŠã§ã¢
ã¡ãŒã«ç¢ºèªçšã®åå©çšå¯èœãªããã«ãŠã§ã¢ãäœæããŸãïŒ
const emailVerificationMiddleware = async (req, res, next) => {
const { email } = req.body;
if (!email) {
return next();
}
try {
const result = await verifyEmail(email);
req.emailVerification = result;
if (!result.is_valid) {
return res.status(400).json({
error: 'Invalid email address',
details: result
});
}
next();
} catch (error) {
// ãã§ã€ã«ãªãŒãã³ - API ãšã©ãŒã§ç»é²ããããã¯ããªã
req.emailVerification = { verified: false, error: error.message };
next();
}
};
// äœ¿çšæ¹æ³
app.post('/register', emailVerificationMiddleware, (req, res) => {
// req.emailVerification ã«ã¯æ€èšŒçµæãå«ãŸããŠããŸã
});
React Hook
ããã³ããšã³ãã¡ãŒã«æ€èšŒçšã®ã«ã¹ã¿ã ããã¯ãäœæããŸãïŒ
import { useState, useCallback } from 'react';
import debounce from 'lodash/debounce';
function useEmailVerification() {
const [result, setResult] = useState(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const verify = useCallback(
debounce(async (email) => {
if (!email || !email.includes('@')) {
setResult(null);
return;
}
setLoading(true);
setError(null);
try {
const response = await fetch('/api/verify-email', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email })
});
const data = await response.json();
setResult(data);
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
}, 500),
[]
);
return { verify, result, loading, error };
}
ç£èŠãšåæ
API 䜿çšç¶æ³ãšæ€èšŒçµæã远跡ããŠãçµ±åãæé©åããŸãã
ç£èŠãã¹ãäž»èŠã¡ããªã¯ã¹
- API ã¬ã¹ãã³ã¹æéïŒã¬ã€ãã³ã·ã®ãã¬ã³ãã远跡
- ãšã©ãŒçïŒã¿ã€ãå¥ã«é害ãç£èŠ
- ãã£ãã·ã¥ãããçïŒãã£ãã·ã³ã°ã®å¹æã枬å®
- æ€èšŒååžïŒæå¹/ç¡å¹/ãªã¹ã¯ã®ããŒã»ã³ããŒãžã远跡
- æ€èšŒãããã®ã³ã¹ãïŒå®éã®ã³ã¹ããèšç®
åæçšã®ãã°èšé²
function logVerification(email, result, metadata) {
const logEntry = {
timestamp: new Date().toISOString(),
email_domain: email.split('@')[1],
is_valid: result.is_valid,
is_deliverable: result.is_deliverable,
is_disposable: result.is_disposable,
risk_score: result.risk_score,
response_time_ms: metadata.responseTime,
from_cache: metadata.fromCache,
source: metadata.source // ç»é²ãã€ã³ããŒããªã©
};
// åæã·ã¹ãã ã«éä¿¡
analytics.track('email_verification', logEntry);
}
BillionVerify API çµ±å
BillionVerify ã¯ãéçºè åãã«èšèšãããå æ¬çãªã¡ãŒã«æ€èšŒ API ãæäŸããŸããåœç€Ÿã®é ä¿¡æ§ã¬ã€ãã§ã¯ API ã®æé©ãªäœ¿ç𿹿³ã«ã€ããŠã詳ãã解説ããŠããŸããAPI ã¯è€æ°ã®æ€èšŒæè¡ã 1 åã®åŒã³åºãã§çµã¿åãããè©³çŽ°ãªæŽå¯ãšãšãã«é«éã§æ£ç¢ºãªçµæãæäŸããŸãã
ã¯ã€ãã¯ã¹ã¿ãŒã
async function verifyWithBillionVerify(email) {
const response = await fetch('https://api.billionverify.com/v1/verify', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.BILLIONVERIFY_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ email })
});
return await response.json();
}
æ©èœ
- ãªã¢ã«ã¿ã€ã æ€èšŒïŒåäžã¡ãŒã«æ€èšŒã§ 1 ç§æªæºã®ã¬ã¹ãã³ã¹æé
- ãããåŠçïŒãªã¯ãšã¹ããããæå€§ 1000 ä»¶ã®ã¡ãŒã«ãæ€èšŒ
- ãã«ã¯ãã¡ã€ã«ã¢ããããŒãïŒéåæãžã§ãåŠçã§æ°çŸäžã®ã¬ã³ãŒããåŠç
- å æ¬çãªãã§ãã¯ïŒæ§æããã¡ã€ã³ãMXãSMTPãäœ¿ãæšãŠããã£ãããªãŒã«æ€åº
- ãªã¹ã¯ã¹ã³ã¢ãªã³ã°ïŒãã€ããªã®æå¹/ç¡å¹ãè¶ ãã埮åŠãªãªã¹ã¯è©äŸ¡
- ã¿ã€ãææ¡ïŒäžè¬çãªã¿ã€ããæ€åºããä¿®æ£ãææ¡
- Webhook ãµããŒãïŒãã«ã¯ãžã§ãå®äºã®éç¥ãåä¿¡
API ããã¥ã¡ã³ãã¯ããã¹ãŠã®ãšã³ããã€ã³ããã¬ã¹ãã³ã¹åœ¢åŒãããã³è€æ°ã®ããã°ã©ãã³ã°èšèªã§ã®çµ±åäŸã«é¢ãã詳现æ å ±ãæäŸããŸãã
ãŸãšã
ã¡ãŒã«æ€èšŒ API ã®çµ±åã¯ãã¢ããªã±ãŒã·ã§ã³ãã¡ãŒã«ããŒã¿å質ãåŠçããæ¹æ³ãå€é©ããŸããç»é²æã®ãªã¢ã«ã¿ã€ã æ€èšŒããæ¢åãªã¹ãã®ãããåŠçãŸã§ãAPI ã¯æ€èšŒã·ã¹ãã ã®æ§ç¯ãšç¶æã®è€éããªãã«ãå æ¬çãªã¡ãŒã«ç¢ºèªã®ããã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãæäŸããŸãã
çµ±åãæåãããããã®éèŠãªãã€ã³ãïŒ
- ãŠãŒã¹ã±ãŒã¹ã«é©ãããšã³ããã€ã³ããéžæïŒãªã¢ã«ã¿ã€ã ã«ã¯åäžæ€èšŒãäžèŠæš¡ãªã¹ãã«ã¯ããããå€§èŠæš¡ããŒã¿ã»ããã«ã¯ãã«ã¯ã¢ããããŒã
- å ç¢ãªãšã©ãŒãã³ããªã³ã°ãå®è£ ïŒãªãã©ã€ããžãã¯ãšã°ã¬ãŒã¹ãã«ãã°ã©ããŒã·ã§ã³
- ã¬ãŒãå¶éãå°éïŒã¯ã©ã€ã¢ã³ãåŽã®ã¹ããããªã³ã°ãšå¹ççãªãããåŠç
- æŠç¥çã«ãã£ãã·ã¥ïŒã³ã¹ããåæžãããã©ãŒãã³ã¹ãåäž
- ç£èŠãšåæïŒæ€èšŒçµæãç¶ç¶çã«æ¹å
æ°ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããå Žåã§ããæ¢åã®ã·ã¹ãã ãæ¹åããå Žåã§ããBillionVerify ã®ãããªã¡ãŒã«æ€èšŒ API ã¯ãããŒã¿ããŒã¹å ã®ãã¹ãŠã®ã¡ãŒã«ã¢ãã¬ã¹ãæå¹ã§ãé ä¿¡å¯èœã§ãå®å šã«äœ¿çšã§ããããšãä¿èšŒããããã«å¿ èŠãªããŒã«ãæäŸããŸãã
仿¥ããçµ±åãéå§ããŠããããã§ãã·ã§ãã«ãªã¡ãŒã«ããªããŒã¿ãŒãã¢ããªã±ãŒã·ã§ã³ã®ããŒã¿å質ãšã¡ãŒã«é ä¿¡æ§ã«ããããéããäœéšããŠãã ããã