सबसे अच्छा जावा ईमेल पता सत्यापन विधि क्या है? [बन्द है]


247

जावा के लिए अच्छा ईमेल पता सत्यापन पुस्तकालय क्या हैं? क्या वैधीकरण के लिए कोई विकल्प हैं ?


15
मैं बस इसे यहाँ छोड़ दूँगा: davidcelis.com/blog/2012/09/06/…
mpenkov

4
कॉमन्स के लिए वर्तमान URL: commons.apache.org/proper/commons-validator/apidocs/org/apache/…
james.garriss

आप पुस्तकालयों (या regexes) का उपयोग नहीं करना चाहते हैं जो बड़े पैमाने पर मान्य नहीं हैं। वैध ईमेल पते की जटिलता के कारण, कोई सत्यापन और व्यापक सत्यापन के बीच कोई मध्य-मैदान नहीं है। अपाचे कॉमन्स का कार्यान्वयन व्यापक नहीं है। मुझे केवल एक पुस्तकालय के बारे में पता है, जो है ( ईमेल- rfc2822-validator ), लेकिन यह अभी भी बहुत बड़ी संख्या में काम करता है। एक व्यापक लेक्सर वह है जो आप वास्तव में चाहते हैं। EmailValidator4J का कहना है कि यह काम करता है, लेकिन मेरे पास इसका अनुभव नहीं है।
बेनी बोटेमा

1
@BennyBottema कमेंट्री के साथ प्रश्न को संपादित करने के बजाय, कृपया यह चर्चा करने के लिए मेटा पोस्ट करें कि यदि आपके पास अभी भी प्रश्न हैं तो इसे बंद क्यों किया गया।
१६:४

जवाबों:


134

Apache Commons को आमतौर पर एक ठोस परियोजना के रूप में जाना जाता है। ध्यान रखें, हालांकि, आपको अभी भी पते पर एक सत्यापन ईमेल भेजना होगा यदि आप यह सुनिश्चित करना चाहते हैं कि यह एक वास्तविक ईमेल है, और यह कि स्वामी आपकी साइट पर इसका उपयोग करना चाहता है।

EDIT : एक बग था जहां यह डोमेन पर बहुत अधिक प्रतिबंधात्मक था, जिससे यह नए TLD के मान्य ईमेल को स्वीकार नहीं करता था।

इस बग को कॉमन्स-वैलिडेटर संस्करण 1.4.1 में 03 / जनवरी / 15 02:48 को हल किया गया था


1
मैं आपके द्वारा उद्धृत अतिरिक्त बिट्स से सहमत हूं, लेकिन क्या वे कॉमन्स सत्यापन परियोजना का हिस्सा हैं?
duffymo

2
नहीं, Apache EmailValidatorवर्ग सत्यापन के लिए एक ईमेल संदेश नहीं भेजता है।
मैथ्यू फ्लैशेन

3
यदि आपका उपयोग मामला किसी उपयोगकर्ता के दूरस्थ ईमेल पते को मान्य करने के लिए है, तो इस समाधान में काफी खामियां हैं (InternetAddress.validate () के समान): EmailValidator उपयोगकर्ता को [@ 10.9.8.7] एक वैध ईमेल पते के रूप में मानता है - जो उनके अनुसार है RFC, लेकिन शायद उपयोगकर्ता पंजीकरण / संपर्क फ़ॉर्म के लिए नहीं।
zillion1

1
@zillion, जिसे Apache COmmons में प्रलेखित किया गया है: "यह कार्यान्वयन एक ईमेल पते में सभी संभावित त्रुटियों को पकड़ने की गारंटी नहीं है।" और मैंने कहा कि आपको यह सुनिश्चित करने के लिए क्या करना है "यह एक वास्तविक ईमेल है"। स्थानीय आईपी के साथ पते दुर्लभ वातावरण में मान्य हो सकते हैं, हालांकि।
मैथ्यू फ्लेशेन

5
Apache Commons EmailValidator में एक गंभीर खामी है: IDN का समर्थन नहीं करता है।
पिओन

261

आधिकारिक जावा ईमेल पैकेज का उपयोग करना सबसे आसान है:

public static boolean isValidEmailAddress(String email) {
   boolean result = true;
   try {
      InternetAddress emailAddr = new InternetAddress(email);
      emailAddr.validate();
   } catch (AddressException ex) {
      result = false;
   }
   return result;
}

59
ध्यान दें कि InternetAddress.validate () उपयोगकर्ता @ [10.9.8.7] और उपयोगकर्ता @ लोकलहोस्ट को मान्य ईमेल पते के रूप में मानता है - जो कि वे RFC के अनुसार हैं। हालाँकि, उपयोग के मामले (वेब ​​फॉर्म) के आधार पर, आप उन्हें अमान्य मान सकते हैं।
8

8
न केवल @ zillion1 के रूप में मान्य है, बल्कि bla @ bla जैसी चीजों को भी मान्य माना जाता है। वास्तव में सबसे अच्छा समाधान नहीं।
डिएगो प्लेंटज़

4
@ निकोलसटॉली कॉटरेल यह जावा है, यहां हम अपवादों को फेंकते हैं और पकड़ते हैं, मैं वास्तव में आपकी बात नहीं
मानता हूं

17
मुझे संदेह है कि InternetAddress कंस्ट्रक्टर के साथ छेड़छाड़ की गई है। या मेरे सिस्टम के साथ छेड़छाड़ की गई है। या RFC822 के साथ छेड़छाड़ की गई है। या मैं वास्तव में अभी कुछ नींद का उपयोग कर सकता हूं। लेकिन मैंने अभी कुछ कोड की कोशिश की और निम्नलिखित पांच तार सभी मान्य ई-मेल पते के रूप में पास हो जाते हैं यदि आप उन्हें इंटरनेटएड्रेस कंस्ट्रक्टर, और "स्पष्ट रूप से" पास करते हैं, तो वे मान्य नहीं हैं। ये हम चले: ., .com, com., abcऔर 123। इसके अलावा, श्वेत स्थान को जोड़ने या पीछे खींचने से तार भी अमान्य नहीं होते हैं। आप ही फैन्सला करें!
मार्टिन एंडरसन

4
जब मैं इसे चलाता हूं, तो पनीर, ठीक से फेल हो जाता है। क्या javax.mail पुस्तकालय आप को लिंक कर रहे हैं ???
एरोन डेविडसन

91

Apache Commons सत्यापनकर्ता का उपयोग अन्य उत्तरों में उल्लिखित के रूप में किया जा सकता है।

pom.xml:

<dependency>
    <groupId>commons-validator</groupId>
    <artifactId>commons-validator</artifactId>
    <version>1.4.1</version>
</dependency>

build.gradle:

compile 'commons-validator:commons-validator:1.4.1'

आयात:

import org.apache.commons.validator.routines.EmailValidator;

कोड:

String email = "myName@example.com";
boolean valid = EmailValidator.getInstance().isValid(email);

और स्थानीय पते की अनुमति देने के लिए

boolean allowLocal = true;
boolean valid = EmailValidator.getInstance(allowLocal).isValid(email);

2
एंड्रॉइड स्टूडियो में आप अपने एप्लिकेशन \ build.gradle की निर्भरता {}
Benjiko99

2
वास्तव में मेरी परियोजना के निर्माण की कोशिश के बाद, ऐसा लगता है कि अपाचे कॉमन्स एंड्रॉइड के साथ बहुत अच्छी तरह से काम नहीं करते हैं, सैकड़ों चेतावनियां और कुछ त्रुटियां हैं, यह भी संकलन नहीं किया था। यह वही है जो मैंने howtodoinjava.com/2014/11/11/java-regex-validate-email-address
Benjiko99

1
Benjiko99 के रूप में मेरे साथ भी यही समस्या है। निर्भरता जोड़ने के बाद, परियोजना अभ्यस्त संकलित करता है, java.exe गैर शून्य निकास कोड 2 के साथ समाप्त होता है
अमित मित्तल

1
मुझे एंड्रॉइड स्टूडियो में भी त्रुटियां हो रही थीं। मैं 1.4.1 से 1.5.1 में बदल गया और यह काम करता है!
मैट

1
नोट: org_apache.commons.validator.routines में Use_the Emailvalidator के बाद से org.apache.commons.validator में EmailValidator पदावनत हो गया है (मैं 1.6 कॉमन्स Validator का उपयोग कर रहा हूं
आशा है कि

71

देर से जवाब, लेकिन मुझे लगता है कि यह सरल और योग्य है:

    public boolean isValidEmailAddress(String email) {
           String ePattern = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$";
           java.util.regex.Pattern p = java.util.regex.Pattern.compile(ePattern);
           java.util.regex.Matcher m = p.matcher(email);
           return m.matches();
    }

परीक्षण के मामले :

यहां छवि विवरण दर्ज करें

उत्पादन उद्देश्य के लिए, डोमेन नाम सत्यापन नेटवर्क-वार किया जाना चाहिए।


40
यह एक बहुत ही क्रूर सादगीपूर्ण सत्यापनकर्ता है जो IDN के साथ अधिकांश RFC नियमों की उपेक्षा करता है। मैं किसी भी प्रोडक्शन क्वालिटी ऐप के लिए इसे क्लियर करूंगा।
म्लेच्छेटी

1
me@company.co.uk मान्य नहीं होगा ...
अलेक्जेंडर बुरकेविच

14
RFC द्वारा कवर की गई चीजों के लिए अपने स्वयं के रेगेक्स-आधारित सत्यापनकर्ता को रोल न करें।
जोश ग्लोवर

6
जब तक आप सामयिक फ्लैट टायर का बुरा नहीं मानते तब तक पहिया को
मजबूत

यह अच्छा है लेकिन सभी मामलों के लिए नहीं।
Andrain

21

यदि आप क्लाइंट से प्राप्त एक फॉर्म सत्यापन करने की कोशिश कर रहे हैं, या सिर्फ एक सेम सत्यापन - इसे सरल रखें। एक सख्त ईमेल करने के बजाय एक सख्त ईमेल सत्यापन करना और कुछ लोगों को अस्वीकार करना बेहतर है, (जैसे जब वे आपकी वेब सेवा के लिए पंजीकरण करने की कोशिश कर रहे हैं)। ईमेल के उपयोगकर्ता नाम भाग में लगभग कुछ भी और इतने सारे नए डोमेन को हर महीने शाब्दिक रूप से जोड़े जाने की अनुमति है (जैसे .company, .reprise, .estate), यह प्रतिबंधित नहीं होने के लिए सुरक्षित है:

Pattern pattern = Pattern.compile("^.+@.+\\..+$");
Matcher matcher = pattern.matcher(email);

3
यह वास्तव में एक अच्छा बिंदु है, किसी भी वाजिब ऐप के पास इस इनपुट को रोकने के लिए अन्य उपाय होने चाहिए, वैसे भी लाइन का शोषण होने से रोकने के लिए
१२'१४ को १२:०४

4
ट्रैप डॉट से बचने के लिए इसे "^ +। + @ (+ \ _। [^ \\।] +) + $" में कैसे बदलें?
ज़िंगांग हुआंग

7

इस प्रश्न के उत्तर में, यहां, लेकिन: मैं इस पते पर एक क्लास बनाए रखता हूं: http://lacinato.com/cm/software/emailrelated/emailaddress

यह लेस हेज़लवुड की कक्षा पर आधारित है, लेकिन इसमें कई सुधार हैं और कुछ बग्स को ठीक करता है। अपाचे लाइसेंस।

मेरा मानना ​​है कि यह जावा में सबसे अधिक सक्षम ईमेल पार्सर है, और मुझे अभी तक किसी भी भाषा में एक और सक्षम देखना है, हालांकि वहां कोई भी हो सकता है। यह एक लेसर-स्टाइल पार्सर नहीं है, लेकिन कुछ जटिल जावा रेगेक्स का उपयोग करता है, और इस प्रकार यह उतना कुशल नहीं है जितना कि हो सकता है, लेकिन मेरी कंपनी ने इसके साथ 10 बिलियन से अधिक वास्तविक दुनिया के पते प्राप्त किए हैं: यह निश्चित रूप से उच्च-प्रदर्शन में उपयोग करने योग्य है परिस्थिति। हो सकता है कि साल में एक बार यह एक ऐसा पता लगाएगा जो रेक्सक्स स्टैक ओवरफ़्लो (उचित रूप से) का कारण बनता है, लेकिन ये स्पैम पते हैं जो सैकड़ों या हजारों वर्णों के साथ कई उद्धरणों और कोष्ठकों और इसी तरह लंबे होते हैं।

RFC 2822 और संबंधित स्पेक्स ईमेल पतों के मामले में वास्तव में काफी स्वीकार्य हैं, इसलिए इस तरह का एक वर्ग अधिकांश उपयोगों के लिए ओवरकिल है। उदाहरण के लिए, कल्पना, रिक्त स्थान और सभी के अनुसार, एक वैध पता है:

"<bob \" (here) " < (hi there) "bob(the man)smith" (hi) @ (there) example.com (hello) > (again)

कोई मेल सर्वर इसकी अनुमति नहीं देगा, लेकिन यह वर्ग इसे पार्स कर सकता है (और इसे एक उपयोगी रूप में फिर से लिख सकता है)।

हमने मौजूदा जावा ईमेल पार्सर विकल्पों को अपर्याप्त रूप से टिकाऊ होने के लिए पाया (मतलब, उनमें से सभी कुछ मान्य पते पार्स नहीं कर सकते थे), इसलिए हमने यह वर्ग बनाया।

कोड अच्छी तरह से प्रलेखित है और इसमें कुछ ईमेल रूपों को अनुमति देने या अस्वीकार करने के लिए बहुत आसान-से-बदलाव विकल्प हैं। यह पते के कुछ हिस्सों (बाएँ हाथ की ओर, दाएँ हाथ की ओर, व्यक्तिगत नाम, टिप्पणियाँ, आदि) को एक्सेस करने, मेलबॉक्स-लिस्ट हेडर को पार्स / मान्य करने, रिटर्न-पथ को पार्स / वैलिडेट करने के लिए बहुत सारे तरीके प्रदान करता है। (जो हेडर के बीच अद्वितीय है), और इसके आगे।

कोड के रूप में लिखा एक javamail निर्भरता है, लेकिन अगर आप इसे प्रदान करता है मामूली कार्यक्षमता नहीं चाहते हैं तो इसे दूर करना आसान है।


1
नमस्ते, मैंने इसे खुले स्रोत समुदाय के लिए सार्वजनिक रूप से GitHub में कॉपी किया। अब हर कोई कोड पर टिप्पणी, दस्तावेज़ और सुधार कर सकता है। github.com/bbottema/email-rfc2822-validator । मैं लेस द्वारा पुराने संस्करण का उपयोग करता था, लेकिन मुझे रेगेक्स फ्रीजिंग बग्स के कारण इसे हटाना पड़ा: leshazlewood.com/2006/11/06/emailaddress-java-class/…
बेनी बोटेमा

7

मैं सोच रहा हूं कि @Emailहाइबरनेट वैलिडेटर के अतिरिक्त अवरोधों के कारण कोई भी क्यों नहीं आया । सत्यापनकर्ता ही है EmailValidator


हालांकि अपाचे कॉमन्स का एक विकल्प, इसका कार्यान्वयन अधिकांश रेगेक्स-आधारित पुस्तकालयों के रूप में अल्पविकसित है। डॉक्स से: "हालांकि, जैसा कि यह आलेख चर्चा करता है कि 100% आज्ञाकारी ईमेल सत्यापनकर्ता को लागू करने के लिए यह व्यावहारिक रूप से आवश्यक नहीं है"। एकमात्र रेगेक्स आधारित व्यापक सत्यापनकर्ता, जो मुझे पता है कि ईमेल- rfc2822- सत्यापनकर्ता है और अन्यथा EmailValidator4J आशाजनक है।
बेनी बोटेमा

5

लेस हेज़लवुड ने जावा नियमित अभिव्यक्तियों का उपयोग करते हुए एक बहुत ही गहन RFC 2822 आज्ञाकारी ईमेल सत्यापनकर्ता वर्ग लिखा है। आप इसे http://www.leshazlewood.com/?p=23 पर पा सकते हैं । हालांकि, इसकी पूरी तरह से (या जावा आरई कार्यान्वयन) अक्षमता की ओर जाता है - लंबे पते के लिए पार्सिंग समय के बारे में टिप्पणियों को पढ़ें।


1
मैंने लेस हेज़लवुड के उत्कृष्ट वर्ग (जिसमें कुछ कीड़े हैं) का निर्माण किया। (इस सवाल का मेरा अलग जवाब देखें।) हालांकि मैंने जावा रेगेक्स पद्धति को बनाए रखा है, हम इसे एक प्रदर्शन-महत्वपूर्ण वातावरण में ठीक उपयोग करते हैं। यदि आप जो कुछ कर रहे हैं वह पते को पार्स कर रहा है, तो प्रदर्शन एक मुद्दा हो सकता है, लेकिन अधिकांश उपयोगकर्ताओं के लिए मुझे संदेह होगा कि वे जो कुछ भी कर रहे हैं उसकी शुरुआत है। कक्षा के लिए मेरे अपडेट ने कई लंबी-पुनरावर्ती समस्याओं को भी ठीक किया।
lacinato

यह एक पुरानी लाइब्रेरी है और दो बार अंतत : ईमेल-rfc2822-validator द्वारा सुपरसीड की गई है । हालाँकि यह अभी भी सभी आधुनिक आवश्यकताओं को पूरा करता है, लेकिन यह अभी भी छिपे हुए प्रदर्शन बग्स से ग्रस्त है (और नए RFC स्पेक्स द्वारा सीमित बदलावों का समर्थन नहीं करता है)।
बेनी बोटेमा

3

मैंने Zend_Validator_Email में कुछ कोड डाले:

@FacesValidator("emailValidator")
public class EmailAddressValidator implements Validator {

    private String localPart;
    private String hostName;
    private boolean domain = true;

    Locale locale;
    ResourceBundle bundle;

    private List<FacesMessage> messages = new ArrayList<FacesMessage>();

    private HostnameValidator hostnameValidator;

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        setOptions(component);
        String email    = (String) value;
        boolean result  = true;
        Pattern pattern = Pattern.compile("^(.+)@([^@]+[^.])$");
        Matcher matcher = pattern.matcher(email);

        locale = context.getViewRoot().getLocale();
        bundle = ResourceBundle.getBundle("com.myapp.resources.validationMessages", locale);

        boolean length = true;
        boolean local  = true;

        if (matcher.find()) {
            localPart   = matcher.group(1);
            hostName    = matcher.group(2);

            if (localPart.length() > 64 || hostName.length() > 255) {
                length          = false;
                addMessage("enterValidEmail", "email.AddressLengthExceeded");
            } 

            if (domain == true) {
                hostnameValidator = new HostnameValidator();
                hostnameValidator.validate(context, component, hostName);
            }

            local = validateLocalPart();

            if (local && length) {
                result = true;
            } else {
                result = false;
            }

        } else {
            result          = false;
            addMessage("enterValidEmail", "invalidEmailAddress");
        }

        if (result == false) {
            throw new ValidatorException(messages);
        }

    }

    private boolean validateLocalPart() {
        // First try to match the local part on the common dot-atom format
        boolean result = false;

        // Dot-atom characters are: 1*atext *("." 1*atext)
        // atext: ALPHA / DIGIT / and "!", "#", "$", "%", "&", "'", "*",
        //        "+", "-", "/", "=", "?", "^", "_", "`", "{", "|", "}", "~"
        String atext = "a-zA-Z0-9\\u0021\\u0023\\u0024\\u0025\\u0026\\u0027\\u002a"
                + "\\u002b\\u002d\\u002f\\u003d\\u003f\\u005e\\u005f\\u0060\\u007b"
                + "\\u007c\\u007d\\u007e";
        Pattern regex = Pattern.compile("^["+atext+"]+(\\u002e+["+atext+"]+)*$");
        Matcher matcher = regex.matcher(localPart);
        if (matcher.find()) {
            result = true;
        } else {
            // Try quoted string format

            // Quoted-string characters are: DQUOTE *([FWS] qtext/quoted-pair) [FWS] DQUOTE
            // qtext: Non white space controls, and the rest of the US-ASCII characters not
            //   including "\" or the quote character
            String noWsCtl = "\\u0001-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f";
            String qText = noWsCtl + "\\u0021\\u0023-\\u005b\\u005d-\\u007e";
            String ws = "\\u0020\\u0009";

            regex = Pattern.compile("^\\u0022(["+ws+qText+"])*["+ws+"]?\\u0022$");
            matcher = regex.matcher(localPart);
            if (matcher.find()) {
                result = true;
            } else {
                addMessage("enterValidEmail", "email.AddressDotAtom");
                addMessage("enterValidEmail", "email.AddressQuotedString");
                addMessage("enterValidEmail", "email.AddressInvalidLocalPart");
            }
        }

        return result;
    }

    private void addMessage(String detail, String summary) {
        String detailMsg = bundle.getString(detail);
        String summaryMsg = bundle.getString(summary);
        messages.add(new FacesMessage(FacesMessage.SEVERITY_ERROR, summaryMsg, detailMsg));
    }

    private void setOptions(UIComponent component) {
        Boolean domainOption = Boolean.valueOf((String) component.getAttributes().get("domain"));
        //domain = (domainOption == null) ? true : domainOption.booleanValue();
    }
}

एक मेजबाननाम सत्यापनकर्ता निम्नानुसार है:

@FacesValidator("hostNameValidator")
public class HostnameValidator implements Validator {

    private Locale locale;
    private ResourceBundle bundle;
    private List<FacesMessage> messages;
    private boolean checkTld = true;
    private boolean allowLocal = false;
    private boolean allowDNS = true;
    private String tld;
    private String[] validTlds = {"ac", "ad", "ae", "aero", "af", "ag", "ai",
        "al", "am", "an", "ao", "aq", "ar", "arpa", "as", "asia", "at", "au",
        "aw", "ax", "az", "ba", "bb", "bd", "be", "bf", "bg", "bh", "bi", "biz",
        "bj", "bm", "bn", "bo", "br", "bs", "bt", "bv", "bw", "by", "bz", "ca",
        "cat", "cc", "cd", "cf", "cg", "ch", "ci", "ck", "cl", "cm", "cn", "co",
        "com", "coop", "cr", "cu", "cv", "cx", "cy", "cz", "de", "dj", "dk",
        "dm", "do", "dz", "ec", "edu", "ee", "eg", "er", "es", "et", "eu", "fi",
        "fj", "fk", "fm", "fo", "fr", "ga", "gb", "gd", "ge", "gf", "gg", "gh",
        "gi", "gl", "gm", "gn", "gov", "gp", "gq", "gr", "gs", "gt", "gu", "gw",
        "gy", "hk", "hm", "hn", "hr", "ht", "hu", "id", "ie", "il", "im", "in",
        "info", "int", "io", "iq", "ir", "is", "it", "je", "jm", "jo", "jobs",
        "jp", "ke", "kg", "kh", "ki", "km", "kn", "kp", "kr", "kw", "ky", "kz",
        "la", "lb", "lc", "li", "lk", "lr", "ls", "lt", "lu", "lv", "ly", "ma",
        "mc", "md", "me", "mg", "mh", "mil", "mk", "ml", "mm", "mn", "mo",
        "mobi", "mp", "mq", "mr", "ms", "mt", "mu", "museum", "mv", "mw", "mx",
        "my", "mz", "na", "name", "nc", "ne", "net", "nf", "ng", "ni", "nl",
        "no", "np", "nr", "nu", "nz", "om", "org", "pa", "pe", "pf", "pg", "ph",
        "pk", "pl", "pm", "pn", "pr", "pro", "ps", "pt", "pw", "py", "qa", "re",
        "ro", "rs", "ru", "rw", "sa", "sb", "sc", "sd", "se", "sg", "sh", "si",
        "sj", "sk", "sl", "sm", "sn", "so", "sr", "st", "su", "sv", "sy", "sz",
        "tc", "td", "tel", "tf", "tg", "th", "tj", "tk", "tl", "tm", "tn", "to",
        "tp", "tr", "travel", "tt", "tv", "tw", "tz", "ua", "ug", "uk", "um",
        "us", "uy", "uz", "va", "vc", "ve", "vg", "vi", "vn", "vu", "wf", "ws",
        "ye", "yt", "yu", "za", "zm", "zw"};
    private Map<String, Map<Integer, Integer>> idnLength;

    private void init() {
        Map<Integer, Integer> biz = new HashMap<Integer, Integer>();
        biz.put(5, 17);
        biz.put(11, 15);
        biz.put(12, 20);

        Map<Integer, Integer> cn = new HashMap<Integer, Integer>();
        cn.put(1, 20);

        Map<Integer, Integer> com = new HashMap<Integer, Integer>();
        com.put(3, 17);
        com.put(5, 20);

        Map<Integer, Integer> hk = new HashMap<Integer, Integer>();
        hk.put(1, 15);

        Map<Integer, Integer> info = new HashMap<Integer, Integer>();
        info.put(4, 17);

        Map<Integer, Integer> kr = new HashMap<Integer, Integer>();
        kr.put(1, 17);

        Map<Integer, Integer> net = new HashMap<Integer, Integer>();
        net.put(3, 17);
        net.put(5, 20);

        Map<Integer, Integer> org = new HashMap<Integer, Integer>();
        org.put(6, 17);

        Map<Integer, Integer> tw = new HashMap<Integer, Integer>();
        tw.put(1, 20);

        Map<Integer, Integer> idn1 = new HashMap<Integer, Integer>();
        idn1.put(1, 20);

        Map<Integer, Integer> idn2 = new HashMap<Integer, Integer>();
        idn2.put(1, 20);

        Map<Integer, Integer> idn3 = new HashMap<Integer, Integer>();
        idn3.put(1, 20);

        Map<Integer, Integer> idn4 = new HashMap<Integer, Integer>();
        idn4.put(1, 20);

        idnLength = new HashMap<String, Map<Integer, Integer>>();

        idnLength.put("BIZ", biz);
        idnLength.put("CN", cn);
        idnLength.put("COM", com);
        idnLength.put("HK", hk);
        idnLength.put("INFO", info);
        idnLength.put("KR", kr);
        idnLength.put("NET", net);
        idnLength.put("ORG", org);
        idnLength.put("TW", tw);
        idnLength.put("ایران", idn1);
        idnLength.put("中国", idn2);
        idnLength.put("公司", idn3);
        idnLength.put("网络", idn4);

        messages = new ArrayList<FacesMessage>();
    }

    public HostnameValidator() {
        init();
    }

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        String hostName = (String) value;

        locale = context.getViewRoot().getLocale();
        bundle = ResourceBundle.getBundle("com.myapp.resources.validationMessages", locale);

        Pattern ipPattern = Pattern.compile("^[0-9a-f:\\.]*$", Pattern.CASE_INSENSITIVE);
        Matcher ipMatcher = ipPattern.matcher(hostName);
        if (ipMatcher.find()) {
            addMessage("hostname.IpAddressNotAllowed");
            throw new ValidatorException(messages);
        }

        boolean result = false;

        // removes last dot (.) from hostname 
        hostName = hostName.replaceAll("(\\.)+$", "");
        String[] domainParts = hostName.split("\\.");

        boolean status = false;

        // Check input against DNS hostname schema
        if ((domainParts.length > 1) && (hostName.length() > 4) && (hostName.length() < 255)) {
            status = false;

            dowhile:
            do {
                // First check TLD
                int lastIndex = domainParts.length - 1;
                String domainEnding = domainParts[lastIndex];
                Pattern tldRegex = Pattern.compile("([^.]{2,10})", Pattern.CASE_INSENSITIVE);
                Matcher tldMatcher = tldRegex.matcher(domainEnding);
                if (tldMatcher.find() || domainEnding.equals("ایران")
                        || domainEnding.equals("中国")
                        || domainEnding.equals("公司")
                        || domainEnding.equals("网络")) {



                    // Hostname characters are: *(label dot)(label dot label); max 254 chars
                    // label: id-prefix [*ldh{61} id-prefix]; max 63 chars
                    // id-prefix: alpha / digit
                    // ldh: alpha / digit / dash

                    // Match TLD against known list
                    tld = (String) tldMatcher.group(1).toLowerCase().trim();
                    if (checkTld == true) {
                        boolean foundTld = false;
                        for (int i = 0; i < validTlds.length; i++) {
                            if (tld.equals(validTlds[i])) {
                                foundTld = true;
                            }
                        }

                        if (foundTld == false) {
                            status = false;
                            addMessage("hostname.UnknownTld");
                            break dowhile;
                        }
                    }

                    /**
                     * Match against IDN hostnames
                     * Note: Keep label regex short to avoid issues with long patterns when matching IDN hostnames
                     */
                    List<String> regexChars = getIdnRegexChars();

                    // Check each hostname part
                    int check = 0;
                    for (String domainPart : domainParts) {
                        // Decode Punycode domainnames to IDN
                        if (domainPart.indexOf("xn--") == 0) {
                            domainPart = decodePunycode(domainPart.substring(4));
                        }

                        // Check dash (-) does not start, end or appear in 3rd and 4th positions
                        if (domainPart.indexOf("-") == 0
                                || (domainPart.length() > 2 && domainPart.indexOf("-", 2) == 2 && domainPart.indexOf("-", 3) == 3)
                                || (domainPart.indexOf("-") == (domainPart.length() - 1))) {
                            status = false;
                            addMessage("hostname.DashCharacter");
                            break dowhile;
                        }

                        // Check each domain part
                        boolean checked = false;

                        for (int key = 0; key < regexChars.size(); key++) {
                            String regexChar = regexChars.get(key);
                            Pattern regex = Pattern.compile(regexChar);
                            Matcher regexMatcher = regex.matcher(domainPart);
                            status = regexMatcher.find();
                            if (status) {
                                int length = 63;

                                if (idnLength.containsKey(tld.toUpperCase())
                                        && idnLength.get(tld.toUpperCase()).containsKey(key)) {
                                    length = idnLength.get(tld.toUpperCase()).get(key);
                                }

                                int utf8Length;
                                try {
                                    utf8Length = domainPart.getBytes("UTF8").length;
                                    if (utf8Length > length) {
                                        addMessage("hostname.InvalidHostname");
                                    } else {
                                        checked = true;
                                        break;
                                    }
                                } catch (UnsupportedEncodingException ex) {
                                    Logger.getLogger(HostnameValidator.class.getName()).log(Level.SEVERE, null, ex);
                                }


                            }
                        }


                        if (checked) {
                            ++check;
                        }
                    }

                    // If one of the labels doesn't match, the hostname is invalid
                    if (check != domainParts.length) {
                        status = false;
                        addMessage("hostname.InvalidHostnameSchema");

                    }
                } else {
                    // Hostname not long enough
                    status = false;
                    addMessage("hostname.UndecipherableTld");
                }

            } while (false);

            if (status == true && allowDNS) {
                result = true;
            }

        } else if (allowDNS == true) {
            addMessage("hostname.InvalidHostname");
            throw new ValidatorException(messages);
        }

        // Check input against local network name schema;
        Pattern regexLocal = Pattern.compile("^(([a-zA-Z0-9\\x2d]{1,63}\\x2e)*[a-zA-Z0-9\\x2d]{1,63}){1,254}$", Pattern.CASE_INSENSITIVE);
        boolean checkLocal = regexLocal.matcher(hostName).find();
        if (allowLocal && !status) {
            if (checkLocal) {
                result = true;
            } else {
                // If the input does not pass as a local network name, add a message
                result = false;
                addMessage("hostname.InvalidLocalName");
            }
        }


        // If local network names are not allowed, add a message
        if (checkLocal && !allowLocal && !status) {
            result = false;
            addMessage("hostname.LocalNameNotAllowed");
        }

        if (result == false) {
            throw new ValidatorException(messages);
        }

    }

    private void addMessage(String msg) {
        String bundlMsg = bundle.getString(msg);
        messages.add(new FacesMessage(FacesMessage.SEVERITY_ERROR, bundlMsg, bundlMsg));
    }

    /**
     * Returns a list of regex patterns for the matched TLD
     * @param tld
     * @return 
     */
    private List<String> getIdnRegexChars() {
        List<String> regexChars = new ArrayList<String>();
        regexChars.add("^[a-z0-9\\x2d]{1,63}$");
        Document doc = null;
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);

        try {
            InputStream validIdns = getClass().getClassLoader().getResourceAsStream("com/myapp/resources/validIDNs_1.xml");
            DocumentBuilder builder = factory.newDocumentBuilder();
            doc = builder.parse(validIdns);
            doc.getDocumentElement().normalize();
        } catch (SAXException ex) {
            Logger.getLogger(HostnameValidator.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(HostnameValidator.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParserConfigurationException ex) {
            Logger.getLogger(HostnameValidator.class.getName()).log(Level.SEVERE, null, ex);
        }

        // prepare XPath
        XPath xpath = XPathFactory.newInstance().newXPath();

        NodeList nodes = null;
        String xpathRoute = "//idn[tld=\'" + tld.toUpperCase() + "\']/pattern/text()";

        try {
            XPathExpression expr;
            expr = xpath.compile(xpathRoute);
            Object res = expr.evaluate(doc, XPathConstants.NODESET);
            nodes = (NodeList) res;
        } catch (XPathExpressionException ex) {
            Logger.getLogger(HostnameValidator.class.getName()).log(Level.SEVERE, null, ex);
        }


        for (int i = 0; i < nodes.getLength(); i++) {
            regexChars.add(nodes.item(i).getNodeValue());
        }

        return regexChars;
    }

    /**
     * Decode Punycode string
     * @param encoded
     * @return 
         */
    private String decodePunycode(String encoded) {
        Pattern regex = Pattern.compile("([^a-z0-9\\x2d]{1,10})", Pattern.CASE_INSENSITIVE);
        Matcher matcher = regex.matcher(encoded);
        boolean found = matcher.find();

        if (encoded.isEmpty() || found) {
            // no punycode encoded string, return as is
            addMessage("hostname.CannotDecodePunycode");
            throw new ValidatorException(messages);
        }

        int separator = encoded.lastIndexOf("-");
            List<Integer> decoded = new ArrayList<Integer>();
        if (separator > 0) {
            for (int x = 0; x < separator; ++x) {
                decoded.add((int) encoded.charAt(x));
            }
        } else {
            addMessage("hostname.CannotDecodePunycode");
            throw new ValidatorException(messages);
        }

        int lengthd = decoded.size();
        int lengthe = encoded.length();

        // decoding
        boolean init = true;
        int base = 72;
        int index = 0;
        int ch = 0x80;

        int indexeStart = (separator == 1) ? (separator + 1) : 0;
        for (int indexe = indexeStart; indexe < lengthe; ++lengthd) {
            int oldIndex = index;
            int pos = 1;
            for (int key = 36; true; key += 36) {
                int hex = (int) encoded.charAt(indexe++);
                int digit = (hex - 48 < 10) ? hex - 22
                        : ((hex - 65 < 26) ? hex - 65
                        : ((hex - 97 < 26) ? hex - 97
                        : 36));

                index += digit * pos;
                int tag = (key <= base) ? 1 : ((key >= base + 26) ? 26 : (key - base));
                if (digit < tag) {
                    break;
                }
                pos = (int) (pos * (36 - tag));
            }
            int delta = (int) (init ? ((index - oldIndex) / 700) : ((index - oldIndex) / 2));
            delta += (int) (delta / (lengthd + 1));
            int key;
            for (key = 0; delta > 910; key += 36) {
                delta = (int) (delta / 35);
            }
            base = (int) (key + 36 * delta / (delta + 38));
            init = false;
            ch += (int) (index / (lengthd + 1));
            index %= (lengthd + 1);
            if (lengthd > 0) {
                for (int i = lengthd; i > index; i--) {
                    decoded.set(i, decoded.get(i - 1));
                }
            }

            decoded.set(index++, ch);
        }

        // convert decoded ucs4 to utf8 string
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < decoded.size(); i++) {
            int value = decoded.get(i);
            if (value < 128) {
                sb.append((char) value);
            } else if (value < (1 << 11)) {
                sb.append((char) (192 + (value >> 6)));
                sb.append((char) (128 + (value & 63)));
            } else if (value < (1 << 16)) {
                sb.append((char) (224 + (value >> 12)));
                sb.append((char) (128 + ((value >> 6) & 63)));
                sb.append((char) (128 + (value & 63)));
            } else if (value < (1 << 21)) {
                sb.append((char) (240 + (value >> 18)));
                sb.append((char) (128 + ((value >> 12) & 63)));
                sb.append((char) (128 + ((value >> 6) & 63)));
                sb.append((char) (128 + (value & 63)));
            } else {
                addMessage("hostname.CannotDecodePunycode");
                throw new ValidatorException(messages);
            }
        }

        return sb.toString();

    }

    /**
     * Eliminates empty values from input array
     * @param data
     * @return 
     */
    private String[] verifyArray(String[] data) {
        List<String> result = new ArrayList<String>();
        for (String s : data) {
            if (!s.equals("")) {
                result.add(s);
            }
        }

        return result.toArray(new String[result.size()]);
    }
}

और अलग tisions के लिए regex पैटर्न के साथ एक validIDNs.xml (शामिल करने के लिए बहुत बड़ा :)

<idnlist>
    <idn>
        <tld>AC</tld>
        <pattern>^[\u002d0-9a-zà-öø-ÿāăąćĉċčďđēėęěĝġģĥħīįĵķĺļľŀłńņňŋőœŕŗřśŝşšţťŧūŭůűųŵŷźżž]{1,63}$</pattern>
    </idn>
    <idn>
        <tld>AR</tld>
        <pattern>^[\u002d0-9a-zà-ãç-êìíñ-õü]{1,63}$</pattern>
    </idn>
    <idn>
        <tld>AS</tld>
        <pattern>/^[\u002d0-9a-zà-öø-ÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĸĺļľłńņňŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźż]{1,63}$</pattern>
    </idn>
    <idn>
        <tld>AT</tld>
        <pattern>/^[\u002d0-9a-zà-öø-ÿœšž]{1,63}$</pattern>
    </idn>
    <idn>
        <tld>BIZ</tld>
        <pattern>^[\u002d0-9a-zäåæéöøü]{1,63}$</pattern>
        <pattern>^[\u002d0-9a-záéíñóúü]{1,63}$</pattern>
        <pattern>^[\u002d0-9a-záéíóöúüőű]{1,63}$</pattern>
    </id>
</idlist>

यह उत्तर स्पष्ट कारणों के लिए अब लागू नहीं है। यदि आप गैर-अंग्रेज़ी ई-मेल पते स्वीकार करना चाहते हैं तो TLD सत्यापन निकालें और यह संभवतः स्वीकार्य है।
क्रिस्टोफर श्नाइडर

3
public class Validations {

    private Pattern regexPattern;
    private Matcher regMatcher;

    public String validateEmailAddress(String emailAddress) {

        regexPattern = Pattern.compile("^[(a-zA-Z-0-9-\\_\\+\\.)]+@[(a-z-A-z)]+\\.[(a-zA-z)]{2,3}$");
        regMatcher   = regexPattern.matcher(emailAddress);
        if(regMatcher.matches()) {
            return "Valid Email Address";
        } else {
            return "Invalid Email Address";
        }
    }

    public String validateMobileNumber(String mobileNumber) {
        regexPattern = Pattern.compile("^\\+[0-9]{2,3}+-[0-9]{10}$");
        regMatcher   = regexPattern.matcher(mobileNumber);
        if(regMatcher.matches()) {
            return "Valid Mobile Number";
        } else {
            return "Invalid Mobile Number";
        }
    }

    public static void main(String[] args) {

        String emailAddress = "suryaprakash.pisay@gmail.com";
        String mobileNumber = "+91-9986571622";
        Validations validations = new Validations();
        System.out.println(validations.validateEmailAddress(emailAddress));
        System.out.println(validations.validateMobileNumber(mobileNumber));
    }
}

2

यदि आप यह सत्यापित करना चाहते हैं कि ईमेल पता मान्य है या नहीं, तो VRFY आपको कुछ रास्ता देगा। मैंने पाया है कि यह इंट्रानेट पतों (यानी आंतरिक साइटों के लिए ईमेल पतों) को मान्य करने के लिए उपयोगी है । हालाँकि यह इंटरनेट मेल सर्वरों के लिए कम उपयोगी है (इस पृष्ठ के शीर्ष पर स्थित कैवेट देखें)


2

हालांकि अपाचे कॉमन्स के लिए कई विकल्प हैं, लेकिन उनके कार्यान्वयन सबसे अच्छे रूप में अल्पविकसित हैं (जैसे अपाचे कॉमन्स के कार्यान्वयन स्वयं) और अन्य मामलों में भी गलत हैं।

मैं भी तथाकथित 'गैर-प्रतिबंधक' रेगेक्स से दूर रहूँगा; ऐसा कुछ भी नहीं है। उदाहरण के लिए @ संदर्भ के आधार पर कई बार अनुमति दी जाती है, आप कैसे जानते हैं कि आवश्यक एक है? साधारण रेगेक्स इसे नहीं समझेगा, भले ही ईमेल वैध होना चाहिए। कुछ भी अधिक जटिल त्रुटि-प्रवण हो जाता है या यहां तक ​​कि छिपे हुए प्रदर्शन हत्यारे भी होते हैं । आप इस तरह से कुछ कैसे बनाए रखने जा रहे हैं ?

एकमात्र व्यापक RFC आज्ञाकारी regex आधारित सत्यापनकर्ता जिसके बारे में मुझे पता है, वह है ईमेल-rfc2822-validator जिसका 'परिष्कृत' regex उचित रूप से ड्रेगन.जवा नाम से है । हालांकि, यह केवल पुराने RFC-2822 युक्ति का समर्थन करता है , हालाँकि आधुनिक आवश्यकताओं के लिए पर्याप्त उपयुक्त है (RFC-5322 इसे दैनिक उपयोग के मामलों के लिए पहले से ही दायरे से बाहर के क्षेत्रों में अपडेट करता है)।

लेकिन वास्तव में आप जो चाहते हैं वह एक ऐसा लेसर है जो एक स्ट्रिंग को ठीक से पार्स करता है और इसे RFC डमर के अनुसार घटक संरचना में तोड़ देता है। EmailValidator4J उस संबंध में आशाजनक लगता है, लेकिन अभी भी युवा और सीमित है।

एक अन्य विकल्प जो आपके पास है वेब्सगैस का उपयोग कर रहा है जैसे कि मेलगुन की लड़ाई-परीक्षण वाली सत्यापन वेब सेवा या मेलबॉक्लेयर एपीआई (बस पहले Google परिणाम लिया)। यह सख्ती से आरएफसी का अनुपालन नहीं है, लेकिन आधुनिक जरूरतों के लिए पर्याप्त रूप से काम करता है।


1

आप क्या सत्यापित करना चाहते हैं? ईमेल का पता?

ईमेल पता केवल उसके प्रारूप अनुरूपता के लिए जाँच की जा सकती है। : मानक देखें RFC2822 । ऐसा करने का सबसे अच्छा तरीका एक नियमित अभिव्यक्ति है। आप कभी नहीं जान पाएंगे कि क्या वास्तव में कोई ईमेल भेजे बिना मौजूद है।

मैंने कॉमन्स सत्यापनकर्ता की जाँच की। इसमें एक org.apache.commons.validator.EmailValidator वर्ग शामिल है। एक अच्छा प्रारंभिक बिंदु लगता है।


मुझे यकीन नहीं है कि रेगेक्स ऐसा करने का सबसे अच्छा तरीका है, यदि आप RFC को पत्र का अनुसरण करने का इरादा रखते हैं तो यह बहुत ही अपठनीय है
user2813274

@ User2813274 से सहमत होकर, आप एक उचित लेक्सर चाहते हैं, स्पेगेटी रेगेक्स नहीं।
बेनी बोटेमा

1

वर्तमान अपाचे कॉमन्स वैलिडेटर संस्करण 1.3.1 है

जो वर्ग मान्य करता है वह है org.apache.commons.validator.EmailValidator। यह org.apache.oro.text.perl.Perl5Util के लिए एक आयात है जो एक सेवानिवृत्त जकार्ता ORO परियोजना से है

BTW, मैंने पाया कि एक 1.4 संस्करण है, यहाँ एपीआई डॉक्स हैं । पर साइट यह कहते हैं: "अंतिम प्रकाशन: 05 मार्च 2008 | संस्करण: 1.4-स्नैपशॉट", लेकिन वह अंतिम नहीं है। केवल अपने आप को बनाने का तरीका (लेकिन यह स्नैपशॉट है, RELEASE नहीं) और यहाँ से उपयोग करें, या डाउनलोड करें । इसका मतलब है कि 1.4 को तीन साल (2008-2011) के लिए अंतिम नहीं बनाया गया है। यह अपाचे की शैली में नहीं है। मैं एक बेहतर विकल्प की तलाश कर रहा हूं, लेकिन ऐसा नहीं मिला जो बहुत अपनाया गया हो। मैं कुछ ऐसी चीजों का उपयोग करना चाहता हूं जो अच्छी तरह से जांची हुई हों, किसी भी कीड़े को मारना नहीं चाहते हैं।


1.4 SNAPSHOT को भी जकार्ता ORO की आवश्यकता है। Apache Commons Validator मेरे लिए उपयोग करने योग्य नहीं है।
धुंध

अंत में DrVet को चुना। Cumpanasu Florin का समाधान: mkyong.com/ अनियमित-expressions/…
धुंध

1
मैं मानता हूं कि Apache Commons सत्यापनकर्ता अच्छा काम करता है, लेकिन मुझे यह काफी धीमा लगता है - प्रति कॉल 3ms से अधिक।
निक कॉट्रेल

प्रदर्शन मेरे लिए उतना महत्वपूर्ण नहीं है।
धुंध

वर्तमान ट्रंक SNAPSHOT (SVN REV 1227719 अब तक) में ORO जैसी कोई बाहरी निर्भरता नहीं है - अब आपको संपूर्ण सत्यापन मॉड्यूल की भी आवश्यकता नहीं है - चार वर्गों org.apache.commons.validator.routines.EmailValidator, InetAddressValidator, DomainValidator और। RegexValidator अकेले खड़े करने में सक्षम हैं
Jörg

0

आप लंबाई की जांच भी कर सकते हैं - ईमेल अधिकतम 254 वर्ण लंबे होते हैं। मैं अपाचे कॉमन्स वेरिलेटर का उपयोग करता हूं और यह इसके लिए जांच नहीं करता है।


RFC 2821 प्रजातियां (खंड 4.5.3.1) local-part64 की domainलंबाई और 255 की लंबाई को निर्दिष्ट करती हैं। (वे कहते हैं कि अब लंबे समय तक अन्य सॉफ़्टवेयर द्वारा अस्वीकार कर दिया जा सकता है।)
sarnold

-2

ऐसा करने के लिए कोई भी सही लाइब्रेरी या तरीके नहीं हैं, जब तक कि आपको ईमेल पते पर ईमेल भेजने और प्रतिक्रिया की प्रतीक्षा करने का समय नहीं है (हालांकि यह एक विकल्प नहीं हो सकता है)। मैंने यहाँ से एक सुझाव http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/ का उपयोग करके समाप्त किया और कोड को समायोजित किया ताकि यह जावा में काम करे।

public static boolean isValidEmailAddress(String email) {
    boolean stricterFilter = true; 
    String stricterFilterString = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
    String laxString = ".+@.+\\.[A-Za-z]{2}[A-Za-z]*";
    String emailRegex = stricterFilter ? stricterFilterString : laxString;
    java.util.regex.Pattern p = java.util.regex.Pattern.compile(emailRegex);
    java.util.regex.Matcher m = p.matcher(email);
    return m.matches();
}

-2

यह सबसे अच्छी विधि है:

public static boolean isValidEmail(String enteredEmail){
        String EMAIL_REGIX = "^[\\\\w!#$%&’*+/=?`{|}~^-]+(?:\\\\.[\\\\w!#$%&’*+/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\\\\.)+[a-zA-Z]{2,6}$";
        Pattern pattern = Pattern.compile(EMAIL_REGIX);
        Matcher matcher = pattern.matcher(enteredEmail);
        return ((!enteredEmail.isEmpty()) && (enteredEmail!=null) && (matcher.matches()));
    }

स्रोत: - http://howtodoinjava.com/2014/11/11/java-regex-validate-email-adress/

http://www.rfc-editor.org/rfc/rfc5322.txt


-2

एक अन्य विकल्प हाइबरनेट ईमेल सत्यापनकर्ता का उपयोग करता है, एनोटेशन @Emailका उपयोग करके या सत्यापनकर्ता वर्ग को प्रोग्रामेटिक रूप से उपयोग करना, जैसे:

import org.hibernate.validator.internal.constraintvalidators.hv.EmailValidator; 

class Validator {
    // code
    private boolean isValidEmail(String email) {
        EmailValidator emailValidator = new EmailValidator();
        return emailValidator.isValid(email, null);
    }

}

क्यों होता है पतन? यह वही वर्ग है जिसका उपयोग हाइबरनेट वालिडेटर द्वारा किया जाता है।
धरिक

-3

मेरे व्यावहारिक दृष्टिकोण का उपयोग करता है, जहां मैं RFC से स्वीकार्य वर्णों का उपयोग करके उचित विशिष्ट blah @ डोमेन पते चाहता हूं। पते पहले से निचले हिस्से में परिवर्तित होने चाहिए।

public class EmailAddressValidator {

    private static final String domainChars = "a-z0-9\\-";
    private static final String atomChars = "a-z0-9\\Q!#$%&'*+-/=?^_`{|}~\\E";
    private static final String emailRegex = "^" + dot(atomChars) + "@" + dot(domainChars) + "$";
    private static final Pattern emailPattern = Pattern.compile(emailRegex);

    private static String dot(String chars) {
        return "[" + chars + "]+(?:\\.[" + chars + "]+)*";
    }

    public static boolean isValidEmailAddress(String address) {
        return address != null && emailPattern.matcher(address).matches();
    }

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.