ඉක්මන් පිළිතුර
ආදාන වලංගු කිරීම සඳහා පහත සඳහන් රීජෙක්ස් භාවිතා කරන්න:
([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)+
මෙම රීජෙක්ස් සමඟ ගැලපෙන ලිපිනයන්:
- RFC 5321/5322 සමඟ තදින් අනුකූල වන දේශීය කොටසක් (එනම් s -සයින්ට පෙර කොටස) තිබිය යුතුය,
- අවම වශයෙන් ලේබල් දෙකක් සහිත ධාරක නාමයක් වන ඩොමේන් කොටසක් (එනම් s -සයින් පසු කොටස) ඇති අතර, ඒ සෑම එකක්ම උපරිම වශයෙන් අක්ෂර 63 ක් වේ.
දෙවන බාධකය RFC 5321/5322 සඳහා සීමාවකි.
විස්තීර්ණ පිළිතුර
ඊමේල් ලිපින හඳුනාගන්නා නිත්ය ප්රකාශනයක් භාවිතා කිරීම විවිධ අවස්ථාවන්හිදී ප්රයෝජනවත් විය හැකිය: නිදසුනක් ලෙස ලේඛනයක ඊමේල් ලිපින පරිලෝකනය කිරීම, පරිශීලක ආදානය වලංගු කිරීම හෝ දත්ත ගබඩාවක අඛණ්ඩතාව බාධකයක් ලෙස.
කෙසේ වෙතත්, ලිපිනය ඇත්ත වශයෙන්ම පවතින තැපැල් පෙට්ටියකට යොමු වන්නේ දැයි සොයා ගැනීමට ඔබට අවශ්ය නම්, ලිපිනයට පණිවිඩයක් යැවීම සඳහා ආදේශකයක් නොමැති බව සැලකිල්ලට ගත යුතුය. ඔබට ලිපිනයක් ව්යාකරණමය වශයෙන් නිවැරදි දැයි පරීක්ෂා කිරීමට අවශ්ය නම් ඔබට සාමාන්ය ප්රකාශනයක් භාවිතා කළ හැකිය, නමුත් ""@[]
එය ව්යාකරණමය වශයෙන් නිවැරදි ඊමේල් ලිපිනයක් වන අතර එය දැනට පවතින තැපැල් පෙට්ටියකට යොමු නොවේ.
ඊමේල් ලිපිනවල වාක්ය ඛණ්ඩය විවිධ RFC වල අර්ථ දක්වා ඇත , විශේෂයෙන් RFC 822 සහ RFC 5322 . RFC 822 "මුල්" ප්රමිතිය ලෙසත් RFC 5322 නවතම ප්රමිතිය ලෙසත් දැකිය යුතුය. ආර්.එෆ්.සී.
මෙම පිළිතුරෙන් මම addr-spec
RFC වල අර්ථ දක්වා ඇති පරිදි “ඊමේල් ලිපිනය” ගන්නෙමි (එනම් jdoe@example.org
, නමුත් නැත "John Doe"<jdoe@example.org>
, නැත some-group:jdoe@example.org,mrx@exampel.org;
).
RFC සින්ටැක්ස් රීජෙක්ස් බවට පරිවර්තනය කිරීමේදී එක් ගැටළුවක් ඇත: සින්ටැක්ස් නිත්ය නොවේ! මෙයට හේතුව ඔවුන් අනන්තවත් කැදැල්ල කළ හැකි ඊමේල් ලිපිනවල විකල්ප අදහස් දැක්වීමට ඉඩ දෙන අතර අනන්ත කැදැල්ල නිත්ය ප්රකාශනයකින් විස්තර කළ නොහැකි බැවිනි. අදහස් අඩංගු ලිපින පරිලෝකනය කිරීමට හෝ වලංගු කිරීමට ඔබට විග්රහයක් හෝ වඩා ප්රබල ප්රකාශන අවශ්ය වේ. (පර්ල් වැනි භාෂාවන්ට සන්දර්භය රහිත ව්යාකරණ රීජෙක්ස් ආකාරයෙන් විස්තර කිරීමට ව්යුහයන් ඇති බව සලකන්න.) මෙම පිළිතුරේ දී මම අදහස් නොසලකා හරිනු ලබන අතර නිසි නිත්ය ප්රකාශන පමණක් සලකා බලමි.
RFCs ඊමේල් පණිවිඩ සඳහා සින්ටැක්ස් අර්ථ දක්වයි, ඊමේල් ලිපින සඳහා නොවේ. ලිපින විවිධ ශීර්ෂ ක්ෂේත්රයන්හි දිස්විය හැකි අතර ඒවා මූලික වශයෙන් අර්ථ දක්වා ඇත්තේ මෙහිදීය. ඒවා ශීර්ෂ ක්ෂේත්රයන්හි දිස්වන විට ලිපිනවල (ශබ්දකෝෂ ටෝකන අතර) සුදු අවකාශය, අදහස් සහ රේඛා කඩනයන් පවා අඩංගු විය හැකිය. කෙසේ වෙතත් අර්ථයෙන් මෙය කිසිදු වැදගත්කමක් නැත. ලිපිනයකින් මෙම සුදු අවකාශය ඉවත් කිරීමෙන් ඔබට අර්ථාන්විතව සමාන කැනොනිකල් නිරූපණයක් ලැබේ. මේ අනුව, කැනොනිකල් නිරූපණය first. last (comment) @ [3.5.7.9]
වේ first.last@[3.5.7.9]
.
විවිධ අරමුණු සඳහා විවිධ සින්ටැක්ස් භාවිතා කළ යුතුය. ඔබට (සමහර විට ඉතා පැරණි) ලේඛනයක ඊමේල් ලිපින පරිලෝකනය කිරීමට අවශ්ය නම්, RFC 822 හි අර්ථ දක්වා ඇති පරිදි වාක්ය ඛණ්ඩය භාවිතා කිරීම හොඳ අදහසක් විය හැකිය. අනෙක් අතට, ඔබට පරිශීලක ආදානය වලංගු කිරීමට අවශ්ය නම් ඔබට එය භාවිතා කිරීමට අවශ්ය විය හැකිය. RFC 5322 හි අර්ථ දක්වා ඇති සින්ටැක්ස්, බොහෝ විට පිළිගත හැක්කේ කැනොනිකල් නිරූපණයන් පමණි. ඔබේ විශේෂිත නඩුවට අදාළ වන වාක්ය ඛණ්ඩය ඔබ තීරණය කළ යුතුය.
ASCII අනුකූල අක්ෂර කට්ටලයක් උපකල්පනය කරමින් මම මෙම පිළිතුරෙහි POSIX “දීර් extended” නිත්ය ප්රකාශන භාවිතා කරමි.
RFC 822
මම පහත දැක්වෙන නිත්ය ප්රකාශනයට පැමිණියෙමි. එය බිඳ දැමීමට උත්සාහ කරන ලෙස මම සෑම දෙනාටම ආරාධනා කරමි. ඔබ කිසියම් ව්යාජ ධනාත්මක හෝ ව්යාජ නිෂේධනීය දේ සොයා ගන්නේ නම්, කරුණාකර ඒවා අදහස් දැක්වීමක පළ කරන්න.
([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]))*(\\\r)*")(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]))*(\\\r)*"))*@([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]))*(\\\r)*])(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]))*(\\\r)*]))*
මම එය සම්පූර්ණයෙන් RFC 822 ඇතුළු සමග complient විශ්වාස කරනවා දෝශහරණයක් . එය හඳුනාගන්නේ ඊමේල් ලිපින ඔවුන්ගේ කැනොනිකල් ස්වරූපයෙන් පමණි. සුදු පැහැති අවකාශය හඳුනාගන්නා රීජෙක්ස් සඳහා පහත ව්යුත්පන්නය බලන්න.
ව්යුත්පන්නයෙන් දැක්වෙන්නේ මා ප්රකාශනයට පැමිණි ආකාරයයි. RFC වෙතින් අදාළ සියලුම ව්යාකරණ රීති මම පෙනෙන ආකාරයටම ලැයිස්තුගත කර, ඊට අනුරූප රීජෙක්ස් අනුගමනය කරමි. දෝෂයක් ප්රකාශයට පත් කර ඇති තැන මම නිවැරදි කරන ලද ව්යාකරණ රීතිය සඳහා වෙනම ප්රකාශනයක් ලබා දෙමි ("දෝෂය" ලෙස සලකුණු කර ඇත) සහ යාවත්කාලීන කරන ලද අනුවාදය පසුකාලීන නිත්ය ප්රකාශනවල උප ප්රකාශනයක් ලෙස භාවිතා කරමි.
3.1.4 ඡේදයේ සඳහන් පරිදි. RFC 822 හි විකල්ප රේඛීය සුදු අවකාශය ශබ්දකෝෂ ටෝකන අතර ඇතුළත් කළ හැකිය. අදාළ වන විට මම මෙම රීතියට අනුකූල වන පරිදි ප්රකාශන පුළුල් කර ප්රති result ලය "opt-lwsp" ලෙස සලකුණු කර ඇත්තෙමි.
CHAR = <any ASCII character>
=~ .
CTL = <any ASCII control character and DEL>
=~ [\x00-\x1F\x7F]
CR = <ASCII CR, carriage return>
=~ \r
LF = <ASCII LF, linefeed>
=~ \n
SPACE = <ASCII SP, space>
=~
HTAB = <ASCII HT, horizontal-tab>
=~ \t
<"> = <ASCII quote mark>
=~ "
CRLF = CR LF
=~ \r\n
LWSP-char = SPACE / HTAB
=~ [ \t]
linear-white-space = 1*([CRLF] LWSP-char)
=~ ((\r\n)?[ \t])+
specials = "(" / ")" / "<" / ">" / "@" / "," / ";" / ":" / "\" / <"> / "." / "[" / "]"
=~ [][()<>@,;:\\".]
quoted-pair = "\" CHAR
=~ \\.
qtext = <any CHAR excepting <">, "\" & CR, and including linear-white-space>
=~ [^"\\\r]|((\r\n)?[ \t])+
dtext = <any CHAR excluding "[", "]", "\" & CR, & including linear-white-space>
=~ [^][\\\r]|((\r\n)?[ \t])+
quoted-string = <"> *(qtext|quoted-pair) <">
=~ "([^"\\\r]|((\r\n)?[ \t])|\\.)*"
(erratum) =~ "(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"
domain-literal = "[" *(dtext|quoted-pair) "]"
=~ \[([^][\\\r]|((\r\n)?[ \t])|\\.)*]
(erratum) =~ \[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]
atom = 1*<any CHAR except specials, SPACE and CTLs>
=~ [^][()<>@,;:\\". \x00-\x1F\x7F]+
word = atom / quoted-string
=~ [^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"
domain-ref = atom
sub-domain = domain-ref / domain-literal
=~ [^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]
local-part = word *("." word)
=~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"))*
(opt-lwsp) =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")(((\r\n)?[ \t])*\.((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"))*
domain = sub-domain *("." sub-domain)
=~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*])(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]))*
(opt-lwsp) =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*])(((\r\n)?[ \t])*\.((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]))*
addr-spec = local-part "@" domain
=~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"))*@([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*])(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]))*
(opt-lwsp) =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")((\r\n)?[ \t])*(\.((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")((\r\n)?[ \t])*)*@((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*])(((\r\n)?[ \t])*\.((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]))*
(canonical) =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]))*(\\\r)*")(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]))*(\\\r)*"))*@([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]))*(\\\r)*])(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]))*(\\\r)*]))*
RFC 5322
මම පහත දැක්වෙන නිත්ය ප්රකාශනයට පැමිණියෙමි. එය බිඳ දැමීමට උත්සාහ කරන ලෙස මම සෑම දෙනාටම ආරාධනා කරමි. ඔබ කිසියම් ව්යාජ ධනාත්මක හෝ ව්යාජ නිෂේධනීය දේ සොයා ගන්නේ නම්, කරුණාකර ඒවා අදහස් දැක්වීමක පළ කරන්න.
([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|\[[\t -Z^-~]*])
මම එය සම්පූර්ණයෙන් RFC 5322 ඇතුලු සමග complient විශ්වාස කරනවා දෝශහරණයක් . එය හඳුනාගන්නේ ඊමේල් ලිපින ඔවුන්ගේ කැනොනිකල් ස්වරූපයෙන් පමණි. සුදු පැහැති අවකාශය හඳුනාගන්නා රීජෙක්ස් සඳහා පහත ව්යුත්පන්නය බලන්න.
ව්යුත්පන්නයෙන් දැක්වෙන්නේ මා ප්රකාශනයට පැමිණි ආකාරයයි. RFC වෙතින් අදාළ සියලුම ව්යාකරණ රීති මම පෙනෙන ආකාරයටම ලැයිස්තුගත කර, ඊට අනුරූප රීජෙක්ස් අනුගමනය කරමි. අර්ථ නිරූපණයට අදාළ නොවන (නැමීමේ) සුදු අවකාශය ඇතුළත් වන නීති සඳහා, මම මෙම සුදු අවකාශය නොපිළිගන්නා "(සාමාන්යකරණය කරන ලද)" ලෙස සලකුණු කරන ලද වෙනම රීජෙක්ස් එකක් ලබා දෙමි.
මම RFC වෙතින් සියලුම "නිරීක්ෂණ" නීති නොසලකා හැරියෙමි. මෙයින් අදහස් කරන්නේ රීජෙක්ස් RFC 5322 ට අනුකූල වන ඊමේල් ලිපින වලට පමණක් ගැලපෙන බවයි. ඔබට "පැරණි" ලිපින සමඟ සැසඳිය යුතු නම් ("අබ්ස්" රීති ඇතුළුව ලිහිල් ව්යාකරණ මෙන්), ඔබට පෙර ඡේදයෙන් RFC 822 රීජෙක්ස් එකක් භාවිතා කළ හැකිය.
VCHAR = %x21-7E
=~ [!-~]
ALPHA = %x41-5A / %x61-7A
=~ [A-Za-z]
DIGIT = %x30-39
=~ [0-9]
HTAB = %x09
=~ \t
CR = %x0D
=~ \r
LF = %x0A
=~ \n
SP = %x20
=~
DQUOTE = %x22
=~ "
CRLF = CR LF
=~ \r\n
WSP = SP / HTAB
=~ [\t ]
quoted-pair = "\" (VCHAR / WSP)
=~ \\[\t -~]
FWS = ([*WSP CRLF] 1*WSP)
=~ ([\t ]*\r\n)?[\t ]+
ctext = %d33-39 / %d42-91 / %d93-126
=~ []!-'*-[^-~]
("comment" is left out in the regex)
ccontent = ctext / quoted-pair / comment
=~ []!-'*-[^-~]|(\\[\t -~])
(not regular)
comment = "(" *([FWS] ccontent) [FWS] ")"
(is equivalent to FWS when leaving out comments)
CFWS = (1*([FWS] comment) [FWS]) / FWS
=~ ([\t ]*\r\n)?[\t ]+
atext = ALPHA / DIGIT / "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|" / "}" / "~"
=~ [-!#-'*+/-9=?A-Z^-~]
dot-atom-text = 1*atext *("." 1*atext)
=~ [-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*
dot-atom = [CFWS] dot-atom-text [CFWS]
=~ (([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?
(normalized) =~ [-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*
qtext = %d33 / %d35-91 / %d93-126
=~ []!#-[^-~]
qcontent = qtext / quoted-pair
=~ []!#-[^-~]|(\\[\t -~])
(erratum)
quoted-string = [CFWS] DQUOTE ((1*([FWS] qcontent) [FWS]) / FWS) DQUOTE [CFWS]
=~ (([\t ]*\r\n)?[\t ]+)?"(((([\t ]*\r\n)?[\t ]+)?([]!#-[^-~]|(\\[\t -~])))+(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?)"(([\t ]*\r\n)?[\t ]+)?
(normalized) =~ "([]!#-[^-~ \t]|(\\[\t -~]))+"
dtext = %d33-90 / %d94-126
=~ [!-Z^-~]
domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS]
=~ (([\t ]*\r\n)?[\t ]+)?\[((([\t ]*\r\n)?[\t ]+)?[!-Z^-~])*(([\t ]*\r\n)?[\t ]+)?](([\t ]*\r\n)?[\t ]+)?
(normalized) =~ \[[\t -Z^-~]*]
local-part = dot-atom / quoted-string
=~ (([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?"(((([\t ]*\r\n)?[\t ]+)?([]!#-[^-~]|(\\[\t -~])))+(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?)"(([\t ]*\r\n)?[\t ]+)?
(normalized) =~ [-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+"
domain = dot-atom / domain-literal
=~ (([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?\[((([\t ]*\r\n)?[\t ]+)?[!-Z^-~])*(([\t ]*\r\n)?[\t ]+)?](([\t ]*\r\n)?[\t ]+)?
(normalized) =~ [-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|\[[\t -Z^-~]*]
addr-spec = local-part "@" domain
=~ ((([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?"(((([\t ]*\r\n)?[\t ]+)?([]!#-[^-~]|(\\[\t -~])))+(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?)"(([\t ]*\r\n)?[\t ]+)?)@((([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?\[((([\t ]*\r\n)?[\t ]+)?[!-Z^-~])*(([\t ]*\r\n)?[\t ]+)?](([\t ]*\r\n)?[\t ]+)?)
(normalized) =~ ([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|\[[\t -Z^-~]*])
සමහර මූලාශ්ර (විශේෂයෙන් w3c ) RFC 5322 දේශීය කොටසෙහි දැඩි බව ප්රකාශ කරන බව සලකන්න (එනම් s -සයින්ට පෙර කොටස). මෙයට හේතුව "..", "අ..බී" සහ "අ." ය නොවේ ඔවුන් තැපැල් පෙට්ටිය නම් ලෙස භාවිතා කළ හැකි අතර, වලංගු dot-පරමාණු. මෙම නේවාසික විදේශ ව්යවහාර මුදල්, කෙසේ වෙතත්, කරන්නේ , මේ වගේ දේශීය කොටස් සඳහා ඉඩ ඔවුන් උපුටා කළ යුතු බව හැර. එබැවින් ඔබ වෙනුවට a..b@example.net
ලිවිය යුතුය"a..b"@example.net
, එය අර්ථාන්විතව සමාන වේ.
තවදුරටත් සීමාවන්
SMTP ( RFC 5321 හි අර්ථ දක්වා ඇති පරිදි ) වලංගු ඊමේල් ලිපින සමූහය තවදුරටත් සීමා කරයි (හෝ ඇත්ත වශයෙන්ම: තැපැල් පෙට්ටියේ නම්). ගැලපෙන ඊමේල් ලිපිනය ඇත්ත වශයෙන්ම විද්යුත් තැපෑලක් යැවීමට භාවිතා කළ හැකි වන පරිදි මෙම දැඩි ව්යාකරණ පැනවීම සාධාරණ බව පෙනේ.
RFC 5321 මූලික වශයෙන් "දේශීය" කොටස (එනම් @ -සයින්ට පෙර කොටස) පමණක් ඉතිරි කරයි, නමුත් ඩොමේන් කොටසෙහි (එනම් s -සයින් පසු කොටස) දැඩි වේ. එය ඉඩ දෙන්නේ ඩොට්-පරමාණු වෙනුවට ධාරක නාම සහ ඩොමේන් සාහිත්යකරුවන් වෙනුවට ලිපින වචනාර්ථ පමණි.
RFC 5321 හි ඉදිරිපත් කර ඇති ව්යාකරණ ධාරක නාම සහ IP ලිපින යන දෙකටම වඩා සැහැල්ලු ය. මෙම කෙටුම්පත සහ RFC 1034 මාර්ගෝපදේශ ලෙස භාවිතා කරමින්, නීති රීති "නිවැරදි කිරීමේ" නිදහස මම ලබා ගතිමි . මෙහි ප්රති ing ලයක් ලෙස රීජෙක්ස් වේ.
([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)*|\[((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)|(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+)])
භාවිත අවස්ථාව මත පදනම්ව ඔබේ රීජෙක්ස් හි “සාමාන්ය ලිපින-වචනාර්ථය” සඳහා ඉඩ දීමට ඔබට අවශ්ය නොවනු ඇති බව සලකන්න. මම negative ණාත්මක පෙනුමක් භාවිතා කළ බව සලකන්න(?!IPv6:)
විකෘති වූ IPv6 ලිපින සමඟ සැසඳීම සඳහා "සාමාන්ය-ලිපින-වචනානුසාරී" කොටස වැළැක්වීම සඳහා අවසාන හි . සමහර රීජෙක්ස් ප්රොසෙසර negative ණාත්මක පෙනුමට සහාය නොදක්වයි. |(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+
ඔබට සම්පූර්ණ "සාමාන්ය-ලිපින-වචනානුසාරී" කොටස ඉවතට ගැනීමට අවශ්ය නම් , උපස්ථරය රීජෙක්ස් වෙතින් ඉවත් කරන්න .
මෙන්න ව්යුත්පන්නය:
Let-dig = ALPHA / DIGIT
=~ [0-9A-Za-z]
Ldh-str = *( ALPHA / DIGIT / "-" ) Let-dig
=~ [0-9A-Za-z-]*[0-9A-Za-z]
(regex is updated to make sure sub-domains are max. 63 charactes long - RFC 1034 section 3.5)
sub-domain = Let-dig [Ldh-str]
=~ [0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?
Domain = sub-domain *("." sub-domain)
=~ [0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)*
Snum = 1*3DIGIT
=~ [0-9]{1,3}
(suggested replacement for "Snum")
ip4-octet = DIGIT / %x31-39 DIGIT / "1" 2DIGIT / "2" %x30-34 DIGIT / "25" %x30-35
=~ 25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9]
IPv4-address-literal = Snum 3("." Snum)
=~ [0-9]{1,3}(\.[0-9]{1,3}){3}
(suggested replacement for "IPv4-address-literal")
ip4-address = ip4-octet 3("." ip4-octet)
=~ (25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}
(suggested replacement for "IPv6-hex")
ip6-h16 = "0" / ( (%x49-57 / %x65-70 /%x97-102) 0*3(%x48-57 / %x65-70 /%x97-102) )
=~ 0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}
(not from RFC)
ls32 = ip6-h16 ":" ip6-h16 / ip4-address
=~ (0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}
(suggested replacement of "IPv6-addr")
ip6-address = 6(ip6-h16 ":") ls32
/ "::" 5(ip6-h16 ":") ls32
/ [ ip6-h16 ] "::" 4(ip6-h16 ":") ls32
/ [ *1(ip6-h16 ":") ip6-h16 ] "::" 3(ip6-h16 ":") ls32
/ [ *2(ip6-h16 ":") ip6-h16 ] "::" 2(ip6-h16 ":") ls32
/ [ *3(ip6-h16 ":") ip6-h16 ] "::" ip6-h16 ":" ls32
/ [ *4(ip6-h16 ":") ip6-h16 ] "::" ls32
/ [ *5(ip6-h16 ":") ip6-h16 ] "::" ip6-h16
/ [ *6(ip6-h16 ":") ip6-h16 ] "::"
=~ (((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::
IPv6-address-literal = "IPv6:" ip6-address
=~ IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)
Standardized-tag = Ldh-str
=~ [0-9A-Za-z-]*[0-9A-Za-z]
dcontent = %d33-90 / %d94-126
=~ [!-Z^-~]
General-address-literal = Standardized-tag ":" 1*dcontent
=~ [0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+
address-literal = "[" ( IPv4-address-literal / IPv6-address-literal / General-address-literal ) "]"
=~ \[((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)|(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+)]
Mailbox = Local-part "@" ( Domain / address-literal )
=~ ([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)*|\[((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)|(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+)])
පරිශීලක ආදාන වලංගුකරණය
පොදු භාවිත අවස්ථාවක් වන්නේ පරිශීලක ආදාන වලංගුකරණය, උදාහරණයක් ලෙස html පෝරමයක් මත ය. එවැනි අවස්ථාවකදී සාමාන්යයෙන් ලිපින-වචනාර්ථයන් වළක්වා ගැනීම සහ ධාරක නාමයේ අවම වශයෙන් ලේබල් දෙකක් වත් අවශ්ය වේ. පෙර කොටසේ සිට වැඩිදියුණු කළ RFC 5321 රීජෙක්ස් පදනමක් ලෙස ගත් විට, එහි ප්රති expression ලය වනුයේ:
([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)+
දේශීය කොටස තවදුරටත් සීමා කිරීමට මම නිර්දේශ නොකරමි, උදා: උපුටා ගත් නූල් වළක්වා ගැනීමෙන්, සමහර ධාරකයන් ඉඩ දෙන්නේ කුමන ආකාරයේ තැපැල් පෙට්ටි නම් දැයි අපි නොදනිමු (වැනි "a..b"@example.net
හෝ පවා "a b"@example.net
).
වචනයේ පරිසමාප්ත අර්ථයෙන්ම ඉහළ මට්ටමේ වසම් ලැයිස්තුවකට එරෙහිව වලංගු කිරීමක් හෝ දිග සීමාවන් පැනවීමට මම නිර්දේශ නොකරමි (".මියුසියම්" අවලංගු වූ ආකාරය මතක තබා ගන්න [a-z]{2,4}
), නමුත් ඔබට අවශ්ය නම්:
([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?\.)*(net|org|com|info|
etc ...)
පැහැදිලි ඉහළ මට්ටමේ වසම් වලංගු කිරීමේ මාවතකට යාමට ඔබ තීරණය කරන්නේ නම්, ඔබේ රීජෙක්ස් යාවත්කාලීනව තබා ගැනීමට වග බලා ගන්න.
තවදුරටත් සලකා බැලිය යුතුය
ඩොමේන් කොටසේ (@ -සයින් පසු) ධාරක නාම පමණක් පිළිගන්නා විට, ඉහත සඳහන් රිජෙක්ස් පිළිගන්නේ අක්ෂර 63 ක් ඇති ලේබල් පමණි. කෙසේ වෙතත්, සමස්ත සත්කාරක නාමය උපරිම වශයෙන් අක්ෂර 253 ක් විය යුතුය (තිත් ඇතුළුව) යන කාරණය ඔවුන් බලාත්මක නොකරයි. මෙම අවහිරතාවය තවමත් නිතිපතා කථා කළද, මෙම රීතිය ඇතුළත් වන රීජෙක්ස් එකක් සෑදිය නොහැක.
තවත් කරුණක් නම්, විශේෂයෙන් ආදාන වලංගු කිරීම සඳහා රීජෙක්ස් භාවිතා කරන විට, පරිශීලකයාට ලැබෙන ප්රතිපෝෂණයයි. පරිශීලකයෙකු වැරදි ලිපිනයකට ඇතුළු වන්නේ නම්, සරල “සින්ටැක්ටිකල් වැරදි ලිපිනයකට” වඩා ටිකක් වැඩි ප්රතිපෝෂණයක් ලබා දීම සතුටක්. "වැනිලා" රීජෙක්ස් සමඟ මෙය කළ නොහැක.
ලිපිනය විග්රහ කිරීමෙන් මෙම කරුණු දෙක විසඳිය හැකිය. ධාරක නාමයන්හි අමතර දිග සීමාව සමහර අවස්ථාවලදී එය පරීක්ෂා කරන අතිරේක රීජෙක්ස් භාවිතා කිරීමෙන් සහ ප්රකාශන දෙකටම ලිපිනය ගැලපීමෙන් විසඳිය හැකිය.
මෙම පිළිතුරෙහි ඇති රීජෙක්ස් කිසිවක් කාර්ය සාධනය සඳහා ප්රශස්ත කර නොමැත. කාර්ය සාධනය ගැටළුවක් නම්, ඔබ තෝරා ගන්නා රීජෙක්ස් ප්රශස්තිකරණය කළ හැකිද යන්න (සහ කෙසේද) ඔබ බැලිය යුතුය.