2010-08-04 8 views
9

मैं सिर्फ एक फॉर्म के लिए सत्यापन स्थापित कर रहा था जिसमें मैंने अपने ईमेल पते की वैधता की जांच करने के लिए filter_var फ़ंक्शन का उपयोग करने का प्रयास करने का निर्णय लिया था। मुझे पता नहीं चल सकता कि फ़िल्टर_var वास्तव में कहीं भी अनुमति देता है (क्योंकि दस्तावेज़ीकरण बहुत आसान है), और मुझे पता चला कि यह एक ईमेल पता जैसे टेस्ट @ टेस्ट की इजाजत दे रहा है। डोमेन में .com, .net आदि होना आवश्यक नहीं है?

+8

तकनीकी रूप से, 'परीक्षण' स्थानीय नेटवर्क में एक वैध होस्ट नाम हो सकता है, इसलिए मुझे लगता है कि यह सही है। –

+1

क्या आप अपना कोड पोस्ट कर सकते हैं? var_dump (filter_var ('test @ test।', FILTER_VALIDATE_EMAIL)); मेरे लिए झूठा रिटर्न देता है! – Youssef

+1

परीक्षण @ परीक्षण के बिना डॉट रिटर्न झूठी भी – Youssef

उत्तर

18

व्यवहार अप्रैल के आसपास कहीं बदल गया है। bug #49576 और revision 297350 देखें।

वह ई-मेल वास्तव में अमान्य है, या कम से कम यही है कि PHP डेवलपर्स समझ गए।

/* 
* The regex below is based on a regex by Michael Rushton. 
* However, it is not identical. I changed it to only consider routeable 
* addresses as valid. Michael's regex considers [email protected] a valid address 
* which conflicts with section 2.3.5 of RFC 5321 which states that: 
* 
* Only resolvable, fully-qualified domain names (FQDNs) are permitted 
* when domain names are used in SMTP. In other words, names that can 
* be resolved to MX RRs or address (i.e., A or AAAA) RRs (as discussed 
* in Section 5) are permitted, as are CNAME RRs whose targets can be 
* resolved, in turn, to MX or address RRs. Local nicknames or 
* unqualified names MUST NOT be used. 

changelog पीएचपी 5.3.3 और PHP 5.2.14 के लिए इस बग समाधान का उल्लेख है: स्रोत इस नोटिस किया जाता है।

+1

इस बग के लिए टिकट को PHP5.3.3 और PHP5.2.14 – Gordon

+0

ग्रेट कैच आर्टेफैक्टो के रूप में चिह्नित किया गया है। तो मुझे लगता है कि नियम बदल गए हैं? यह क्यों बदल गया है? काश वे फ़िल्टर करेंगे कि वे filter_var दस्तावेज में क्या देख रहे हैं। तो क्या यह 5.3.3 से पहले सच होगा और 5.3.3 के बाद झूठा होगा? जिस प्रणाली का मैं उपयोग कर रहा हूं वह 5.2.12 – Metropolis

+0

@ मेट्रो है यह इंटरनेट मानकों के अनुपालन के लिए ई-मेल की जांच करता है। एक बग था इससे पहले तथ्य 'टेस्ट @ टेस्ट' की अनुमति थी। – Artefacto

5

यह एक वैध ईमेल पता है। यह इंटरनेट पर काम नहीं करेगा (कम से कम, आज नहीं), लेकिन यह स्थानीय पते के लिए ठीक है।

मुझे लगता है कि डेवलपर्स ईमेल पते की जांच करने के लिए समझदार दृष्टिकोण ले रहे हैं और खुद को एक ऐसी प्रणाली नहीं बना रहे हैं जो एक नई टीएलडी शुरू होने के तुरंत बाद बाहर जाने की गारंटी है। हमारे पास पर्याप्त ईमेल पता सिंटैक्स चेकर्स हैं जो [email protected] को अस्वीकार करते हैं।

+1

क्या आपको लगता है कि आरएफसी 5321 का सेक्शन 2.3.5 लागू नहीं होता है? – Artefacto

1

नहीं, test स्थानीय/आंतरिक नेटवर्क डोमेन हो सकता है, जिससे यह काम करेगा। मुझे यह पसंद है कि उदाहरण के लिए विकास करते समय यह सही ढंग से [email protected] मान्य करता है।

एक सामान्य nonexistentdomain.foo एक ही समस्या होगी। यदि आप परीक्षण करना चाहते हैं कि मेजबान के लिए कुछ डिलीवर करने योग्य है, तो getmxrr का उपयोग करें (और यह विफल रहता है कि gethostbyname() पर वापस आना)।

+0

तो स्थानीय पते की अनुमति देना सबसे अच्छा है? या अगर मैं test @ test की तरह कुछ अनुमति देना नहीं चाहता हूं तो क्या मुझे getmxrr का उपयोग करना चाहिए? – Metropolis

+0

चेकडेंसर का उपयोग करके जांचना बेहतर होगा? क्योंकि अगर उनका सर्वर नीचे है, या कुछ और है, तो getmxrr झूठी वापसी करेगा। सही? – Metropolis

+1

यदि आप चाहते हैं कि उनको संभालने की उम्मीद/स्थानीय स्थानीय पते (ज्यादातर ज्ञात आईपी-श्रेणियों में) की अनुमति होगी। आप वास्तव में checkdnsrr ('hostname', 'ANY') का उपयोग कर सकते हैं, मेरे साथ नहीं हुआ (हालांकि एमएक्स या ए रिकॉर्ड के लिए जांच कर रहा है (यदि कोई एमएक्स परिभाषित नहीं किया गया है तो फॉलबैक होना चाहिए) अधिक विश्वसनीय होगा: एक पंजीकृत डोमेन हो सकता है कि कोई ए और एमएक्स रिकॉर्ड न हो, जिससे उन्हें अविभाज्य बना दिया जा सके)। checkdnsrr/gethostbyname/getmxrr सभी एक ही तंत्र का उपयोग करते हैं, इसलिए यदि कोई DNS सर्वर डाउन या धीमा है, तो यह सभी विकल्पों के लिए विफल/धीमा हो जाएगा। – Wrikken

3

परीक्षण @ परीक्षण वाक्य रचनात्मक रूप से मान्य है।

आरएफसी 5321 से:

एक शीर्ष स्तर एक ईमेल पते में अपने आप में उपयोग किया गया डोमेन के मामले में, एक एकल स्ट्रिंग जाने वाले बिंदु के बिना किया जाता है।

इस के बाद केवल यह कहना है:

केवल समाधान योग्य, पूरी तरह से योग्य डोमेन नाम (FQDNs) अनुमति दी जाती है जब डोमेन नाम एसएमटीपी में किया जाता है। दूसरे शब्दों में, को एमएक्स आरआर या पता (यानी, ए या एएएए) आरआर (जैसा कि धारा 5 में पर चर्चा की गई है) के लिए हल किया जा सकता है, जैसे कि सीएनएन आरआर जिनके लक्ष्य हो सकते हैं, बदले में, एमएक्स को हल किया जा सकता है या पता आरआरएस। स्थानीय उपनाम या अयोग्य नामों का उपयोग नहीं किया जाना चाहिए।

यह आवश्यक रूप से टीएलडी-केवल डोमेन नामों को रोकता नहीं है। वास्तव में, निम्न कोड चलाएँ:

checkdnsrr('ua', 'MX') // Returns true

getmxrr('ua', $array) // Returns true

टीएलडी-केवल डोमेन नाम (कर सकते हैं) MX रिकॉर्ड है और उपयोग में हैं: http://www.to/ एक उदाहरण है।और यहाँ कुछ वैध टीएलडी-केवल डोमेन नाम ईमेल पतों है:

विन्स @ एअर इंडिया

पॉल @ कब

जड़ @ किमी

जूस्ट @ TK

व्यवस्थापक @ टीटी

होस्टमास्टर @ ua

उदाहरण का स्रोत ईमेल एड्रे sses: Tony Finch – TLDs with MXs

संबंधित मुद्दे