⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rfc822.php

📁 This is the script which used on 10minutemail.com for temporary email.
💻 PHP
📖 第 1 页 / 共 3 页
字号:
    }    /**     * A common function that will check an exploded string.     *     * @access private     * @param array $parts The exloded string.     * @param string $char  The char that was exploded on.     * @return mixed False if the string contains unclosed quotes/brackets, or the string on success.     */    function _splitCheck($parts, $char)    {        $string = $parts[0];        for ($i = 0; $i < count($parts); $i++) {            if ($this->_hasUnclosedQuotes($string)                || $this->_hasUnclosedBrackets($string, '<>')                || $this->_hasUnclosedBrackets($string, '[]')                || $this->_hasUnclosedBrackets($string, '()')                || substr($string, -1) == '\\') {                if (isset($parts[$i + 1])) {                    $string = $string . $char . $parts[$i + 1];                } else {                    $this->error = 'Invalid address spec. Unclosed bracket or quotes';                    return false;                }            } else {                $this->index = $i;                break;            }        }        return $string;    }    /**     * Checks if a string has an unclosed quotes or not.     *     * @access private     * @param string $string The string to check.     * @return boolean True if there are unclosed quotes inside the string, false otherwise.     */    function _hasUnclosedQuotes($string)    {        $string     = explode('"', $string);        $string_cnt = count($string);        for ($i = 0; $i < (count($string) - 1); $i++)            if (substr($string[$i], -1) == '\\')                $string_cnt--;        return ($string_cnt % 2 === 0);    }    /**     * Checks if a string has an unclosed brackets or not. IMPORTANT:     * This function handles both angle brackets and square brackets;     *     * @access private     * @param string $string The string to check.     * @param string $chars  The characters to check for.     * @return boolean True if there are unclosed brackets inside the string, false otherwise.     */    function _hasUnclosedBrackets($string, $chars)    {        $num_angle_start = substr_count($string, $chars[0]);        $num_angle_end   = substr_count($string, $chars[1]);        $this->_hasUnclosedBracketsSub($string, $num_angle_start, $chars[0]);        $this->_hasUnclosedBracketsSub($string, $num_angle_end, $chars[1]);        if ($num_angle_start < $num_angle_end) {            $this->error = 'Invalid address spec. Unmatched quote or bracket (' . $chars . ')';            return false;        } else {            return ($num_angle_start > $num_angle_end);        }    }    /**     * Sub function that is used only by hasUnclosedBrackets().     *     * @access private     * @param string $string The string to check.     * @param integer &$num    The number of occurences.     * @param string $char   The character to count.     * @return integer The number of occurences of $char in $string, adjusted for backslashes.     */    function _hasUnclosedBracketsSub($string, &$num, $char)    {        $parts = explode($char, $string);        for ($i = 0; $i < count($parts); $i++){            if (substr($parts[$i], -1) == '\\' || $this->_hasUnclosedQuotes($parts[$i]))                $num--;            if (isset($parts[$i + 1]))                $parts[$i + 1] = $parts[$i] . $char . $parts[$i + 1];        }        return $num;    }    /**     * Function to begin checking the address.     *     * @access private     * @param string $address The address to validate.     * @return mixed False on failure, or a structured array of address information on success.     */    function _validateAddress($address)    {        $is_group = false;        $addresses = array();        if ($address['group']) {            $is_group = true;            // Get the group part of the name            $parts     = explode(':', $address['address']);            $groupname = $this->_splitCheck($parts, ':');            $structure = array();            // And validate the group part of the name.            if (!$this->_validatePhrase($groupname)){                $this->error = 'Group name did not validate.';                return false;            } else {                // Don't include groups if we are not nesting                // them. This avoids returning invalid addresses.                if ($this->nestGroups) {                    $structure = new stdClass;                    $structure->groupname = $groupname;                }            }            $address['address'] = ltrim(substr($address['address'], strlen($groupname . ':')));        }        // If a group then split on comma and put into an array.        // Otherwise, Just put the whole address in an array.        if ($is_group) {            while (strlen($address['address']) > 0) {                $parts       = explode(',', $address['address']);                $addresses[] = $this->_splitCheck($parts, ',');                $address['address'] = trim(substr($address['address'], strlen(end($addresses) . ',')));            }        } else {            $addresses[] = $address['address'];        }        // Check that $addresses is set, if address like this:        // Groupname:;        // Then errors were appearing.        if (!count($addresses)){            $this->error = 'Empty group.';            return false;        }        // Trim the whitespace from all of the address strings.        array_map('trim', $addresses);        // Validate each mailbox.        // Format could be one of: name <geezer@domain.com>        //                         geezer@domain.com        //                         geezer        // ... or any other format valid by RFC 822.        for ($i = 0; $i < count($addresses); $i++) {            if (!$this->validateMailbox($addresses[$i])) {                if (empty($this->error)) {                    $this->error = 'Validation failed for: ' . $addresses[$i];                }                return false;            }        }        // Nested format        if ($this->nestGroups) {            if ($is_group) {                $structure->addresses = $addresses;            } else {                $structure = $addresses[0];            }        // Flat format        } else {            if ($is_group) {                $structure = array_merge($structure, $addresses);            } else {                $structure = $addresses;            }        }        return $structure;    }    /**     * Function to validate a phrase.     *     * @access private     * @param string $phrase The phrase to check.     * @return boolean Success or failure.     */    function _validatePhrase($phrase)    {        // Splits on one or more Tab or space.        $parts = preg_split('/[ \\x09]+/', $phrase, -1, PREG_SPLIT_NO_EMPTY);        $phrase_parts = array();        while (count($parts) > 0){            $phrase_parts[] = $this->_splitCheck($parts, ' ');            for ($i = 0; $i < $this->index + 1; $i++)                array_shift($parts);        }        foreach ($phrase_parts as $part) {            // If quoted string:            if (substr($part, 0, 1) == '"') {                if (!$this->_validateQuotedString($part)) {                    return false;                }                continue;            }            // Otherwise it's an atom:            if (!$this->_validateAtom($part)) return false;        }        return true;    }    /**     * Function to validate an atom which from rfc822 is:     * atom = 1*<any CHAR except specials, SPACE and CTLs>     *     * If validation ($this->validate) has been turned off, then     * validateAtom() doesn't actually check anything. This is so that you     * can split a list of addresses up before encoding personal names     * (umlauts, etc.), for example.     *     * @access private     * @param string $atom The string to check.     * @return boolean Success or failure.     */    function _validateAtom($atom)    {        if (!$this->validate) {            // Validation has been turned off; assume the atom is okay.            return true;        }        // Check for any char from ASCII 0 - ASCII 127        if (!preg_match('/^[\\x00-\\x7E]+$/i', $atom, $matches)) {            return false;        }        // Check for specials:        if (preg_match('/[][()<>@,;\\:". ]/', $atom)) {            return false;        }        // Check for control characters (ASCII 0-31):        if (preg_match('/[\\x00-\\x1F]+/', $atom)) {            return false;        }        return true;    }    /**     * Function to validate quoted string, which is:     * quoted-string = <"> *(qtext/quoted-pair) <">     *     * @access private     * @param string $qstring The string to check     * @return boolean Success or failure.     */    function _validateQuotedString($qstring)    {        // Leading and trailing "        $qstring = substr($qstring, 1, -1);        // Perform check, removing quoted characters first.        return !preg_match('/[\x0D\\\\"]/', preg_replace('/\\\\./', '', $qstring));    }    /**     * Function to validate a mailbox, which is:     * mailbox =   addr-spec         ; simple address     *           / phrase route-addr ; name and route-addr     *     * @access public     * @param string &$mailbox The string to check.     * @return boolean Success or failure.     */    function validateMailbox(&$mailbox)    {        // A couple of defaults.        $phrase  = '';        $comment = '';        $comments = array();        // Catch any RFC822 comments and store them separately.        $_mailbox = $mailbox;        while (strlen(trim($_mailbox)) > 0) {            $parts = explode('(', $_mailbox);            $before_comment = $this->_splitCheck($parts, '(');            if ($before_comment != $_mailbox) {                // First char should be a (.                $comment    = substr(str_replace($before_comment, '', $_mailbox), 1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -