ã¡ãŒã«æ§ææ€èšŒã¯ãããããå ç¢ãªã¡ãŒã«æ€èšŒã·ã¹ãã ã®åºç€ã圢æããŸããã¡ãŒã«ã¢ãã¬ã¹ãå®éã«ååšããããã¡ãã»ãŒãžãåä¿¡ã§ãããã確èªããåã«ããŸãã¢ãã¬ã¹ãæ£ãã圢åŒã«åŸã£ãŠããããšã確èªããå¿ èŠããããŸããããã¯ç°¡åã«èŠããŸãããã¡ãŒã«ã¢ãã¬ã¹æ€èšŒã«ã¯ãå€ãã®éçºè ãé©ãããè€éããé ãããŠããŸããã¡ãŒã«ããªããŒã·ã§ã³ã®åŸ®åŠãªéããçè§£ããããšã§ãããåªããã¡ãŒã«æ€èšŒããŒã«ãæ§ç¯ããæå¹ãªã¢ãã¬ã¹ãæåŠããããäžæ£ãªåœ¢åŒã®ã¢ãã¬ã¹ãåãå ¥ããããããšãã£ãäžè¬çãªèœãšã穎ãåé¿ã§ããŸãã
ã¡ãŒã«ã¢ãã¬ã¹ã®æ§é ãçè§£ãã
ãã¹ãŠã®ã¡ãŒã«ã¢ãã¬ã¹ã¯ãã@ãèšå·ã§åºåããã2ã€ã®äž»èŠéšåã§æ§æãããŠããŸã:ããŒã«ã«éšåãšãã¡ã€ã³éšåã§ããå®å
šãªæ§é 㯠local-part@domain ãšãããã¿ãŒã³ã«åŸããŸããããã¯åçŽã«èŠããŸãããåéšåã管çããèŠå(äž»ã«RFC 5321ãšRFC 5322ã§å®çŸ©ãããŠããŸã)ã¯ãå€ãã®åºæ¬çãªã¡ãŒã«æ€èšŒæ£èŠè¡šçŸãã¿ãŒã³ãæ£ããåŠçã§ããªãããªãã®å€åã蚱容ããŠããŸãã
ããŒã«ã«éšå
ããŒã«ã«éšåã¯ã@ãèšå·ã®åã«è¡šç€ºãããã¡ãŒã«ãµãŒããŒäžã®ç¹å®ã®ã¡ãŒã«ããã¯ã¹ãèå¥ããŸããããŒã«ã«éšåã§æå¹ãªæåã«ã¯ä»¥äžãå«ãŸããŸã:
- 倧æåãšå°æåã®è±å(A-Zãa-z)
- æ°å(0-9)
- ç¹æ®æå: ! # $ % & ' * + - / = ? ^ _ ` { | } ~
- ããªãªã(.)ã¯å é ãŸãã¯æ«å°Ÿã«ãªããé£ç¶ããŠããªãå Žå
- ã¹ããŒã¹ãç¹æ®æåãå«ãã»ãŒãã¹ãŠã®æåãèš±å¯ããåŒçšç¬Šä»ãæåå
ãã®æè»æ§ã«ãããuser+tag@domain.comã"john doe"@example.comãadmin!special@company.org ã®ãããªã¢ãã¬ã¹ã¯ãã¹ãŠã仿§ã«åŸã£ãŠæè¡çã«æå¹ã§ããé床ã«å¶éçãªã¡ãŒã«ç¢ºèªããŒã«ã¯ããããã®æ£åœãªã¢ãã¬ã¹ã誀ã£ãŠæåŠããå¯èœæ§ããããŸãã
ãã¡ã€ã³éšå
ãã¡ã€ã³éšåã¯ã@ãèšå·ã®åŸã«ç¶ããã¡ãŒã«ãé ä¿¡ãããå Žæãæå®ããŸããæå¹ãªãã¡ã€ã³åœ¢åŒã«ã¯ä»¥äžãå«ãŸããŸã:
- æšæºãã¡ã€ã³å(example.comãmail.company.org)
- éASCIIæåãå«ãåœéåãã¡ã€ã³å
- æ¬åŒ§å ã®IPã¢ãã¬ã¹([192.168.1.1] ãŸã㯠[IPv6:2001:db8::1])
ãã¡ã€ã³åã¯DNSåœåèŠåã«åŸãå¿ èŠããããŸã:ããªãªãã§åºåãããã©ãã«ãåã©ãã«ã¯è±æ°åã§å§ãŸãè±æ°åã§çµãããéã«ã¯è±æ°åãšãã€ãã³ã®ã¿ãå«ãŸããŸãã
ã¡ãŒã«æ€èšŒæ£èŠè¡šçŸã®èª²é¡
RFC仿§ã«åŸã£ãŠã¡ãŒã«ã¢ãã¬ã¹ãæ£ç¢ºã«æ€èšŒããæ£èŠè¡šçŸãã¿ãŒã³ãäœæããããšã¯ãéåžžã«å°é£ã§ããéçºè ãäžè¬çã«å®è£ ãããã®ãšãæšæºãå®éã«èš±å¯ãããã®ãšã®éã®ã®ã£ããã¯ãäžçäžã®ã¡ãŒã«æ€èšŒãµãŒãã¹ã§ç¶ç¶çãªåé¡ãåŒãèµ·ãããŠããŸãã
åçŽãªæ£èŠè¡šçŸãã¿ãŒã³ã倱æããçç±
å€ãã®ãã¥ãŒããªã¢ã«ãã³ãŒãäŸã§ã¯ã次ã®ãããªé床ã«åçŽåãããã¡ãŒã«ããªããŒã·ã§ã³æ£èŠè¡šçŸãã¿ãŒã³ãæäŸãããŠããŸã:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
ãã®ãã¿ãŒã³ã¯æããã«ç¡å¹ãªã¢ãã¬ã¹ããã£ããããŸããã以äžãå«ãæå¹ãªã¢ãã¬ã¹ã誀ã£ãŠæåŠããŸã:
- ã¹ããŒã¹ãå«ãåŒçšç¬Šä»ãããŒã«ã«éšå
- ããŒã«ã«éšåã®
!ã#ãªã©ã®ç¹æ®æå - 1æåã®ãããã¬ãã«ãã¡ã€ã³(ã¯ããååšããŸã)
- IPã¢ãã¬ã¹ã®ãã¡ã€ã³éšå
éã«ããã®ãã¿ãŒã³ã¯ä»¥äžãå«ãç¡å¹ãªã¢ãã¬ã¹ãåãå ¥ããå¯èœæ§ããããŸã:
- ããŒã«ã«éšåã®é£ç¶ããããªãªã
- ããŒã«ã«éšåã®å é ãŸãã¯æ«å°Ÿã®ããªãªã
- ãã€ãã³ã§å§ãŸããŸãã¯çµãããã¡ã€ã³ã©ãã«
RFC 5322 æ£èŠè¡šçŸ
æªåé«ãRFC 5322æºæ ã®æ£èŠè¡šçŸã¯ãã¡ãŒã«æ§ææ€èšŒã®çã®è€éãã瀺ããŠããŸãããã®ãã¿ãŒã³ã¯è€æ°è¡ã«ããããå®å šãªä»æ§ããã£ããã£ããããšããŸã:
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
ãã®æ£èŠè¡šçŸã¯ããæ£ç¢ºã§ãããã¡ã³ããã³ã¹ã®æªå€¢ãããã©ãŒãã³ã¹ã®æžå¿µããããã°ã®èª²é¡ãåŒãèµ·ãããŸãããããèªä¿¡ãæã£ãŠèªãã ã倿Žãããã§ããéçºè ã¯ã»ãšãã©ãããããã®è€éãã¯ç¹å®ã®æ£èŠè¡šçŸãšã³ãžã³ã§å£æ» çãªããã¯ãã©ããã³ã°ãåŒãèµ·ããå¯èœæ§ããããŸãã
å®çšçãªã¡ãŒã«æ€èšŒæ£èŠè¡šçŸãã¿ãŒã³
å®ç§ãªRFCæºæ ã远æ±ããã®ã§ã¯ãªããã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãæ£ç¢ºããšä¿å®æ§ã®ãã©ã³ã¹ãåãå®çšçãªæ£èŠè¡šçŸãã¿ãŒã³ããå©çãåŸãŸããç®æšã¯ãå®éã®ãŠãŒã¶ãŒãå®éã«äœ¿çšããã¡ãŒã«åœ¢åŒãåãå ¥ããªãããæ¬åœã«ç¡å¹ãªã¢ãã¬ã¹ããã£ããããããšã§ãã
æšå¥šãããæ±çšãã¿ãŒã³
ã»ãšãã©ã®ãŠã§ãã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã®ãã©ã³ã¹ã®åããã¡ãŒã«ããªããŒã·ã§ã³æ£èŠè¡šçŸãããŸãæ©èœããŸã:
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
ãã®ãã¿ãŒã³ã¯ä»¥äžãä¿èšŒããŸã:
- @ã®åã«å°ãªããšã1æå
- æ£ç¢ºã«1ã€ã®@èšå·
- @ãšæåŸã®ããªãªãã®éã«å°ãªããšã1æå
- æåŸã®ããªãªãã®åŸã«å°ãªããšã1æå
- ã¢ãã¬ã¹ã®ã©ãã«ã空çœããªã
RFCå®å šã§ã¯ãããŸãããããã®ãã¿ãŒã³ã¯äºå®äžãã¹ãŠã®å®éã®ã¡ãŒã«ã¢ãã¬ã¹ãåãå ¥ããªãããæçœãªåœ¢åŒãšã©ãŒãæåŠããŸãã
ããå³å¯ãªå¶éãæã€åŒ·åãã¿ãŒã³
ããå³å¯ãªã¡ãŒã«æ€èšŒãå¿ èŠãšããã¢ããªã±ãŒã·ã§ã³ã®å Žåã¯ã以äžãæ€èšããŠãã ãã:
const strictEmailRegex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
ãã®ãã¿ãŒã³ã¯ä»¥äžã远å ããŸã:
- ããŒã«ã«éšåã®æç€ºçãªæåãã¯ã€ããªã¹ã
- ãã¡ã€ã³ã©ãã«é·ã®å¶é(æå€§63æå)
- ãã¡ã€ã³å¢çã§ã®é£ç¶ãããã€ãã³ã®é²æ¢
èšèªåºæã®å®è£
ç°ãªãããã°ã©ãã³ã°èšèªã¯ãã¡ãŒã«æ€èšŒæ£èŠè¡šçŸãç°ãªãæ¹æ³ã§åŠçããŸããäžè¬çãªèšèªã®æé©åããããã¿ãŒã³ã¯æ¬¡ã®ãšããã§ã:
JavaScript:
function validateEmailSyntax(email) {
const pattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return pattern.test(email) && email.length <= 254;
}
Python:
import re
def validate_email_syntax(email):
pattern = r'^[^\s@]+@[^\s@]+\.[^\s@]+$'
if len(email) > 254:
return False
return bool(re.match(pattern, email))
PHP:
function validateEmailSyntax($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
PHPã®çµã¿èŸŒã¿ filter_var 颿°ã¯ãã«ã¹ã¿ã æ£èŠè¡šçŸãã¿ãŒã³ãå¿
èŠãšããã«ãåççãªã¡ãŒã«æ§ææ€èšŒãæäŸããããšã«æ³šæããŠãã ããã
åºæ¬æ§æãè¶ ããŠ:é·ãã®å¶çŽ
ã¡ãŒã«æ§ææ€èšŒã¯ãæ£èŠè¡šçŸãã¿ãŒã³ã ãã§ã¯é©åã«å¯ŸåŠã§ããªãé·ãã®å¶çŽã匷å¶ããå¿ èŠããããŸãã
å šäœã®é·ãå¶é
RFC 5321ã¯ãã¡ãŒã«ã¢ãã¬ã¹ãåèš254æåãè¶ ããããšãã§ããªãããšãæå®ããŠããŸãããã®å¶éã¯ãããŒã«ã«éšåã@èšå·ããã¡ã€ã³éšåãçµã¿åãããå®å šãªã¢ãã¬ã¹ã«é©çšãããŸãã
ããŒã«ã«éšåã®é·ã
ããŒã«ã«éšåã¯64æåãè¶ ããããšãã§ããŸãããããŒã«ã«éšåãé·ãã¢ãã¬ã¹ã¯ãæ£èŠè¡šçŸãã¿ãŒã³ã«äžèŽããŠããŠãæåŠããå¿ èŠããããŸãã
ãã¡ã€ã³ã®é·ã
åã ã®ãã¡ã€ã³ã©ãã«ã¯63æåãè¶ ããããšãã§ããããã¡ã€ã³éšåå šäœã¯253æåãè¶ ããããšãã§ããŸããããããã®å¶éã¯ãã¡ãŒã«æšæºã§ã¯ãªãDNS仿§ããæŽŸçããŠããŸãã
é·ããã§ãã¯ã®å®è£
åžžã«æ£èŠè¡šçŸããªããŒã·ã§ã³ãšæç€ºçãªé·ããã§ãã¯ãçµã¿åãããŠãã ãã:
function validateEmail(email) {
// é·ãã®å¶çŽ
if (email.length > 254) return false;
const [localPart, domain] = email.split('@');
if (!localPart || !domain) return false;
if (localPart.length > 64) return false;
if (domain.length > 253) return false;
// åã
ã®ãã¡ã€ã³ã©ãã«ããã§ãã¯
const labels = domain.split('.');
for (const label of labels) {
if (label.length > 63) return false;
}
// æ£èŠè¡šçŸããªããŒã·ã§ã³
const pattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return pattern.test(email);
}
ããããã¡ãŒã«æ§ææ€èšŒã®ééã
äžè¬çãªããªããŒã·ã§ã³ã®ééããçè§£ããããšã§ãããåªããã¡ãŒã«æ€èšŒããŒã«ãæ§ç¯ãã誀ã£ãæåŠã§ãŠãŒã¶ãŒãå°ãããããšãé¿ããããšãã§ããŸãã
TLDé·ã®èŠæ±
äžéšã®ãã¿ãŒã³ã§ã¯ããããã¬ãã«ãã¡ã€ã³ãå°ãªããšã2æåãŸãã¯3æåã§ããå¿ èŠããããŸãã.comã.orgã.netãªã©ã®äžè¬çãªTLDã¯3æå以äžã§ãããæå¹ãª1æåã®TLDãååšããæ°ããgTLDã¯é·ãã倧ããç°ãªããŸãã
ãã©ã¹èšå·ã®ãããã¯
ãã©ã¹èšå·(+)ã¯ã¡ãŒã«ã¢ãã¬ã¹ã®ããŒã«ã«éšåã§æå¹ã§ãããã¡ãŒã«ã¿ã°ä»ãã«ãã䜿çšãããŸã(äŸ:user+newsletter@gmail.com)ããã©ã¹èšå·ããããã¯ãããšããŠãŒã¶ãŒãã¡ãŒã«ãæŽçã§ããªããªãããã¯ãŒãŠãŒã¶ãŒãå°ãããŸãã
ç¹å®ã®æåã®èŠæ±
äžéšã®ããªããŒã¿ã¯ãããŒã«ã«éšåã«ç¹å®ã®æå(å°ãªããšã1ã€ã®æåãªã©)ãå¿
èŠãšããŸãã123@domain.com ã®ãããªã¢ãã¬ã¹ã¯å®å
šã«æå¹ã§ãããæã
䜿çšãããŸãã
倧æåå°æåã®åºå¥ã®ä»®å®
ãã¡ã€ã³éšåã¯å€§æåå°æåãåºå¥ããŸããããããŒã«ã«éšåã¯RFC 5321ã«ããã°æè¡çã«ã¯å€§æåå°æåãåºå¥ããŸãããã ããã»ãšãã©ã®ææ°ã®ã¡ãŒã«ãµãŒããŒã¯å®éã«ã¯ããŒã«ã«éšåã倧æåå°æåãåºå¥ããªããã®ãšããŠæ±ããŸããããªããŒã¿ã¯ä»»æã®å€§æåå°æåãåãå ¥ããã¹ãã§ãããä¿åæã«ã¯å°æåã«æ£èŠåããå¿ èŠããããŸãã
åœéæåã®æåŠ
ææ°ã®ã¡ãŒã«æšæºã¯ãããŒã«ã«éšåãšãã¡ã€ã³éšåã®äž¡æ¹ã§éASCIIæåãå«ãåœéåã¡ãŒã«ã¢ãã¬ã¹(EAI)ããµããŒãããŠããŸããå®å šãªEAIãµããŒãã¯ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã«å¿ èŠã§ã¯ãªããããããŸããããASCIIã«å¶éãããã¿ãŒã³ãæå¹ãªåœéã¢ãã¬ã¹ãæåŠããå¯èœæ§ãããããšã«æ³šæããŠãã ããã
ç°ãªãã³ã³ããã¹ãã§ã®ã¡ãŒã«æ§ææ€èšŒ
é©åãªã¡ãŒã«åœ¢åŒæ€èšŒã®ã¬ãã«ã¯ãç¹å®ã®ãŠãŒã¹ã±ãŒã¹ãšãªã¹ã¯èš±å®¹åºŠã«ãã£ãŠç°ãªããŸãã
ãŠãŒã¶ãŒç»é²ãã©ãŒã
ãµã€ã³ã¢ãããã©ãŒã ã®å Žåã¯ãå³å¯ãªæ€èšŒããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåªå ããŠãã ãããæ§æçã«æå¹ãªå¹ åºãã¢ãã¬ã¹ãåãå ¥ãã確èªã¡ãŒã«ã«äŸåããŠé ä¿¡å¯èœæ§ã確èªããŠãã ãããçãããæå¹ãªã¢ãã¬ã¹ãæåŠãããšããŠãŒã¶ãŒãå°ããããµã€ã³ã¢ããã倱ãå¯èœæ§ããããŸãã
APIå ¥åæ€èšŒ
APIã¯ãæããã«äžæ£ãªåœ¢åŒã®ããŒã¿ãã·ã¹ãã ã«å ¥ãã®ãé²ãããã«å ¥åãæ€èšŒããå¿ èŠããããŸããé©åºŠãªããªããŒã·ã§ã³ãã¿ãŒã³ã¯ãæ£åœãªã¢ãã¬ã¹ãåãå ¥ããã®ã«ååãªæè»æ§ãä¿ã¡ãªãããæ©æã«ãšã©ãŒããã£ããããŸãã
ã¡ãŒã«ããŒã±ãã£ã³ã°ãªã¹ã
ã€ã³ããŒããããã¡ãŒã«ãªã¹ããåŠçããå Žåã¯ãããé«äŸ¡ãªæ€èšŒãã§ãã¯ã®åã®æåã®ãã£ã«ã¿ãŒãšããŠæ§ææ€èšŒãé©çšããŠãã ãããããã«ãããæããã«ã¡ãŒã«ãåä¿¡ã§ããªã圢åŒãšã©ãŒãã¿ã€ããã¹ããã°ããæé€ã§ããŸãã
é«ã»ãã¥ãªãã£ã¢ããªã±ãŒã·ã§ã³
ã¡ãŒã«ã¢ãã¬ã¹ã®åŠ¥åœæ§ã®é«ãä¿èšŒãå¿ èŠãšããã¢ããªã±ãŒã·ã§ã³ã®å Žåãæ§ææ€èšŒã¯æåã®ã¹ãããã«ãããŸãããMXã¬ã³ãŒãæ€èšŒãSMTPæ€èšŒãBillionVerifyã®ãããªãããã§ãã·ã§ãã«ãªã¡ãŒã«æ€èšŒãµãŒãã¹ãšçµã¿åãããŠãå æ¬çãªã¡ãŒã«ããªããŒã·ã§ã³ãå®çŸããŠãã ããã
ã¡ãŒã«æ€èšŒã«ãããæ§ææ€èšŒã®åœ¹å²
ã¡ãŒã«æ§ææ€èšŒã¯ãå®å šãªã¡ãŒã«æ€èšŒæŠç¥ã«ããã1ã€ã®å±€ã«ãããŸãããæ§ææ€èšŒãä»ã®æ€èšŒæ¹æ³ãšã©ã®ããã«é©åããããçè§£ããããšã§ã广çãªã¡ãŒã«ç¢ºèªã·ã¹ãã ãæ§ç¯ã§ããŸãã
æ€èšŒéå±€
å æ¬çãªã¡ãŒã«æ€èšŒããã»ã¹ã¯éåžžãæ¬¡ã®é åºã«åŸããŸã:
- æ§ææ€èšŒ - 圢åŒãã§ãã¯(ãã®èšäºã®çŠç¹)
- ãã¡ã€ã³æ€èšŒ - ãã¡ã€ã³ãååšããããšã確èª
- MXã¬ã³ãŒããã§ã㯠- ã¡ãŒã«ãµãŒããŒãèšå®ãããŠããããšã確èª
- SMTPæ€èšŒ - ç¹å®ã®ã¡ãŒã«ããã¯ã¹ãååšããããšã確èª
- é ä¿¡å¯èœæ§è©äŸ¡ - ãã£ãããªãŒã«ãã¡ã€ã³ã圹å²ããŒã¹ã®ã¢ãã¬ã¹ãäœ¿ãæšãŠã¡ãŒã«ã®ãã§ãã¯
æ§ææ€èšŒã¯æ©æã«å®äŸ¡ã«å€±æããŸããåºæ¬çãªåœ¢åŒãã§ãã¯ããã¹ããªãã¢ãã¬ã¹ã¯ãããé«äŸ¡ãªæ€èšŒã¹ãããã«é²ãããšã¯ãªããèšç®ãªãœãŒã¹ãšAPIåŒã³åºããç¯çŽããŸãã
ãããã§ãã·ã§ãã«ãµãŒãã¹ãšã®çµã¿åãã
æ§ææ€èšŒã瀟å ã§å®è£ ããããšã¯ã§ããŸãããBillionVerifyã®ãããªãããã§ãã·ã§ãã«ãªã¡ãŒã«æ€èšŒãµãŒãã¹ã¯å®å šãªæ€èšŒãã€ãã©ã€ã³ãåŠçããŸããBillionVerify APIã¯ãå æ¬çãªã¡ãŒã«æ€èšŒã®äžéšãšããŠæ§ææ€èšŒãå®è¡ãããã¡ã€ã³ãã§ãã¯ãSMTPæ€èšŒããã£ãããªãŒã«æ€åºãäœ¿ãæšãŠã¡ãŒã«èå¥ãåäžã®APIåŒã³åºãã§çµã¿åãããŸãã
async function verifyEmail(email) {
// ã¯ã©ã€ã¢ã³ãåŽã®è¿
éãªæ§æãã§ãã¯
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
return { valid: false, reason: 'Invalid syntax' };
}
// BillionVerify 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 })
});
return await response.json();
}
ãã®ã¢ãããŒãã¯ãæçœãªæ§æãšã©ãŒã«å¯ŸããŠå³åº§ã«ãã£ãŒãããã¯ãæäŸããªãããå æ¬çãªæ€èšŒãå°éã®ã¡ãŒã«æ€èšŒãµãŒãã¹ã«å§ä»»ããŸãã
ããã©ãŒãã³ã¹ã®èæ ®äºé
ã¡ãŒã«ããªããŒã·ã§ã³æ£èŠè¡šçŸã®ããã©ãŒãã³ã¹ã¯ã倧éã®ã¢ãã¬ã¹ãåŠçããå Žåããªã¢ã«ã¿ã€ã ã¡ãŒã«æ€èšŒãå®è£ ããå Žåã«éèŠã§ãã
æ£èŠè¡šçŸãšã³ãžã³ã®éã
ç°ãªãããã°ã©ãã³ã°èšèªã¯ãç°ãªãããã©ãŒãã³ã¹ç¹æ§ãæã€ç°ãªãæ£èŠè¡šçŸãšã³ãžã³ã䜿çšããŸããç¹å®ã®èšèªãšã©ã³ã¿ã€ã ç°å¢ã§ãã¿ãŒã³ããã¹ãããŠãã ããã
壿» çãªããã¯ãã©ããã³ã°
ãã¹ããããéæå®åãæã€è€éãªæ£èŠè¡šçŸãã¿ãŒã³ã¯ã壿» çãªããã¯ãã©ããã³ã°ãåŒãèµ·ããå¯èœæ§ããããæ£èŠè¡šçŸãšã³ãžã³ãç¹å®ã®å ¥åã§ææ°é¢æ°çã«é·ãæéããããŸããæç¢ºãªä»£æ¿å¢çãæã€åçŽãªãã¿ãŒã³ã¯ããã®åé¡ãåé¿ããŸãã
äžåºŠã³ã³ãã€ã«ããŠäœåºŠã䜿çš
å€ãã®ã¡ãŒã«ã¢ãã¬ã¹ãæ€èšŒããå Žåã¯ãæ£èŠè¡šçŸãã¿ãŒã³ãäžåºŠã³ã³ãã€ã«ããŠåå©çšããŠãã ãã:
// æªãäŸ:åŒã³åºãããšã«æ£èŠè¡šçŸãã³ã³ãã€ã«
function validateMany(emails) {
return emails.filter(email => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email));
}
// è¯ãäŸ:äžåºŠã³ã³ãã€ã«
const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
function validateMany(emails) {
return emails.filter(email => emailPattern.test(email));
}
äžæ¬æ€èšŒæŠç¥
å€§èŠæš¡ãªãªã¹ãã®äžæ¬ã¡ãŒã«æ€èšŒã®å Žåã¯ãæ§ææ€èšŒãããªãã£ã«ã¿ãŒãšããŠãããã§ã¢ãã¬ã¹ãåŠçããŸã:
async function bulkVerify(emails) {
const syntaxPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
// æ§ææ€èšŒã§ããªãã£ã«ã¿ãŒ
const syntaxValid = emails.filter(email =>
syntaxPattern.test(email) && email.length <= 254
);
// æ§æçã«æå¹ãªã¡ãŒã«ã¢ãã¬ã¹ã®ã¿ãAPIã«éä¿¡
const results = await billionVerifyBulkCheck(syntaxValid);
// çµæãæ§æå€±æãšçµã¿åããã
return emails.map(email => {
if (!syntaxPattern.test(email) || email.length > 254) {
return { email, valid: false, reason: 'Invalid syntax' };
}
return results.find(r => r.email === email);
});
}
ã¡ãŒã«ããªããŒã¿ã®ãã¹ã
培åºçãªãã¹ãã«ãããã¡ãŒã«æ§ææ€èšŒããšããžã±ãŒã¹ãæ£ããåŠçããããšãä¿èšŒãããŸãã
æå¹ãªã¢ãã¬ã¹ã®ãã¹ãã±ãŒã¹
ããªããŒã¿ã¯ä»¥äžã®æå¹ãªã¢ãã¬ã¹ãåãå ¥ããå¿ èŠããããŸã:
simple@example.com very.common@example.com disposable.style.email.with+symbol@example.com other.email-with-hyphen@example.com fully-qualified-domain@example.com user.name+tag+sorting@example.com x@example.com example-indeed@strange-example.com example@s.example user-@example.org postmaster@[123.123.123.123]
ç¡å¹ãªã¢ãã¬ã¹ã®ãã¹ãã±ãŒã¹
ããªããŒã¿ã¯ä»¥äžã®ç¡å¹ãªã¢ãã¬ã¹ãæåŠããå¿ èŠããããŸã:
Abc.example.com (@æåãªã) A@b@c@example.com (è€æ°ã®@æå) a"b(c)d,e:f;g<h>i[j\k]l@example.com (åŒçšç¬Šå ã«ãªãç¹æ®æå) just"not"right@example.com (åŒçšç¬Šä»ãæååã¯åç¬ã§ããå¿ èŠããããŸã) this is"not\allowed@example.com (ã¹ããŒã¹ãšåŒçšç¬Š) this\ still\"not\\allowed@example.com (ããã¯ã¹ã©ãã·ã¥) .user@example.com (å é ã®ããªãªã) user.@example.com (æ«å°Ÿã®ããªãªã) user..name@example.com (é£ç¶ããããªãªã)
èªåãã¹ã
ã¡ãŒã«ããªããŒã¿ã®èªåãã¹ããå®è£ ããŠãã ãã:
const validEmails = [
'test@example.com',
'user+tag@domain.org',
'first.last@subdomain.example.co.uk',
// ãã¹ãã±ãŒã¹ã远å
];
const invalidEmails = [
'not-an-email',
'missing@tld',
'@no-local-part.com',
// ãã¹ãã±ãŒã¹ã远å
];
describe('Email Syntax Validation', () => {
validEmails.forEach(email => {
it(`should accept ${email}`, () => {
expect(validateEmail(email)).toBe(true);
});
});
invalidEmails.forEach(email => {
it(`should reject ${email}`, () => {
expect(validateEmail(email)).toBe(false);
});
});
});
ãªã¢ã«ã¿ã€ã ã¡ãŒã«æ€èšŒã®ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã§ã¡ãŒã«æ§ææ€èšŒãå®è£ ããã«ã¯ãå³åº§ã®ãã£ãŒãããã¯ãšåªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®ãã©ã³ã¹ãåãå¿ èŠããããŸãã
ããªããŒã·ã§ã³ã®ã¿ã€ãã³ã°
ããŒã¹ãããŒã¯ããšã«æ€èšŒããªãã§ãã ãããããã«ããããŠãŒã¶ãŒãå ¥åããŠããéã«äžå¿«ãªãšã¯ã¹ããªãšã³ã¹ãçãŸããŸãã代ããã«:
// ãã£ãŒã«ãããã©ãŒã«ã¹ã倱ã£ããšãã«æ€èšŒ(blur)
emailInput.addEventListener('blur', () => {
validateAndShowFeedback(emailInput.value);
});
// ãŸãã¯ãŠãŒã¶ãŒãå
¥åã忢ããåŸã«æ€èšŒ(ãããŠã³ã¹)
let timeout;
emailInput.addEventListener('input', () => {
clearTimeout(timeout);
timeout = setTimeout(() => {
validateAndShowFeedback(emailInput.value);
}, 500);
});
ãšã©ãŒã¡ãã»ãŒãžã®æç¢ºæ§
æ§ææ€èšŒã倱æããå Žåã¯ãæç¢ºãªã¬ã€ãã³ã¹ãæäŸããŠãã ãã:
function getValidationMessage(email) {
if (!email.includes('@')) {
return 'ã¡ãŒã«ã¢ãã¬ã¹ã«@èšå·ãå«ããŠãã ãã';
}
const [local, domain] = email.split('@');
if (!domain) {
return '@èšå·ã®åŸã«ãã¡ã€ã³ãå
¥åããŠãã ãã';
}
if (!domain.includes('.')) {
return 'æå¹ãªãã¡ã€ã³ãå
¥åããŠãã ãã(äŸ:example.com)';
}
if (email.length > 254) {
return 'ã¡ãŒã«ã¢ãã¬ã¹ãé·ãããŸã';
}
return 'æå¹ãªã¡ãŒã«ã¢ãã¬ã¹ãå
¥åããŠãã ãã';
}
èŠèŠçãã£ãŒãããã¯
æ€èšŒãé©åãªèŠèŠçãã£ãŒãããã¯(è²ãã¢ã€ã³ã³ãã¢ãã¡ãŒã·ã§ã³)ãšçµã¿åãããŠãéªéã«ãªããã«æå¹ãŸãã¯ç¡å¹ãªç¶æ ã瀺ããŸãã
åœéåã¡ãŒã«ã¢ãã¬ã¹ã®ãµããŒã
ææ°ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãéASCIIæåãå«ãåœéåã¡ãŒã«ã¢ãã¬ã¹ããµããŒãããå¿ èŠãå¢ããŠããŸãã
EAIæšæº
Email Address Internationalization(EAI)ã¯ä»¥äžãèš±å¯ããŸã:
- ããŒã«ã«éšåã®Unicodeæå
- ãã¡ã€ã³éšåã®åœéåãã¡ã€ã³å(IDN)
çšæ·@äŸå.äžåœ ã®ãããªã¢ãã¬ã¹ã¯ãEAIæšæºã§ã¯æå¹ã§ãã
å®çšçãªèæ ®äºé
EAIãµããŒãã¯æ¡å€§ããŠããŸããã以äžã®èŠå ãèæ ®ããŠãã ãã:
- ãã¹ãŠã®ã¡ãŒã«ãµãŒããŒãEAIããµããŒãããŠããããã§ã¯ãªã
- å€ãã®ã¡ãŒã«æ€èšŒãµãŒãã¹ã¯åœéã¢ãã¬ã¹ãå®å šã«ãµããŒãããŠããªãå¯èœæ§ããã
- éã©ãã³æåã®ãŠãŒã¶ãŒå ¥åæ¹æ³ã¯ç°ãªã
- ä¿åãšæ¯èŒã«ã¯Unicodeæ£èŠåãå¿ èŠ
ã¢ããªã±ãŒã·ã§ã³ãåœéçãªãŠãŒã¶ãŒã察象ãšããŠããå Žåã¯ãã¡ãŒã«ããªããŒã·ã§ã³ãšæ€èšŒãã€ãã©ã€ã³ã§EAIãµããŒãããã¹ãããŠãã ããã
çµè«
ã¡ãŒã«æ§ææ€èšŒã¯ãããããã¡ãŒã«æ€èšŒã·ã¹ãã ã«ãããéèŠãªæåã®é²è¡ç·ãšããŠæ©èœããŸããã¿ã¹ã¯ã¯åçŽã«èŠããŸããã¡ãŒã«ã¢ãã¬ã¹ãæ£ãã圢åŒã«åŸã£ãŠãããã©ããããã§ãã¯ããããšã§ãããã¡ãŒã«æšæºã®åŸ®åŠãªéãã«ãããé©ãã¹ãè€éããçããŸãã
ã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãå®çšçãªã¢ãããŒããæé©ã§ã:æçœãªåœ¢åŒãšã©ãŒããã£ããããªãããæ£åœãªã¡ãŒã«ã¢ãã¬ã¹ã®å€§éšåãåãå ¥ããåççãªæ£èŠè¡šçŸãã¿ãŒã³ã䜿çšããŠãã ããããããæç€ºçãªé·ããã§ãã¯ãšçµã¿åãããå æ¬çãªã¡ãŒã«æ€èšŒã®ããã«ã¯ããã¡ã€ã³ãã§ãã¯ãSMTPæ€èšŒãéä¿¡è è©äŸ¡ãå«ãå®å šãªã¡ãŒã«æ€èšŒã®äžéšãšããŠæ§ææ€èšŒãåŠçããBillionVerifyã®ãããªãããã§ãã·ã§ãã«ãµãŒãã¹ãå©çšããŠãã ããã
æ§ææ€èšŒã ãã§ã¯ãã¡ãŒã«ã¢ãã¬ã¹ãå®éã«ååšããããã¡ãã»ãŒãžãåä¿¡ã§ãããã確èªã§ããªãããšãå¿ããªãã§ãã ãããããã¯åã«ãã¢ãã¬ã¹ãæåŸ ããã圢åŒã«åŸã£ãŠããããšã確èªããã ãã§ããçã®ã¡ãŒã«æ€èšŒãšããªããŒã·ã§ã³ã«ã¯ãå®å šãªãã€ãã©ã€ã³ãå¿ èŠã§ã:æ§æãã§ãã¯ããã¡ã€ã³æ€èšŒãMXã¬ã³ãŒãæ€èšŒãSMTPæ€èšŒãããã³ãã£ãããªãŒã«ãã¡ã€ã³ãäœ¿ãæšãŠã¡ãŒã«ã圹å²ããŒã¹ã®ã¢ãã¬ã¹ã®ç¹æ®ãªãã§ãã¯ã
ã·ã³ãã«ãªãµã€ã³ã¢ãããã©ãŒã ãæ§ç¯ããŠããå Žåã§ããæŽç·Žãããã¡ãŒã«ããŒã±ãã£ã³ã°ãã©ãããã©ãŒã ãæ§ç¯ããŠããå Žåã§ããã¡ãŒã«æ§ææ€èšŒãçè§£ããããšã§ããŠãŒã¹ã±ãŒã¹ã«é©ããé©åãªã¬ãã«ã®ãã§ãã¯ã«ã€ããŠæ å ±ã«åºã¥ããæ±ºå®ãäžãããšãã§ããŸãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåªå ããåççãªããªããŒã·ã§ã³ããå§ããæ§ææ€èšŒã§ã¯æäŸã§ããªãããæ·±ããã§ãã¯ã«ã€ããŠã¯ãå æ¬çãªã¡ãŒã«æ€èšŒãµãŒãã¹ã«äŸåããŠãã ããã
æ£ç¢ºããšãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®äž¡æ¹ã念é ã«çœ®ããŠã¡ãŒã«ããªããŒã¿ãæ§ç¯ãã倿§ãªå®éã®ã¢ãã¬ã¹ã§åŸ¹åºçã«ãã¹ãããBillionVerifyã®ãããªãããã§ãã·ã§ãã«ãªã¡ãŒã«æ€èšŒAPIãšçµ±åããŠãã¡ãŒã«ããŒã¿å質ã«å®å šãªèªä¿¡ãæã£ãŠãã ããã
詳现ã«ã€ããŠã¯ãã¡ãŒã«æ€èšŒãšã¡ãŒã«ãªã¹ãã®ã¯ãªãŒãã³ã°ã®ã¬ã€ããã芧ãã ããããŸããã¡ãŒã«é ä¿¡æ§ã¬ã€ãã§ãæ§ææ€èšŒãããåºãæ€èšŒæŠç¥ã«ã©ã®ããã«é©åãããã«ã€ããŠè©³ãã説æããŠããŸãã