سؤال

قرأت مؤخرًا في مكان ما أن كتابة تعبير عادي لمطابقة عنوان بريد إلكتروني، مع الأخذ في الاعتبار جميع الاختلافات والإمكانيات للمعيار أمر صعب للغاية وأكثر تعقيدًا بكثير مما قد يفترضه المرء في البداية.

هل يمكن لأي شخص تقديم بعض الأفكار حول سبب ذلك؟

هل هناك أي تعبيرات عادية معروفة ومثبتة تقوم بالفعل بهذا بشكل كامل؟

ما هي بعض البدائل الجيدة لاستخدام regexps لمطابقة عناوين البريد الإلكتروني؟

هل كانت مفيدة؟

المحلول

ل رَسمِيّ مواصفات البريد الإلكتروني، نعم، من المستحيل تقنيًا عبر Regex بسبب تكرار أشياء مثل التعليقات (خاصة إذا لم تقم بإزالة التعليقات على مسافة بيضاء أولاً)، والتنسيقات المختلفة المتنوعة (عنوان البريد الإلكتروني ليس دائمًا someone@somewhere.tld).يمكنك الاقتراب (مع بعض أنماط التعبيرات العادية الضخمة وغير المفهومة)، ولكن الطريقة الأفضل بكثير للتحقق من البريد الإلكتروني هي القيام بالمصافحة المألوفة جدًا:

  • يقولون لك البريد الإلكتروني الخاص بهم
  • يمكنك إرسال رابط تأكيد لهم بالبريد الإلكتروني مع المرشد
  • عندما ينقرون على الرابط تعلمون أن:

    1. البريد الإلكتروني صحيح
    2. إنه موجود
    3. إنهم يمتلكونها

أفضل بكثير من القبول الأعمى لعنوان البريد الإلكتروني.

نصائح أخرى

وهناك عدد من وحدات بيرل (على سبيل المثال) أن تفعل هذا. لا تحاول وكتابة التعبير العادي الخاص بك للقيام بذلك. انظروا

وMail::VRFY ستفعل بناء الجملة وشبكة الشيكات (لا والخادم SMTP يقبل مكان هذا العنوان)

https://metacpan.org/pod/Mail::VRFY

وRFC::RFC822::Address - أ عودي محلل عنوان البريد الإلكتروني أصل

https://metacpan.org/pod/RFC::RFC822::Address

وMail::RFC822::Address - القائم على التعبير العادي التحقق من صحة العنوان، يستحق النظر لمجرد التعبير العادي مجنون

http://ex-parrot.com/~pdw/Mail -RFC822-Address.html

توجد

وأدوات مماثلة للغات أخرى. التعبير العادي مجنون أدناه ...

(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ 
\t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\
](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+
(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:
(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)
?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\
r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[
 \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)
?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t]
)*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[
 \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*
)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)
*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+
|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r
\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:
\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t
]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031
]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](
?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?
:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?
:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?
:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?
[ \t]))*"(?:(?:\r\n)?[ \t])*)*:(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] 
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|
\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>
@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"
(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?
:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[
\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-
\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(
?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;
:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([
^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\"
.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\
]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\
[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\
r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] 
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]
|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \0
00-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\
.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,
;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?
:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[
^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]
]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)(?:,\s*(
?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(
?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[
\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t
])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t
])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?
:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|
\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:
[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\
]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)
?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["
()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)
?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>
@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[
 \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,
;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:
\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[
"()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])
*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
?:\r\n)?[ \t])*))*)?;\s*)

وعناوين التحقق من صحة البريد الإلكتروني ليست حقا مفيدة جدا على أي حال. انها لن التقاط الأخطاء المطبعية أو عناوين البريد الإلكتروني مختلقة، لأن هذه يميلون إلى النظر نحويا مثل عناوين صالحة.

إذا كنت تريد أن تتأكد من عنوان صالحا، لديك أي خيار سوى إرسال تأكيد البريد.

إذا كنت ترغب فقط للتأكد من أن مدخلات المستخدم شيء يبدو وكأنه البريد الالكتروني بدلا من مجرد "قوات الدفاع الذاتى الجوية"، ثم تحقق ل @. التحقق من صحة أكثر تعقيدا لا تقدم أي فائدة حقا.

و(أعرف أن هذا لا يجيب على أسئلتك، ولكن أعتقد أنه من الجدير بالذكر على أي حال)

لقد قمت الآن بجمع حالات الاختبار من كال هندرسون وديف تشايلد وفيل هاك ودوغ لوفيل وRFC 3696.158 عنوان اختبار في المجموع.

لقد أجريت كل هذه الاختبارات على كل المدققين الذين أمكنني العثور عليهم.المقارنة هنا : http://www.dominicsayers.com/isemail

سأحاول إبقاء هذه الصفحة محدثة حيث يقوم الأشخاص بتعزيز أدوات التحقق الخاصة بهم.شكرًا لكال وديف وفيل لمساعدتهم وتعاونهم في تجميع هذه الاختبارات والنقد البناء لها المدقق الخاص بي.

يجب أن يكون الناس على علم أخطاء ضد RFC 3696 بخاصة.ثلاثة من الأمثلة الأساسية هي في الواقع عناوين غير صالحة.والحد الأقصى لطول العنوان هو 254 أو 256 حرفًا، لا 320.

وانها ليست كل هراء على الرغم من أنه يسمح الأحرف مثل '+' يمكن أن تكون مفيدة للغاية بالنسبة للمستخدمين مكافحة الرسائل الاقتحامية، على سبيل المثال myemail+sketchysite@gmail.com (<لأ href = "http://lifehacker.com/software/gmail/instant-disposable-gmail-addresses-144397.php" يختلط = "نوفولو noreferrer" عنوان = "جي ميل: عناوين Gmail القابل للتصرف الفوري".> لحظة جوجل المتاح يتناول )

وفقط عندما يكون الموقع يقبل ذلك على الرغم من.

وهناك قواعد اللغة مجانا السياق BNF التي تصف عناوين البريد الإلكتروني صالحة في <لأ href = "ftp://ftp.rfc-editor.org/in-notes/rfc2822.txt" عنوان يختلط = "نوفولو noreferrer" = "RFC-2822"> 2822-RFC . ما هو معقد. على سبيل المثال:

" @ "@example.com

هو عنوان بريد إلكتروني صالح. أنا لا أعرف من أي regexps أن تفعل ذلك تماما. تتطلب الأمثلة التي عادة تعليقات ليتم تجريد أولا. كتبت الترميز التكراري النموذجي للقيام بذلك مرة واحدة بشكل كامل.

وأم لا لقبول غريبة، صيغ عنوان البريد الإلكتروني غير المألوف يعتمد، في رأيي، على ما يريد واحدة لتفعل معهم.

إذا كنت تكتب خادم البريد، عليك أن تكون دقيقة جدا وصحيحة لايطاق في ما يقبل. التعبير المعتاد "مجنون" المذكورة أعلاه ولذلك مناسبا.

لبقيتنا، على الرغم من أننا أساسا مجرد مهتم في ضمان أن شيئا ما يكتب المستخدم في نموذج ويب تبدو معقولة وليس لديها نوعا من حقن SQL أو تجاوز سعة المخزن المؤقت في ذلك.

وبصراحة، لا أحد يهتم حقا حول السماح لشخص إدخال عنوان البريد الإلكتروني 200 حرف مع التعليقات، أسطر جديدة، ونقلت ومسافات، الأقواس، أو رطانة أخرى عند الاشتراك في القائمة البريدية، إخبارية، أو موقع على شبكة الإنترنت؟ الرد المناسب على هذا المهرجين هي "أعود لاحقا عندما يكون لديك عنوان يشبه username@domain.tld".

والتحقق من صحة أفعل يتكون من ضمان وجود واحد بالضبط "@". أنه لا توجد مسافات، بلا قيم أو أسطر جديدة. هذا الجزء إلى يمين "@" لديها نقطة واحدة على الأقل (ولكن ليس اثنين النقاط في صف واحد)؛ وأنه لا توجد ونقلت والأقواس، الفواصل، كولون، الصياح، منقوطة، أو الخطوط المائلة العكسية، والتي من المرجح أن تكون محاولات hackery من أجزاء من عنوان البريد الإلكتروني الفعلي.

نعم، هذا يعني أنني رفض عناوين صالحة الذي شخص قد يحاول تسجيل على مواقع الويب الخاص بي - وربما أنا "غير صحيح" رفض ما لا يقل عن 0.001٪ من العناوين في العالم الحقيقي! أستطيع العيش مع ذلك.

ونقلا عن ومختلف أجزاء أخرى نادرا ما تستخدم ولكن صالحة للRFC تجعل من الصعب. أنا لا أعرف ما يكفي عن هذا الموضوع التعليق نهائيا، بخلاف "من الصعب" - لكن لحسن الحظ <لأ href = "http://haacked.com/archive/2007/08/21/i-knew-how-to -validate-في-البريد الإلكتروني عنوان حتى-i.aspx "يختلط =" نوفولو noreferrer "> الناس الآخر يكون <لأ href =" http://www.hm2k.com/posts/what-is- لصالح البريد الإلكتروني عنوان "يختلط =" نوفولو noreferrer "> كتب عن ذلك مطولا.

وأما فيما يتعلق باستخدام التعابير المنطقية صالحة لذلك، فإن بيرل البريد :: :: RFC822 حدة العناوين تحتوي على تعبير عادي والتي سوف تعمل على ما يبدو - ولكن فقط إذا تم استبدال أي تصريحات بيضاء بالفعل. (التعليقات في عنوان البريد الإلكتروني؟ ترى السبب في ذلك هو أصعب مما قد يتوقع المرء ...)

وبطبيعة الحال، فإن regexes مبسطة التي تكثر في أماكن أخرى والتحقق من صحة عنوان البريد الإلكتروني تقريبا كل الذي حقا المستخدمة ...

وبعض النكهات من التعابير المنطقية يمكن في الواقع تطابق بين قوسين المتداخلة (على سبيل المثال، تلك بيرل متوافقة). وقال، لقد رأيت التعابير المنطقية التي تدعي لمطابقة RFC 822 بشكل صحيح وكان صفحتين من النص دون أي بيضاء. ولذلك، فإن أفضل طريقة للكشف عن عنوان بريد إلكتروني صالح هو ارسال رسالة الى ذلك ونرى ما اذا كان يعمل.

وفقط لإضافة التعابير المنطقية التي هي أقل من مجنون واحد المذكورة من قبلmmaibaum:

^[a-zA-Z]([.]?([a-zA-Z0-9_-]+)*)?@([a-zA-Z0-9\-_]+\.)+[a-zA-Z]{2,4}$ 

وليس من الرصاص، وبالتأكيد لا تغطي المواصفات البريد الإلكتروني بالكامل، لكنها لا تفعل وظيفة لائقة لتغطي معظم الاحتياجات الأساسية. حتى أفضل، انها مفهومة إلى حد ما، ويمكن تحريرها.

وCribbed من النقاش في HouseOfFusion.com أو مورد من الطراز العالمي كولد فيوجن.

وطريقة سهلة وجيدة للتحقق من البريد الإلكتروني عناوين في جاوة هو استخدام EmailValidator من طراز أباتشي العموم المصادقة مكتبة .

وأود أن تحقق دائما عنوان البريد الإلكتروني في المدخلات وشكل ضد شيئا مثل هذا من قبل بإرسال بريد إلكتروني - حتى إذا قبض فقط بعض الأخطاء المطبعية. وربما كنت لا تريد أن تكتب على الماسح الضوئي الآلي ل"فشل التسليم" رسائل الإخطار. : -)

وانها من الصعب حقا لأن هناك الكثير من الأشياء التي يمكن أن تكون صالحة في عنوان البريد الإلكتروني وفقا لالالكتروني المواصفات، <وأ href = "http://www.faqs.org/rfcs/rfc2822.html" يختلط = "نوفولو noreferrer"> RFC 2822 . الأشياء التي لم تشاهد عادة مثل + هي تماما أحرف صالحة لعنوان البريد الإلكتروني .. وفقا لالمواصفات.

وهناك قسم كامل مكرس إلى عناوين البريد الإلكتروني على <أ href = ل "http://regexlib.com" يختلط = "نوفولو noreferrer"> http://regexlib.com ، الذي هو كبير من الموارد. فما استقاموا لكم فاستقيموا أقترح عليك أن تحديد المسائل ما هي المعايير لكم والعثور على واحد يطابق. معظم الناس حقا لا تحتاج الدعم الكامل لجميع الاحتمالات المسموح به من قبل المواصفات.

إذا كنت تقوم بتشغيل على .NET Framework، مجرد محاولة instantiating كائن MailAddress واصطياد FormatException إذا كان يفجر، أو سحب Address إذا نجحت. دون الدخول في أي هراء حول أداء اصطياد الاستثناءات (حقا، إذا كان هذا هو فقط على صفحة ويب واحدة تشكل أنها لن تجعل ذلك الكثير من الفرق)، وفئة MailAddress في .NET Framework يذهب من خلال تحليل كاملة تماما عملية (لا تستخدم التعابير المنطقية). فتح العاكس والبحث عن MailAddress وMailBnfHelper.ReadMailAddress() لرؤية كل الاشياء يتوهم يفعل. شخص أكثر ذكاء من لي قضيت الكثير من الوقت في بناء هذا محلل في شركة مايكروسوفت، وانا ذاهب لاستخدامه عندما كنت في الواقع إرسال رسالة عبر البريد الإلكتروني إلى هذا العنوان، لذلك قد تستخدم كذلك لتحقق من صحة عنوان واردة أيضا.

ولقد حاول كثيرون، والكثير تقترب. قد تحتاج إلى قراءة ويكيبيديا المقالة ، و <لأ href = "HTTP: / /www.ex-parrot.com/~pdw/Mail-RFC822-Address.html "يختلط =" نوفولو noreferrer "> بعض <لأ href =" http://www.hm2k.com/posts/what -IS واحد في صحيح البريد الإلكتروني عنوان "يختلط =" نوفولو noreferrer "> غيرها .

وعلى وجه التحديد، فأنت تريد أن نتذكر أن العديد من المواقع وخدمة البريد الالكتروني وخففت التحقق من عناوين البريد الإلكتروني، وذلك أساسا أنها لا تنفذ معيار بالكامل. انها جيدة بما فيه الكفاية للبريد الإلكتروني ليعمل طوال الوقت على الرغم من.

وهذه محاولة واحدة:

"(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])"

وإلقاء نظرة هنا للحصول على التفاصيل.

ولكن، بدلا من تنفيذ المعيار RFC822، وربما سيكون من الأفضل أن ننظر الى الامر من وجهة نظر أخرى. فإنه لا يهم حقا ما يقول المعيار إذا ملقمات البريد لا تعكس مستوى. لذلك أنا أزعم أنه سيكون من الأفضل لتقليد ما تفعل خدمة البريد الأكثر شعبية عند التحقق من صحة عناوين البريد الإلكتروني.

تحتوي هذه الفئة الخاصة بـ Java على أداة التحقق من الصحة:http://www.leshazlewood.com/?p=23

تمت كتابة هذا بواسطة منشئ Shiro (المعروف رسميًا باسم Ki، رسميًا JSecurity)

إيجابيات وسلبيات اختبار صحة عنوان البريد الإلكتروني:

هناك نوعان من التعابير المنطقية التي تتحقق من صحة رسائل البريد الإلكتروني:

  1. تلك التي هي فضفاضة جدا.
  2. تلك الصارمة للغاية.

ليس من الممكن أن يطابق التعبير العادي جميع عناوين البريد الإلكتروني الصالحة ولا يطابق أي عناوين بريد إلكتروني غير صالحة لأن بعض السلاسل قد تبدو وكأنها عناوين بريد إلكتروني صالحة ولكنها لا تنتقل فعليًا إلى صندوق الوارد الخاص بأي شخص.الطريقة الوحيدة لاختبار ما إذا كان البريد الإلكتروني صالحًا بالفعل هي إرسال بريد إلكتروني إلى هذا العنوان ومعرفة ما إذا كنت تحصل على نوع من الاستجابة.مع أخذ ذلك في الاعتبار، لا يبدو أن التعابير المعتادة الصارمة جدًا في مطابقة رسائل البريد الإلكتروني لها غرض كبير.

أعتقد أن معظم الأشخاص الذين يطلبون التعبير العادي للبريد الإلكتروني يبحثون عن الخيار الأول، وهو التعبير العادي الفضفاض للغاية.إنهم يريدون اختبار سلسلة ومعرفة ما إذا كانت تبدو كرسالة بريد إلكتروني، وإذا لم تكن بالتأكيد رسالة بريد إلكتروني، فيمكنهم أن يقولوا للمستخدم:"مرحبًا، من المفترض أن تضع بريدًا إلكترونيًا هنا وهذا بالتأكيد ليس بريدًا إلكترونيًا صالحًا.ربما لم تدرك أن هذا الحقل مخصص للبريد الإلكتروني أو ربما هناك خطأ مطبعي".

إذا قام المستخدم بإدخال سلسلة تشبه إلى حد كبير بريدًا إلكترونيًا صالحًا، ولكنها في الواقع ليست كذلك، فهذه مشكلة يجب معالجتها بواسطة جزء مختلف من التطبيق.

هل يستطيع أحد أن يقدم بعض فكرة لماذا هو؟

نعم، هذا هو معيار معقدة للغاية التي تسمح الكثير من الاشياء التي تستخدمها لا أحد حقا اليوم. :)

هل هناك أي معروف وregexps أن تفعل هذا الواقع تماما ثبت؟

وهنا هو محاولة واحدة لتحليل مستوى كله تماما ...

http://ex-parrot.com/~pdw/Mail -RFC822-Address.html

ما هي بعض البدائل الجيدة لاستخدام regexps لمطابقة عناوين البريد الإلكتروني؟

وباستخدام الإطار الحالي لأنه في أي اللغة التي تستخدم أعتقد؟ على الرغم من أن تلك ربما ستستخدم التعبير العادي داخليا. بل هو سلسلة معقدة. تم تصميم Regexps تحليل سلاسل معقدة، لذلك هذا هو حقا افضل خيار لكم.

تعديل : لوأود أن أضيف أن التعبير العادي I ترتبط كان لمجرد التسلية. أنا لا أؤيد استخدام التعبير العادي معقدة من هذا القبيل - بعض الناس يقولون انه "في حال التعبير العادي الخاص بك هو أكثر من سطر واحد، ويضمن أن يكون لديها خلل في مكان ما". أنا مرتبط به لتوضيح مدى تعقيد المعيار.

اضافة الى واينالجواب، هناك أيضا قسم حول www.regular-expressions.info مخصصة للبريد الإلكتروني، مع بعض العينات.

يمكنك دائمًا التساؤل عما إذا كان الأمر يستحق ذلك أم أنه في الواقع أي إن التعبير العادي الذي يغطي أقل من 100٪ لا يساهم إلا في خلق شعور زائف بالأمان.

في النهاية، في الواقع إرسال البريد الإلكتروني هو ما سيوفر التحقق النهائي الحقيقي.(-ستكتشف ما إذا كان خادم البريد الخاص بك يحتوي على أخطاء؛-)

لاكتمال هذا المنصب، وأيضا لPHP هناك المدمج في وظيفة اللغة للتحقق من رسائل البريد الإلكتروني.

لPHP استخدام filter_var لطيفة مع محدد نوع البريد الإلكتروني التحقق من الصحة:)

وregexes البريد الإلكتروني لا أكثر المجنونة في بي: D

var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));

http://www.php.net/filter_var

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top