TEXT   17

email verify txt

Guest on 24th July 2022 03:32:37 PM

  1. # a simplyfied email address check wrt. RFC2822
  2. # i.e.
  3. #       - display name is not supported
  4. #       - obsolete specs are not honored
  5. #       - [content] folding whitespaces are not allowed
  6. # AND
  7. #       - quoted-string is not allowed (and thus no control characters)
  8. #       - domain-literal is not allowed
  9. # so:
  10. atext                   =       ALPHA / DIGIT / "!" / "#" / "$" / "%" / "&" / "'" / "*" /
  11.                                         "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|"
  12.                                         / "}" / "~"
  13. dot-atom-text   =       1*atext *("." 1*atext)
  14. dot-atom                =       dot-atom-text
  15. qtext                   =       NO-WS-CTL / %d33 / %d35-91 / %d93-126
  16. text                    =       %d1-9 / %d11 / %d12 / %d14-127
  17. quoted-pair             =       "\" text
  18. qcontent                =       qtext / quoted-pair
  19. quoted-string   =       DQUOTE *qcontent DQUOTE
  20. local-part              =       dot-atom / quoted-string
  21. NO-WS-CTL               =       %d1-8 / %d11 / %d12 / %d14-31 / %d127
  22. dtext                   =       NO-WS-CTL / %d33-90 / %d94-126
  23. dcontent                =       dtext / quoted-pair
  24. domain-literal  =       "[" *dcontent "]"
  25. domain                  =       dot-atom / domain-literal
  26. addr-spec               =       local-part "@" domain
  27.  
  28. DQUOTE                  =       %d34
  29. text                    =       %d1-9 / %d11 / %d12 / %d14-127
  30.  
  31.  
  32. # gets reduced to
  33. atext                   =       ALPHA / DIGIT / "!" / "#" / "$" / "%" / "&" / "'" / "*" /
  34.                                         "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|"
  35.                                         / "}" / "~"
  36. dot-atom-text   =       1*atext *("." 1*atext)
  37. dot-atom                =       dot-atom-text
  38. local-part              =       dot-atom
  39. domain                  =       dot-atom
  40. addr-spec               =       local-part "@" domain   = dot-atom "@" dot-atom
  41.  
  42. # which yields e.g. to:
  43. #Java:
  44. static final String atext = "[\\p{Graph}&&[^\"(),.:;<>@\\[\\]]]";
  45. static final Pattern dotatom =
  46.         Pattern.compile("^" + atext + "+(?:\\." + atext + "+)*$");
  47.  
  48. public final String checkEmailAddr(String addr) {
  49.         if (addr == null) {
  50.                 return "null address";
  51.         }
  52.         int idx = addr.indexOf('@');
  53.         if (idx == -1) {
  54.                 return "invalid address";
  55.         }
  56.         String localPart = addr.substring(0,idx);
  57.         Matcher matcher = dotatom.matcher(localPart);
  58.         if (!matcher.matches()) {
  59.                 return "unsupported local-part '" + localPart + "'";
  60.         }
  61.         String domain =  addr.substring(idx+1);
  62.         matcher.reset(domain);
  63.         if (!matcher.matches()) {
  64.                  return "unsupported domain '" + domain + "'";
  65.         }
  66.         return checkDomain(domain);
  67. }
  68.  
  69. # RFC 1035 + 1101
  70. let-dig         = ALPHA / DIGIT
  71. let-dig-hyp     = let-dig / "-"
  72. label           = let-dig *( *let-dig-hyp let-dig)
  73. subdomain       = label *("." label)
  74. domain          = subdomain / " "
  75.  
  76. static final Pattern domainLabelPattern =
  77.         "^[\\p{Alpha}\\p{Digit}]+(?:-+[\\p{Alpha}\\p{Digit}]+)*$";
  78.  
  79. public final String checkDomain(String domain) {
  80.         if (domain.length() > 255) {
  81.                 return "Domain too long";
  82.         }
  83.         String[] label = domain.split("\\.");
  84.         // we require to have at least two labels and the last two ones must have
  85.         // at least 2 characters
  86.         int count = label.length-1;
  87.         if (count < 1 || label[count].length() < 2 || label[count-1].length() < 2)
  88.         {
  89.                 return "invalid domain";
  90.         }
  91.         Matcher m = domainLabelPattern.matcher("");
  92.         for (count; count >= 0; count--) {
  93.                 if (label[count].length > 63) {
  94.                         return "label too long";
  95.                 }
  96.                 m.reset(label[count]);
  97.                 if (!m.matches()) {
  98.                         return "invalid domain";
  99.                 }
  100.         }
  101.         // everything else wrt. domain should be checked via CIDR
  102.         return null;
  103. }
  104.  
  105.  
  106. OR Javascript:
  107.  
  108. function checkemail(str) {
  109.         var idx = str.indexOf("@");
  110.         if (idx == -1) {
  111.                 return false;
  112.         }
  113.         var localPart = str.substr(0,idx);
  114.         // var atext = "[a-zA-Z0-9!#$%&'*+-/=?^_`{|}~]";
  115.         // "^" + atext + "+(?:\." + atext + "+)*$"
  116.         var dotatom = /^[-a-zA-Z0-9!#$%&'*+/=?^_`{|}~]+(?:\.[-a-zA-Z0-9!#$%&'*+/=?^_`{|}~]+)*$/ ;
  117.         // even more simplified to avoid trouble with other languages
  118.         // var dotatom = /^[-a-zA-Z0-9%&+=?_~]+(?:\.[-a-zA-Z0-9%&+=?_~]+)*$/ ;
  119.     if (!dotatom.test(localPart)) {
  120.         return false;
  121.     }
  122.     var domain = str.substr(idx+1);
  123.     if (!dotatom.test(domain)) {
  124.         return false;
  125.     }
  126.     if (domain.length > 255) {
  127.         return false; // domain too long
  128.     }
  129.     var label = domain.split("\.");
  130.     var count = label.length-1;
  131.     if (count < 1 || label[count].length < 2 || label[count-1].length < 2) {
  132.         return false; // top and 2nd level domain too short
  133.     }
  134.     var domainLabel = /^[a-zA-Z0-9]+(?:-+[a-zA-Z0-9]+)*$/;
  135.     for (; count >= 0; count--) {
  136.         if (label[count].length > 63) {
  137.                 return false; // subdomain too long
  138.         }
  139.         if (!domainLabel.test(label[count])) {
  140.                 return false; // invalid characters
  141.         }
  142.     }
  143.     // even if numerical IPs are allowed, we choose to not accept them and avoid
  144.     // CIDR check
  145.     var tldIP = /[0-9]+$/ ;
  146.     var allIP = /^[0-9]+(?:\.[0-9]+)*$/ ;
  147.     if (tldIP.test(domain) || allIP.test(domain)) {
  148.         return false;
  149.     }
  150.     return true;
  151. }

Raw Paste


Login or Register to edit or fork this paste. It's free.