ইমেল বৈধতা


10

আপনি মন্তব্য এবং ভাঁজ সাদা জায়গা ( ) এবং সাধারণীকরণ ঠিকানা আক্ষরিক অগ্রাহ্য করতে পারেন যে শিথিলতা দিয়ে আরএফসি 5321 ( 5322 সালে পাওয়া কিছু ব্যাকরণের নিয়ম ) এর বিপরীতে একটি ইমেল ঠিকানা যাচাই করার জন্য একটি ফাংশন বা প্রোগ্রাম লিখুন CFWS। এটি ব্যাকরণ দেয়

Mailbox              = Local-part "@" ( Domain / address-literal )

Local-part           = Dot-string / Quoted-string
Dot-string           = Atom *("."  Atom)
Atom                 = 1*atext
atext                = ALPHA / DIGIT /    ; Printable US-ASCII
                       "!" / "#" /        ;  characters not including
                       "$" / "%" /        ;  specials.  Used for atoms.
                       "&" / "'" /
                       "*" / "+" /
                       "-" / "/" /
                       "=" / "?" /
                       "^" / "_" /
                       "`" / "{" /
                       "|" / "}" /
                       "~"
Quoted-string        = DQUOTE *QcontentSMTP DQUOTE
QcontentSMTP         = qtextSMTP / quoted-pairSMTP
qtextSMTP            = %d32-33 / %d35-91 / %d93-126
quoted-pairSMTP      = %d92 %d32-126

Domain               = sub-domain *("." sub-domain)
sub-domain           = Let-dig [Ldh-str]
Let-dig              = ALPHA / DIGIT
Ldh-str              = *( ALPHA / DIGIT / "-" ) Let-dig

address-literal      = "[" ( IPv4-address-literal / IPv6-address-literal ) "]"
IPv4-address-literal = Snum 3("."  Snum)
IPv6-address-literal = "IPv6:" IPv6-addr
Snum                 = 1*3DIGIT
                       ; representing a decimal integer value in the range 0 through 255

নোট: আমি করেছি সংজ্ঞা এড়ানো IPv6-addrকারণ এই বিশেষ বোঝায় যা RFC ভুল এবং এটি নামঞ্জুর করে যেমন পায় ::1। সঠিক বৈশিষ্টটি আরএফসি 2373 এ রয়েছে

বিধিনিষেধ

আপনি কোনও বিদ্যমান ইমেল বৈধতা লাইব্রেরি কল ব্যবহার করতে পারবেন না। তবে আপনি আইপি ঠিকানাগুলি পরীক্ষা করতে বিদ্যমান নেটওয়ার্ক লাইব্রেরি ব্যবহার করতে পারেন।

আপনি যদি কোনও ফাংশন / পদ্ধতি / অপারেটর / সমতুল্য লিখেন তবে এটি আপনার স্ট্রিংয়ের মতো হওয়া উচিত এবং আপনার ভাষার জন্য উপযুক্ত হিসাবে একটি বুলিয়ান বা সত্যবাদী / মিথ্যা মান প্রদান করতে হবে। আপনি যদি কোনও প্রোগ্রাম লিখেন তবে এটি স্টিডিনের থেকে একটি লাইন নেওয়া উচিত এবং প্রস্থান কোডের মাধ্যমে বৈধ বা অবৈধ নির্দেশ করতে হবে।

পরীক্ষার মামলা

কমপ্যাক্টনেস জন্য নিম্নলিখিত পরীক্ষার কেসগুলি ব্লকে তালিকাভুক্ত করা হয়। প্রথম ব্লকটি এমন কেস যা পাস করা উচিত:

email@domain.com
e@domain.com
firstname.lastname@domain.com
email@subdomain.domain.com
firstname+lastname@domain.com
email@123.123.123.123
email@[123.123.123.123]
"email"@domain.com
1234567890@domain.com
email@domain-one.com
_______@domain.com
email@domain.name
email@domain.co.jp
firstname-lastname@domain.com
""@domain.com
"e"@domain.com
"\@"@domain.com
email@domain
"Abc\@def"@example.com
"Fred Bloggs"@example.com
"Joe\\Blow"@example.com
"Abc@def"@example.com
customer/department=shipping@example.com
$A12345@example.com
!def!xyz%abc@example.com
_somename@example.com
_somename@[IPv6:::1]
fred+bloggs@abc.museum
email@d.com
?????@domain.com

নিম্নলিখিত পরীক্ষার কেসগুলি পাস করা উচিত নয়:

plainaddress
#@%^%#$@#$@#.com
@domain.com
Joe Smith <email@domain.com>
email.domain.com
email@domain@domain.com
.email@domain.com
email.@domain.com
email.email.@domain.com
email..email@domain.com
email@domain.com (Joe Smith)
email@-domain.com
email@domain..com
email@[IPv6:127.0.0.1]
email@[127.0.0]
email@[.127.0.0.1]
email@[127.0.0.1.]
email@IPv6:::1]
_somename@domain.com]
email@[256.123.123.123]

যেহেতু অপরিবর্তিত IPv6-addrরেখে গেছে, এবং আইপিভি 6 ঠিকানা রয়েছে এমন পরীক্ষার কেস রয়েছে, সেগুলি কার্যকর করার কোনও সঠিক উপায় আছে কি?
4:48 এ আর্দনিউ

কেন email@d.comএবং ?????@domain.comব্যর্থ হওয়া উচিত ?
grc

1
@ প্রথম, আমি প্রাসঙ্গিক আরএফসিতে একটি লিঙ্ক যুক্ত করেছি। আমি এটি ইনলাইন করতে চাই না কারণ প্রশ্নটি ইতিমধ্যে বেশ দীর্ঘ।
পিটার টেলর

@ জিআরসি, ভাল প্রশ্ন আমি তাদের পরীক্ষা করেছি, কারণ স্যান্ডবক্সে প্রশ্নটি ছিল যে কেউ কয়েক মাসের মধ্যে এটি উত্থাপিত করেনি , তবে কেন তাদের ব্যর্থ হওয়া উচিত তা আমি দেখতে পাচ্ছি না তাই আমি তাদের "পাস" পাশ সরিয়ে নিয়েছি।
পিটার টেলর

দৈর্ঘ্যের সীমাও কি প্রয়োজনীয়? সম্পূর্ণ ইমেল ঠিকানার জন্য 254 / স্থানীয় অংশের জন্য 64 / প্রতিটি ডোমেন লেবেলের জন্য?
মাইকেলরশটন

উত্তর:


2

পাইথন 3.3, 261

import re,ipaddress
try:v,p=re.match(r'^(?!\.)(((^|\.)[\w!#-\'*+\-/=?^-~]+)+|"([ !#-[\]-~]|\\[ -~])*")@(((?!-)[a-zA-Z\d-]+(?<!-)($|\.))+|\[(IPv6:)?(.*)\])(?<!\.)$',input()).groups()[7:];exec("if p:ipaddress.IPv%dAddress(p)"%(v and 6or 4))
except:v=5
print(v!=5)

আইপ্যাড্রেস মডিউলটির জন্য পাইথন ৩.৩ প্রয়োজন যা আইপিভি ৪ এবং আইপিভি addresses অ্যাড্রেসগুলি যাচাই করতে ব্যবহৃত হয়।

কম গল্ফ সংস্করণ:

import re, ipaddress

dot_string = r'(?!\.)((^|\.)[\w!#-\'*+\-/=?^-~]+)+'
    # negative lookahead to check that string doesn't start with .
    # each atom must start with a . or the beginning of the string

quoted_string = r'"([ !#-[\]-~]|\\[ -~])*"'
    # - is used for character ranges (also in dot_string)

domain = r'((?!-)[a-zA-Z\d-]+(?<!-)($|\.))+(?<!\.)'
    # negative lookahead/lookbehind to check each subdomain doesn't start/end with -
    # each domain must end with a . or the end of the string
    # negative lookbehind to check that string doesn't end with .

address_literal = r'\[(IPv6:)?(.*)\]'
    # captures the is_IPv6 and ip_address groups

final_regex = r'^(%s|%s)@(%s|%s)$' % (dot_string, quoted_string, domain, address_literal)

try:
    is_IPv6, ip_address = re.match(final_regex, input(), re.VERBOSE).groups()[7:]
        # if input doesn't match, calling .groups() will throw an exception

    if ip_address:
        exec("ipaddress.IPv%dAddress(ip_address)" % (6 if is_IPv6 else 4))
            # IPv4Address or IPv6Address will throw an exception if ip_address isn't valid
except:
    is_IPv6 = 5

print(is_IPv6 != 5)
    # is_IPv6 is used as a flag to tell whether an exception was thrown

খুব সুন্দর. আমি তাত্ক্ষণিকভাবে কোনও সদৃশ নিদর্শনগুলি খুঁজে পাচ্ছি না (একটি সংক্ষিপ্ত পরিবর্তনশীল শনাক্তকারীর সাথে প্রতিস্থাপন করতে)) তবে দেখে মনে হচ্ছে ALPHAএটি উন্নত বিএনএফ এবং চার্ট লিটারালগুলি বানাচ্ছে Quoted-stringএটি সমস্ত ক্ষেত্রে সংবেদনশীল। কেস-সংবেদনশীলতা নির্দিষ্ট করে এবং এই চার শ্রেণির ব্যাপ্তিগুলির মধ্যে কোনও একটি খনন করে আপনি কয়েকটি চর শেভ করতে পারেন? বিটিডব্লিউ, আপনি যদি স্বাচ্ছন্দ্য বোধ করেন তবে আপনি কীভাবে এটি বিকাশ করেছেন তার একটি সংক্ষিপ্ত বিবরণ দিতে পারেন?
আরডনিউ

@ আরডনিউ: ধন্যবাদ আমি কয়েকটি কৌশলযুক্ত কিছু অংশ ব্যাখ্যা করার চেষ্টা করে কয়েকটি মন্তব্য সহ কম গল্ফযুক্ত সংস্করণ যুক্ত করেছি। আমি চারটি পৃথক টুকরো (ডট-স্ট্রিং, কোটেড-স্ট্রিং, ডোমেন এবং ঠিকানা-আক্ষরিক) এ রেজেেক্সটি বিকাশ করেছি, তারপরে সেগুলি একত্রিত করে আইপি বৈধতা যুক্ত করেছি। বলাই বাহুল্য, এটি গল্ফ করা সত্যিই অগোছালো হয়ে গেছে।
grc

কোন দৈর্ঘ্যের সীমা?
মাইকেলরশটন

2

পিএইচপি 5.4.9, 495

function _($e){return preg_match('/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!"?(?>\\\[ -~]|[^"]){65,}"?@)(?>([!#-\'*+\/-9=?^-~-]+)(?>\.(?1))*|"(?>[ !#-\[\]-~]|\\\[ -~])*")@(?!.*[^.]{64,})(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?2)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?3)){7}|(?!(?:.*[a-f0-9][:\]]){8,})((?3)(?>:(?3)){0,6})?::(?4)?))|(?>(?>IPv6:(?>(?3)(?>:(?3)){5}:|(?!(?:.*[a-f0-9]:){6,})(?5)?::(?>((?3)(?>:(?3)){0,4}):)?))?(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(?>\.(?6)){3}))\])$/iD', $e);}

এবং কেবল আরও আগ্রহের জন্য, এখানে আরএফসি 5322 ব্যাকরণের জন্য একটি যা নেস্টেড সিএফডব্লিউএস এবং অপ্রচলিত স্থানীয় অংশগুলির জন্য মঞ্জুরি দেয়:

(764)

function _($e){return preg_match('/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z\d-]{64,})(?1)(?>([a-z\d](?>[a-z\d-]*[a-z\d])?)(?>(?1)\.(?!(?1)[a-z\d-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f\d]{1,4})(?>:(?6)){7}|(?!(?:.*[a-f\d][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:|(?!(?:.*[a-f\d]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(?>\.(?9)){3}))\])(?1)$/isD', $e);}

এবং দৈর্ঘ্যের সীমা যদি প্রয়োজন হয় না:

আরএফসি 5321 (414)

function _($e){return preg_match('/^(?>([!#-\'*+\/-9=?^-~-]+)(?>\.(?1))*|"(?>[ !#-\[\]-~]|\\\[ -~])*")@(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?2)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?3)){7}|(?!(?:.*[a-f0-9][:\]]){8,})((?3)(?>:(?3)){0,6})?::(?4)?))|(?>(?>IPv6:(?>(?3)(?>:(?3)){5}:|(?!(?:.*[a-f0-9]:){6,})(?5)?::(?>((?3)(?>:(?3)){0,4}):)?))?(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(?>\.(?6)){3}))\])$/iD', $e);}

আরএফসি 5322 (636)

function _($e){return preg_match('/^((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?1)(?>([a-z\d](?>[a-z\d-]*[a-z\d])?)(?>(?1)\.(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f\d]{1,4})(?>:(?6)){7}|(?!(?:.*[a-f\d][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:|(?!(?:.*[a-f\d]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(?>\.(?9)){3}))\])(?1)$/isD', $e);}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.