הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   [PHP] מדריך לאימות דואר אלקטרוני (יותר מביטוי רגולרי פשוט) (https://hosts.co.il/forums/showthread.php?t=58918)

-roee- 11-01-08 22:29

[PHP] מדריך לאימות דואר אלקטרוני (יותר מביטוי רגולרי פשוט)
 
היי,

למעשה בימים האחרונים פנו אלי אנשים שונים ובקשו ממני לעזור להם לשפר את המערכות שהם בנו מבחינת "אבטחה" או איך נקרא לזה - "התחכמות".

אז החלטתי לתת לכם את הפונקציה האישית שלי אשר עובדת במערכות שבניתי.
הפונקציה בעצם מקבלת מחרוזת ומבצעת פעולה שימושית מאוד, בודקת האם המחרוזת היא דואר אלקטרוני תקינה אלא שבנוסף לבדיקה הרגילה של הביטוי הרגולרי, הפונקציה מנסה ליצור קשר עם השרת ולוודא שאכן הוא קיים.
היתרון הענקי של הפונקציה זה הוא שהיא לא משתמשת ב-fsockopen אלא ב-gethostbyname פשוט.

PHP קוד:

// נכתב על ידי רועי נוי
// http://www.roeenoy.com
function check_email$email )

    
$email htmlspecialchars stripslashes strip_tags $email ) ) , ENT_QUOTES );
    if ( 
eregi ('^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}$'$email ) )
    {
        
$domain explode('@'$email ) ;
        
$domain_ip gethostbyname($domain[1]);
        if( 
$domain[1] != $domain_ip )
        {
            return 
true;
        }else {
            return 
false;
        }
    } else {
        return 
false;
    }


לא נראה לי שיש פה יותר מדי מה להסביר, כל אחד יכול להבין את הקוד הפשוט הזה.

על מנת להשתמש בפונקציה יש כמובן לכתוב כך:
PHP קוד:

if( check_email("my_username@yahoo.com") )
    echo 
"<font color=green>Correct Email Address</font>";
else
    echo 
"<font color=red>Wrong Email Address</font>"

מה ניתן לומר עוד?
זוהי פונקציה שימושית מאוד ואני ממליץ מקרב לב להשתמש בה.

meshuga 11-01-08 23:17

ציטוט:

נכתב במקור על ידי roeenoy (פרסם 599739)
היי,

למעשה בימים האחרונים פנו אלי אנשים שונים ובקשו ממני לעזור להם לשפר את המערכות שהם בנו מבחינת "אבטחה" או איך נקרא לזה - "התחכמות".

אז החלטתי לתת לכם את הפונקציה האישית שלי אשר עובדת במערכות שבניתי.
הפונקציה בעצם מקבלת מחרוזת ומבצעת פעולה שימושית מאוד, בודקת האם המחרוזת היא דואר אלקטרוני תקינה אלא שבנוסף לבדיקה הרגילה של הביטוי הרגולרי, הפונקציה מנסה ליצור קשר עם השרת ולוודא שאכן הוא קיים.
היתרון הענקי של הפונקציה זה הוא שהיא לא משתמשת ב-fsockopen אלא ב-gethostbyname פשוט.

PHP קוד:

// נכתב על ידי רועי נוי
// http://www.roeenoy.com
function check_email$email )

    
$email htmlspecialchars stripslashes strip_tags $email ) ) , ENT_QUOTES );
    if ( 
eregi ('^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}$'$email ) )
    {
        
$domain explode('@'$email ) ;
        
$domain_ip gethostbyname($domain[1]);
        if( 
$domain[1] != $domain_ip )
        {
            return 
true;
        }else {
            return 
false;
        }
    } else {
        return 
false;
    }


לא נראה לי שיש פה יותר מדי מה להסביר, כל אחד יכול להבין את הקוד הפשוט הזה.

על מנת להשתמש בפונקציה יש כמובן לכתוב כך:
PHP קוד:

if( check_email("my_username@yahoo.com") )
    echo 
"<font color=green>Correct Email Address</font>";
else
    echo 
"<font color=red>Wrong Email Address</font>"

מה ניתן לומר עוד?
זוהי פונקציה שימושית מאוד ואני ממליץ מקרב לב להשתמש בה.

לא רואה ממש "היגיון", זה לא בודק אם המייל קיים, זה רק בודק אם הדומיין קיים...על שרת כלשהו.

אולי פשוט נישאר עם הדבר הפשוט והטוב, ביטוי רגולרי ושליחת אימות..

בכל זאת. קבל ח"ח..מי שיראה את זה כשימושי...בכיף.

-roee- 12-01-08 09:32

ציטוט:

נכתב במקור על ידי meshuga (פרסם 599746)
לא רואה ממש "היגיון", זה לא בודק אם המייל קיים, זה רק בודק אם הדומיין קיים...על שרת כלשהו.

אולי פשוט נישאר עם הדבר הפשוט והטוב, ביטוי רגולרי ושליחת אימות..

בכל זאת. קבל ח"ח..מי שיראה את זה כשימושי...בכיף.

אין ספק שכל מה שאמרת נכון במאה האחוזים.
פשוט זה יהפוך את כל המקומות שבהם אמורים להכניס אימייל באתר שלכם ליותר יפים.
במקום שמישהו יחרבש asa@adfas.sf לפחות הוא ישקיע מחשבה ויתן למנהל האתר אשלייה שזוהי באמת כתובתו האמיתית: asa@yahoo.com :)

meshuga 12-01-08 10:33

ציטוט:

נכתב במקור על ידי roeenoy (פרסם 599800)
אין ספק שכל מה שאמרת נכון במאה האחוזים.
פשוט זה יהפוך את כל המקומות שבהם אמורים להכניס אימייל באתר שלכם ליותר יפים.
במקום שמישהו יחרבש asa@adfas.sf לפחות הוא ישקיע מחשבה ויתן למנהל האתר אשלייה שזוהי באמת כתובתו האמיתית: asa@yahoo.com :)

מסכים, כמו שאמרתי. זה יכול להיות שימושי במקרים מסויימים...למשל..רשימת תפוצה..להקל על המסד נתונים ולא להכניס כל שטות אז לפחות לבדוק שהשרת קיים..מקובל..אבל במקרים כמו הרשמה. זה מיותר.

Daniel 12-01-08 11:56

פונקצייה שגם באמת בודקת יותר דברים, מצאתי ברשת,

PHP קוד:

    function checkEmail($email$chFail false)
    {
        
$msgs = Array();
        
$msgs[] = 'Received email address: ' $email;
        
// check for email pattern (adapted and improved from http://karmak.org/archive/2003/02/validemail.html)
        // incorrectly allows IP addresses with block numbers > 256, but those will fail to create sockets anyway
        // unicode norwegian chars cannot be used: C caron, D stroke, ENG, N acute, S caron, T stroke, Z caron (PHP unicode limitation)
        
if (!preg_match("/^(([^<>()[\]\\\\.,;:\s@\"]+(\.[^<>()[\]\\\\.,;:\s@\"]+)*)|(\"([^\"\\\\\r]|(\\\\[\w\W]))*\"))@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([a-z\-0-9????????????????]+\.)+[a-z]{2,}))$/i"$email)) {
            
$msgs[] = 'Email address was not recognised as a valid email pattern';
            return 
$chFail ? Array(false$msgs) : false;
        }
        
$msgs[] = 'Email address was recognised as a valid email pattern';
        
// get the mx host name
        
if (preg_match("/@\[[\d.]*\]$/"$email)) {
            
$mxHost[0] = preg_replace("/[\w\W]*@\[([\d.]+)\]$/""$1"$email);
            
$msgs[] = 'Email address contained IP address ' $mxHost[0] . ' - no need for MX lookup';
        } else {
            
// get all mx servers - if no MX records, assume domain is MX (SMTP RFC)
            
$domain preg_replace("/^[\w\W]*@([^@]*)$/i""$1"$email);
            if (!
getmxrr($domain$mxHost$weightings)) {
                
$mxHost[0] = $domain;
                
$msgs[] = 'Failed to obtain MX records, defaulting to ' $domain ' as specified by SMTP protocol';
            } else {
                
array_multisort($weightings$mxHost);
                
$cnt '';
                
$co 0;
                foreach(
$mxHost as $ch) {
                    
$cnt .= ($cnt ', ' '') . $ch ' (' $weightings[$co] . ')';
                    
$co++;
                }
                
$msgs[] = 'Obtained the following MX records for ' $domain ': ' $cnt;
            }
        }
        
// check each server until you are given permission to connect, then check only that one server
        
foreach($mxHost as $currentHost) {
            
$msgs[] = 'Checking MX server: ' $currentHost;
            if (
$connection fsockopen($currentHost25)) {
                
$msgs[] = 'Created socket (' $connection ') to ' $currentHost;
                if (
preg_match("/^2\d\d/"$cn fgets($connection1024))) {
                    
$msgs[] = $currentHost ' sent SMTP connection header - no futher MX servers will be checked: ' $cn;
                    while (
preg_match("/^2\d\d-/"$cn)) {
                        
$cn fgets($connection1024);
                        
$msgs[] = $currentHost ' sent extra connection header: ' $cn;
                    } 
//throw away any extra rubbish
                    
if (!$_SERVER) {
                        global 
$HTTP_SERVER_VARS;
                        
$_SERVER $HTTP_SERVER_VARS;
                    }
                    
// attempt to send an email from the user to themselves (not <> as some misconfigured servers reject it)
                    
$localHostIP gethostbyname(preg_replace("/^.*@|:.*$/"''$_SERVER['HTTP_HOST']));
                    
$localHostName gethostbyaddr($localHostIP);
                    
fputs($connection'HELO ' . ($localHostName?$localHostName:('[' $localHostIP ']')) . "\r\n");
                    if (
$success preg_match("/^2\d\d/"$hl fgets($connection1024))) {
                        
$msgs[] = $currentHost ' sent HELO response: ' $hl;
                        
fputs($connection"MAIL FROM: <$email>\r\n");
                        if (
$success preg_match("/^2\d\d/"$from fgets($connection1024))) {
                            
$msgs[] = $currentHost ' sent MAIL FROM response: ' $from;
                            
fputs($connection"RCPT TO: <$email>\r\n");
                            if (
$success preg_match("/^2\d\d/"$to fgets($connection1024))) {
                                
$msgs[] = $currentHost ' sent RCPT TO response: ' $to;
                            } else {
                                
$msgs[] = $currentHost ' rejected recipient: ' $to;
                            }
                        } else {
                            
$msgs[] = $currentHost ' rejected MAIL FROM: ' $from;
                        }
                    } else {
                        
$msgs[] = $currentHost ' rejected HELO: ' $hl;
                    }
                    
fputs($connection"QUIT\r\n");
                    
fgets($connection1024);
                    
fclose($connection);
                    
// see if the transaction was permitted (i.e. does that email address exist)
                    
$msgs[] = $success ? ('Email address was accepted by ' $currentHost) : ('Email address was rejected by ' $currentHost);
                    return 
$chFail ? Array($success$msgs) : $success;
                } elseif (
preg_match("/^550/"$cn)) {
                    
$msgs[] = 'Mail domain denies connections from this host - no futher MX servers will be checked: ' $cn;
                    return 
$chFail ? Array(false$msgs) : false;
                } else {
                    
$msgs[] = $currentHost ' did not send SMTP connection header: ' $cn;
                }
            } else {
                
$msgs[] = 'Failed to create socket to ' $currentHost;
            }
        }
        
$msgs[] = 'Could not establish SMTP session with any MX servers';
        return 
$chFail ? Array(false$msgs) : false;
    } 


ViPeRt 12-01-08 14:11

בדקתי את הסקריפט הוא באמת עובד...

הזמן שלוקח לו:
* 0.253848 sec


כל הזמנים הם GMT +2. הזמן כעת הוא 06:49.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ