ما مدى سهولة التحقق من أن عنوان البريد الإلكتروني صالح في PHP؟ [مكرر

StackOverflow https://stackoverflow.com/questions/2838835

  •  27-09-2019
  •  | 
  •  

سؤال

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

كيف سيكون هذا يبدو في PHP؟

ملحوظة: لا أريد أن أفسح عنوان البريد الإلكتروني بحد ذاتها هو صالح بشكل نحلي. أريد أن أعرف ما إذا كان المجال سوف قبول أرسل بريدًا إلكترونيًا إلى هذا العنوان.

كنت أعتقد أن هناك طريقة لفعل ذلك مع سجل MX أو شيء من هذا القبيل ...

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

المحلول

أعتقد أن خياراتك الوحيدة ستكون SMTP RCPT إلى أوامر VRFY.

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

يمكن أن يخبرك VRFY ما إذا كان هناك حساب على هذا الخادم ، ولكن يتم تعطيل هذا دائمًا لمنع تحقيقات الحساب.

فئة PHP التي تقوم بـ RCPT للتحقق (من بين طرق أخرى) هي: http://code.google.com/p/php-smtp-email-validation/

نصائح أخرى

منذ أن ذكرت على وجه التحديد

أن مجال البريد الإلكتروني سوف يقبل البريد الإلكتروني لهذا العنوان.

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

إرسال بريد إلكتروني أساسي مثل هذا مع PHP بسيط بشكل معقول ؛ تحقق من الوثائق الخاصة mail() وظيفة هنا.

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

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

الشيء الوحيد الذي يمكنك القيام به إلى حد كبير هو التحقق من وجود عنوان بريد إلكتروني صالح ، والأمل في الأفضل:

http://www.linuxjournal.com/article/9585

هذا هو أحد البرامج التعليمية التي تتبع المعايير في RFC بالفعل.

/**
Validate an email address.
Provide email address (raw input)
Returns true if the email address has the email 
address format and the domain exists.
*/
function validEmail($email)
{
   $isValid = true;
   $atIndex = strrpos($email, "@");
   if (is_bool($atIndex) && !$atIndex)
   {
      $isValid = false;
   }
   else
   {
      $domain = substr($email, $atIndex+1);
      $local = substr($email, 0, $atIndex);
      $localLen = strlen($local);
      $domainLen = strlen($domain);
      if ($localLen < 1 || $localLen > 64)
      {
         // local part length exceeded
         $isValid = false;
      }
      else if ($domainLen < 1 || $domainLen > 255)
      {
         // domain part length exceeded
         $isValid = false;
      }
      else if ($local[0] == '.' || $local[$localLen-1] == '.')
      {
         // local part starts or ends with '.'
         $isValid = false;
      }
      else if (preg_match('/\\.\\./', $local))
      {
         // local part has two consecutive dots
         $isValid = false;
      }
      else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain))
      {
         // character not valid in domain part
         $isValid = false;
      }
      else if (preg_match('/\\.\\./', $domain))
      {
         // domain part has two consecutive dots
         $isValid = false;
      }
      else if
(!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/',
                 str_replace("\\\\","",$local)))
      {
         // character not valid in local part unless 
         // local part is quoted
         if (!preg_match('/^"(\\\\"|[^"])+"$/',
             str_replace("\\\\","",$local)))
         {
            $isValid = false;
         }
      }
      if ($isValid && !(checkdnsrr($domain,"MX") || 
 ↪checkdnsrr($domain,"A")))
      {
         // domain not found in DNS
         $isValid = false;
      }
   }
   return $isValid;
}

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

ما مدى سهولة التحقق من أن عنوان البريد الإلكتروني صالح؟

ليس من السهل على الإطلاق. ألق نظرة على التحقق من صحة البريد الإلكتروني لـ Dominic Sayers في PHP ، ربما تكون مكتبة التحقق من صحة البريد الإلكتروني الأكثر اكتمالا في أي لغة. ويشمل أيضا فحص DNS.

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

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

فقط اعتقدت أنني أذكر أن PHP لديه وظيفة مدمجة getmxrr() يسترجع سجل MX من المجال.

كيف يكون هذا مفيدًا ، لا أعرف ... على الصفحة ينص على:

لا ينبغي استخدام هذه الوظيفة لأغراض التحقق من العنوان.

لذلك يقتصر استخدامه على التحقق من أن المجال يحتوي على Mailserver.

إذا كنت تستخدم PHP 5.2.x ، فلا تحتاج الآن إلى استخدام وظائف التحقق من الصحة المخصصة. PHP يأتي مع أ بنيت في وظيفة

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