pax_global_header00006660000000000000000000000064126205327400014513gustar00rootroot0000000000000052 comment=04c6cdf9871140b80947c87db7770c0dd9c75c7c EmailValidator-1.2.11/000077500000000000000000000000001262053274000144725ustar00rootroot00000000000000EmailValidator-1.2.11/.coveralls.yml000066400000000000000000000001141262053274000172610ustar00rootroot00000000000000service_name: travis-ci src_dir: . coverage_clover: build/logs/clover*.xml EmailValidator-1.2.11/.gitignore000066400000000000000000000000201262053274000164520ustar00rootroot00000000000000report/ vendor/ EmailValidator-1.2.11/.travis.yml000066400000000000000000000010301262053274000165750ustar00rootroot00000000000000sudo: false language: php php: - 5.3 - 5.4 - 5.5 - 5.6 - 7.0 - hhvm env: global: - deps=no matrix: fast_finish: true include: - php: 5.3 env: deps=low - php: 5.6 env: deps=high install: - if [ "$deps" = "no" ]; then composer install; fi - if [ "$deps" = "low" ]; then composer update --prefer-lowest; fi - if [ "$deps" = "high" ]; then composer update; fi script: - mkdir -p build/logs - phpunit --coverage-clover build/logs/clover.xml after_script: - php vendor/bin/coveralls EmailValidator-1.2.11/LICENSE000066400000000000000000000020501262053274000154740ustar00rootroot00000000000000Copyright (c) 2013 Eduardo Gulias Davis Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. EmailValidator-1.2.11/README.md000066400000000000000000000042441262053274000157550ustar00rootroot00000000000000#EmailValidator [![Build Status](https://travis-ci.org/egulias/EmailValidator.png?branch=master)](https://travis-ci.org/egulias/EmailValidator) [![Coverage Status](https://coveralls.io/repos/egulias/EmailValidator/badge.png?branch=master)](https://coveralls.io/r/egulias/EmailValidator?branch=master) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/egulias/EmailValidator/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/egulias/EmailValidator/?branch=master) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/22ba6692-9c02-42e5-a65d-1c5696bfffc6/small.png)](https://insight.sensiolabs.com/projects/22ba6692-9c02-42e5-a65d-1c5696bfffc6) ============================= With the help of ![Powered by PhpStorm](https://www.jetbrains.com/phpstorm/documentation/docs/logo_phpstorm.png) ##Installation## Run the command below to install via Composer ```shell composer require egulias/email-validator "~1.2" ``` ##Usage## Simple example: ```php isValid($email)) { echo $email . ' is a valid email address'; } ``` More advanced example (returns detailed diagnostic error codes): ```php isValid($email); if ($result) { echo $email . ' is a valid email address'; } else if ($validator->hasWarnings()) { echo 'Warning! ' . $email . ' has unusual/deprecated features (result code ' . var_export($validator->getWarnings(), true) . ')'; } else { echo $email . ' is not a valid email address (result code ' . $validator->getError() . ')'; } ``` ##Contributors## As this is a port from another library and work, here are other people related to the previous: * Ricard Clau [@ricardclau](http://github.com/ricardclau): Performance against PHP built-in filter_var * Josepf Bielawski [@stloyd](http://github.com/stloyd): For its first re-work of Dominic's lib * Dominic Sayers [@dominicsayers](http://github.com/dominicsayers): The original isemail function ##License## Released under the MIT License attached with this code. EmailValidator-1.2.11/composer.json000066400000000000000000000012741262053274000172200ustar00rootroot00000000000000{ "name": "egulias/email-validator", "description": "A library for validating emails", "homepage": "https://github.com/egulias/EmailValidator", "type": "Library", "keywords": ["email", "validation", "validator", "emailvalidation", "emailvalidator"], "license": "MIT", "authors": [ {"name": "Eduardo Gulias Davis"} ], "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "require": { "php": ">= 5.3.3", "doctrine/lexer": "~1.0,>=1.0.1" }, "require-dev" : { "satooshi/php-coveralls": "dev-master", "phpunit/phpunit": "~4.4" }, "autoload": { "psr-0": { "Egulias\\": "src/" } } } EmailValidator-1.2.11/composer.lock000066400000000000000000001464541262053274000172110ustar00rootroot00000000000000{ "_readme": [ "This file locks the dependencies of your project to a known state", "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], "hash": "9426f5a00cf0f71d83c287a7c0ff392b", "packages": [ { "name": "doctrine/lexer", "version": "v1.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", "shasum": "" }, "require": { "php": ">=5.3.2" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "psr-0": { "Doctrine\\Common\\Lexer\\": "lib/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Roman Borschel", "email": "roman@code-factory.org" }, { "name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com" }, { "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com" } ], "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", "homepage": "http://www.doctrine-project.org", "keywords": [ "lexer", "parser" ], "time": "2014-09-09 13:34:57" } ], "packages-dev": [ { "name": "doctrine/instantiator", "version": "1.0.5", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", "shasum": "" }, "require": { "php": ">=5.3,<8.0-DEV" }, "require-dev": { "athletic/athletic": "~0.1.8", "ext-pdo": "*", "ext-phar": "*", "phpunit/phpunit": "~4.0", "squizlabs/php_codesniffer": "~2.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Marco Pivetta", "email": "ocramius@gmail.com", "homepage": "http://ocramius.github.com/" } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", "homepage": "https://github.com/doctrine/instantiator", "keywords": [ "constructor", "instantiate" ], "time": "2015-06-14 21:17:01" }, { "name": "guzzle/guzzle", "version": "v3.9.3", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle3.git", "reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/guzzle/guzzle3/zipball/0645b70d953bc1c067bbc8d5bc53194706b628d9", "reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9", "shasum": "" }, "require": { "ext-curl": "*", "php": ">=5.3.3", "symfony/event-dispatcher": "~2.1" }, "replace": { "guzzle/batch": "self.version", "guzzle/cache": "self.version", "guzzle/common": "self.version", "guzzle/http": "self.version", "guzzle/inflection": "self.version", "guzzle/iterator": "self.version", "guzzle/log": "self.version", "guzzle/parser": "self.version", "guzzle/plugin": "self.version", "guzzle/plugin-async": "self.version", "guzzle/plugin-backoff": "self.version", "guzzle/plugin-cache": "self.version", "guzzle/plugin-cookie": "self.version", "guzzle/plugin-curlauth": "self.version", "guzzle/plugin-error-response": "self.version", "guzzle/plugin-history": "self.version", "guzzle/plugin-log": "self.version", "guzzle/plugin-md5": "self.version", "guzzle/plugin-mock": "self.version", "guzzle/plugin-oauth": "self.version", "guzzle/service": "self.version", "guzzle/stream": "self.version" }, "require-dev": { "doctrine/cache": "~1.3", "monolog/monolog": "~1.0", "phpunit/phpunit": "3.7.*", "psr/log": "~1.0", "symfony/class-loader": "~2.1", "zendframework/zend-cache": "2.*,<2.3", "zendframework/zend-log": "2.*,<2.3" }, "suggest": { "guzzlehttp/guzzle": "Guzzle 5 has moved to a new package name. The package you have installed, Guzzle 3, is deprecated." }, "type": "library", "extra": { "branch-alias": { "dev-master": "3.9-dev" } }, "autoload": { "psr-0": { "Guzzle": "src/", "Guzzle\\Tests": "tests/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, { "name": "Guzzle Community", "homepage": "https://github.com/guzzle/guzzle/contributors" } ], "description": "PHP HTTP client. This library is deprecated in favor of https://packagist.org/packages/guzzlehttp/guzzle", "homepage": "http://guzzlephp.org/", "keywords": [ "client", "curl", "framework", "http", "http client", "rest", "web service" ], "time": "2015-03-18 18:23:50" }, { "name": "phpdocumentor/reflection-docblock", "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "phpunit/phpunit": "~4.0" }, "suggest": { "dflydev/markdown": "~1.0", "erusev/parsedown": "~1.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "autoload": { "psr-0": { "phpDocumentor": [ "src/" ] } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Mike van Riel", "email": "mike.vanriel@naenius.com" } ], "time": "2015-02-03 12:10:50" }, { "name": "phpspec/prophecy", "version": "v1.4.1", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", "reference": "3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpspec/prophecy/zipball/3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373", "reference": "3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "phpdocumentor/reflection-docblock": "~2.0", "sebastian/comparator": "~1.1" }, "require-dev": { "phpspec/phpspec": "~2.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.4.x-dev" } }, "autoload": { "psr-0": { "Prophecy\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Konstantin Kudryashov", "email": "ever.zet@gmail.com", "homepage": "http://everzet.com" }, { "name": "Marcello Duarte", "email": "marcello.duarte@gmail.com" } ], "description": "Highly opinionated mocking framework for PHP 5.3+", "homepage": "https://github.com/phpspec/prophecy", "keywords": [ "Double", "Dummy", "fake", "mock", "spy", "stub" ], "time": "2015-04-27 22:15:08" }, { "name": "phpunit/php-code-coverage", "version": "2.1.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", "reference": "631e365cf26bb2c078683e8d9bcf8bc631ac4d44" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/631e365cf26bb2c078683e8d9bcf8bc631ac4d44", "reference": "631e365cf26bb2c078683e8d9bcf8bc631ac4d44", "shasum": "" }, "require": { "php": ">=5.3.3", "phpunit/php-file-iterator": "~1.3", "phpunit/php-text-template": "~1.2", "phpunit/php-token-stream": "~1.3", "sebastian/environment": "~1.0", "sebastian/version": "~1.0" }, "require-dev": { "ext-xdebug": ">=2.1.4", "phpunit/phpunit": "~4" }, "suggest": { "ext-dom": "*", "ext-xdebug": ">=2.2.1", "ext-xmlwriter": "*" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.1.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", "homepage": "https://github.com/sebastianbergmann/php-code-coverage", "keywords": [ "coverage", "testing", "xunit" ], "time": "2015-06-19 07:11:55" }, { "name": "phpunit/php-file-iterator", "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", "reference": "a923bb15680d0089e2316f7a4af8f437046e96bb" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a923bb15680d0089e2316f7a4af8f437046e96bb", "reference": "a923bb15680d0089e2316f7a4af8f437046e96bb", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.4.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "FilterIterator implementation that filters files based on a list of suffixes.", "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", "keywords": [ "filesystem", "iterator" ], "time": "2015-04-02 05:19:05" }, { "name": "phpunit/php-text-template", "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Simple template engine.", "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ "template" ], "time": "2015-06-21 13:50:34" }, { "name": "phpunit/php-timer", "version": "1.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/83fe1bdc5d47658b727595c14da140da92b3d66d", "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Utility class for timing", "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ "timer" ], "time": "2015-06-13 07:35:30" }, { "name": "phpunit/php-token-stream", "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/7a9b0969488c3c54fd62b4d504b3ec758fd005d9", "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9", "shasum": "" }, "require": { "ext-tokenizer": "*", "php": ">=5.3.3" }, "require-dev": { "phpunit/phpunit": "~4.2" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.4-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Wrapper around PHP's tokenizer extension.", "homepage": "https://github.com/sebastianbergmann/php-token-stream/", "keywords": [ "tokenizer" ], "time": "2015-06-19 03:43:16" }, { "name": "phpunit/phpunit", "version": "4.7.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", "reference": "f6701ef3faea759acd1910a7751d8d102a7fd5bc" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f6701ef3faea759acd1910a7751d8d102a7fd5bc", "reference": "f6701ef3faea759acd1910a7751d8d102a7fd5bc", "shasum": "" }, "require": { "ext-dom": "*", "ext-json": "*", "ext-pcre": "*", "ext-reflection": "*", "ext-spl": "*", "php": ">=5.3.3", "phpspec/prophecy": "~1.3,>=1.3.1", "phpunit/php-code-coverage": "~2.1", "phpunit/php-file-iterator": "~1.4", "phpunit/php-text-template": "~1.2", "phpunit/php-timer": ">=1.0.6", "phpunit/phpunit-mock-objects": "~2.3", "sebastian/comparator": "~1.1", "sebastian/diff": "~1.2", "sebastian/environment": "~1.2", "sebastian/exporter": "~1.2", "sebastian/global-state": "~1.0", "sebastian/version": "~1.0", "symfony/yaml": "~2.1|~3.0" }, "suggest": { "phpunit/php-invoker": "~1.1" }, "bin": [ "phpunit" ], "type": "library", "extra": { "branch-alias": { "dev-master": "4.7.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "The PHP Unit Testing framework.", "homepage": "https://phpunit.de/", "keywords": [ "phpunit", "testing", "xunit" ], "time": "2015-06-21 07:23:36" }, { "name": "phpunit/phpunit-mock-objects", "version": "2.3.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", "reference": "92408bb1968a81b3217a6fdf6c1a198da83caa35" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/92408bb1968a81b3217a6fdf6c1a198da83caa35", "reference": "92408bb1968a81b3217a6fdf6c1a198da83caa35", "shasum": "" }, "require": { "doctrine/instantiator": "~1.0,>=1.0.2", "php": ">=5.3.3", "phpunit/php-text-template": "~1.2" }, "require-dev": { "phpunit/phpunit": "~4.4" }, "suggest": { "ext-soap": "*" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.3.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Mock Object library for PHPUnit", "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", "keywords": [ "mock", "xunit" ], "time": "2015-06-11 15:55:48" }, { "name": "psr/log", "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", "shasum": "" }, "type": "library", "autoload": { "psr-0": { "Psr\\Log\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "http://www.php-fig.org/" } ], "description": "Common interface for logging libraries", "keywords": [ "log", "psr", "psr-3" ], "time": "2012-12-21 11:40:51" }, { "name": "satooshi/php-coveralls", "version": "dev-master", "source": { "type": "git", "url": "https://github.com/satooshi/php-coveralls.git", "reference": "2fbf803803d179ab1082807308a67bbd5a760c70" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/satooshi/php-coveralls/zipball/2fbf803803d179ab1082807308a67bbd5a760c70", "reference": "2fbf803803d179ab1082807308a67bbd5a760c70", "shasum": "" }, "require": { "ext-json": "*", "ext-simplexml": "*", "guzzle/guzzle": ">=2.7", "php": ">=5.3", "psr/log": "1.0.0", "symfony/config": ">=2.0", "symfony/console": ">=2.0", "symfony/stopwatch": ">=2.2", "symfony/yaml": ">=2.0" }, "require-dev": { "apigen/apigen": "2.8.*@stable", "pdepend/pdepend": "dev-master as 2.0.0", "phpmd/phpmd": "dev-master", "phpunit/php-invoker": ">=1.1.0,<1.2.0", "phpunit/phpunit": "3.7.*@stable", "sebastian/finder-facade": "dev-master", "sebastian/phpcpd": "1.4.*@stable", "squizlabs/php_codesniffer": "1.4.*@stable", "theseer/fdomdocument": "dev-master" }, "suggest": { "symfony/http-kernel": "Allows Symfony integration" }, "bin": [ "composer/bin/coveralls" ], "type": "library", "extra": { "branch-alias": { "dev-master": "0.7-dev" } }, "autoload": { "psr-0": { "Satooshi\\Component": "src/", "Satooshi\\Bundle": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Kitamura Satoshi", "email": "with.no.parachute@gmail.com", "homepage": "https://www.facebook.com/satooshi.jp" } ], "description": "PHP client library for Coveralls API", "homepage": "https://github.com/satooshi/php-coveralls", "keywords": [ "ci", "coverage", "github", "test" ], "time": "2014-11-11 15:35:34" }, { "name": "sebastian/comparator", "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", "reference": "1dd8869519a225f7f2b9eb663e225298fade819e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dd8869519a225f7f2b9eb663e225298fade819e", "reference": "1dd8869519a225f7f2b9eb663e225298fade819e", "shasum": "" }, "require": { "php": ">=5.3.3", "sebastian/diff": "~1.2", "sebastian/exporter": "~1.2" }, "require-dev": { "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.1.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Provides the functionality to compare PHP values for equality", "homepage": "http://www.github.com/sebastianbergmann/comparator", "keywords": [ "comparator", "compare", "equality" ], "time": "2015-01-29 16:28:08" }, { "name": "sebastian/diff", "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3", "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "phpunit/phpunit": "~4.2" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.3-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Kore Nordmann", "email": "mail@kore-nordmann.de" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Diff implementation", "homepage": "http://www.github.com/sebastianbergmann/diff", "keywords": [ "diff" ], "time": "2015-02-22 15:13:53" }, { "name": "sebastian/environment", "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5a8c7d31914337b69923db26c4221b81ff5a196e", "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.3.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Provides functionality to handle HHVM/PHP environments", "homepage": "http://www.github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", "hhvm" ], "time": "2015-01-01 10:01:08" }, { "name": "sebastian/exporter", "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", "reference": "84839970d05254c73cde183a721c7af13aede943" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/84839970d05254c73cde183a721c7af13aede943", "reference": "84839970d05254c73cde183a721c7af13aede943", "shasum": "" }, "require": { "php": ">=5.3.3", "sebastian/recursion-context": "~1.0" }, "require-dev": { "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.2.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Adam Harvey", "email": "aharvey@php.net" } ], "description": "Provides the functionality to export PHP variables for visualization", "homepage": "http://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "time": "2015-01-27 07:23:06" }, { "name": "sebastian/global-state", "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c7428acdb62ece0a45e6306f1ae85e1c05b09c01", "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "phpunit/phpunit": "~4.2" }, "suggest": { "ext-uopz": "*" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Snapshotting of global state", "homepage": "http://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "time": "2014-10-06 09:23:50" }, { "name": "sebastian/recursion-context", "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", "reference": "3989662bbb30a29d20d9faa04a846af79b276252" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/3989662bbb30a29d20d9faa04a846af79b276252", "reference": "3989662bbb30a29d20d9faa04a846af79b276252", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Adam Harvey", "email": "aharvey@php.net" } ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", "time": "2015-01-24 09:48:32" }, { "name": "sebastian/version", "version": "1.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", "shasum": "" }, "type": "library", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", "time": "2015-06-21 13:59:46" }, { "name": "symfony/config", "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/symfony/Config.git", "reference": "58ded81f1f582a87c528ef3dae9a859f78b5f374" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/Config/zipball/58ded81f1f582a87c528ef3dae9a859f78b5f374", "reference": "58ded81f1f582a87c528ef3dae9a859f78b5f374", "shasum": "" }, "require": { "php": ">=5.3.9", "symfony/filesystem": "~2.3" }, "require-dev": { "symfony/phpunit-bridge": "~2.7" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.7-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\Config\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony Config Component", "homepage": "https://symfony.com", "time": "2015-06-11 14:06:56" }, { "name": "symfony/console", "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/symfony/Console.git", "reference": "564398bc1f33faf92fc2ec86859983d30eb81806" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/Console/zipball/564398bc1f33faf92fc2ec86859983d30eb81806", "reference": "564398bc1f33faf92fc2ec86859983d30eb81806", "shasum": "" }, "require": { "php": ">=5.3.9" }, "require-dev": { "psr/log": "~1.0", "symfony/event-dispatcher": "~2.1", "symfony/phpunit-bridge": "~2.7", "symfony/process": "~2.1" }, "suggest": { "psr/log": "For using the console logger", "symfony/event-dispatcher": "", "symfony/process": "" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.7-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\Console\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony Console Component", "homepage": "https://symfony.com", "time": "2015-06-10 15:30:22" }, { "name": "symfony/event-dispatcher", "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/symfony/EventDispatcher.git", "reference": "be3c5ff8d503c46768aeb78ce6333051aa6f26d9" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/be3c5ff8d503c46768aeb78ce6333051aa6f26d9", "reference": "be3c5ff8d503c46768aeb78ce6333051aa6f26d9", "shasum": "" }, "require": { "php": ">=5.3.9" }, "require-dev": { "psr/log": "~1.0", "symfony/config": "~2.0,>=2.0.5", "symfony/dependency-injection": "~2.6", "symfony/expression-language": "~2.6", "symfony/phpunit-bridge": "~2.7", "symfony/stopwatch": "~2.3" }, "suggest": { "symfony/dependency-injection": "", "symfony/http-kernel": "" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.7-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", "time": "2015-06-08 09:37:21" }, { "name": "symfony/filesystem", "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/symfony/Filesystem.git", "reference": "a0d43eb3e17d4f4c6990289805a488a0482a07f3" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/Filesystem/zipball/a0d43eb3e17d4f4c6990289805a488a0482a07f3", "reference": "a0d43eb3e17d4f4c6990289805a488a0482a07f3", "shasum": "" }, "require": { "php": ">=5.3.9" }, "require-dev": { "symfony/phpunit-bridge": "~2.7" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.7-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\Filesystem\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", "time": "2015-06-08 09:37:21" }, { "name": "symfony/stopwatch", "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/symfony/Stopwatch.git", "reference": "c653f1985f6c2b7dbffd04d48b9c0a96aaef814b" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/c653f1985f6c2b7dbffd04d48b9c0a96aaef814b", "reference": "c653f1985f6c2b7dbffd04d48b9c0a96aaef814b", "shasum": "" }, "require": { "php": ">=5.3.9" }, "require-dev": { "symfony/phpunit-bridge": "~2.7" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.7-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\Stopwatch\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", "time": "2015-06-04 20:11:48" }, { "name": "symfony/yaml", "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/symfony/Yaml.git", "reference": "9808e75c609a14f6db02f70fccf4ca4aab53c160" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/Yaml/zipball/9808e75c609a14f6db02f70fccf4ca4aab53c160", "reference": "9808e75c609a14f6db02f70fccf4ca4aab53c160", "shasum": "" }, "require": { "php": ">=5.3.9" }, "require-dev": { "symfony/phpunit-bridge": "~2.7" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.7-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\Yaml\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", "time": "2015-06-10 15:30:22" } ], "aliases": [], "minimum-stability": "stable", "stability-flags": { "satooshi/php-coveralls": 20 }, "prefer-stable": false, "prefer-lowest": false, "platform": { "php": ">= 5.3.3" }, "platform-dev": [] } EmailValidator-1.2.11/documentation/000077500000000000000000000000001262053274000173435ustar00rootroot00000000000000EmailValidator-1.2.11/documentation/Other.md000066400000000000000000000055771262053274000207640ustar00rootroot00000000000000Email length ------------ http://tools.ietf.org/html/rfc5321#section-4.1.2 Forward-path = Path Path = "<" [ A-d-l ":" ] Mailbox ">" http://tools.ietf.org/html/rfc5321#section-4.5.3.1.3 http://tools.ietf.org/html/rfc1035#section-2.3.4 DNS --- http://tools.ietf.org/html/rfc5321#section-2.3.5 Names that can be resolved to MX RRs or address (i.e., A or AAAA) RRs (as discussed in Section 5) are permitted, as are CNAME RRs whose targets can be resolved, in turn, to MX or address RRs. http://tools.ietf.org/html/rfc5321#section-5.1 The lookup first attempts to locate an MX record associated with the name. If a CNAME record is found, the resulting name is processed as if it were the initial name. ... If an empty list of MXs is returned, the address is treated as if it was associated with an implicit MX RR, with a preference of 0, pointing to that host. is_email() author's note: We will regard the existence of a CNAME to be sufficient evidence of the domain's existence. For performance reasons we will not repeat the DNS lookup for the CNAME's target, but we will raise a warning because we didn't immediately find an MX record. Check for TLD addresses ----------------------- TLD addresses are specifically allowed in RFC 5321 but they are unusual to say the least. We will allocate a separate status to these addresses on the basis that they are more likely to be typos than genuine addresses (unless we've already established that the domain does have an MX record) http://tools.ietf.org/html/rfc5321#section-2.3.5 In the case of a top-level domain used by itself in an email address, a single string is used without any dots. This makes the requirement, described in more detail below, that only fully-qualified domain names appear in SMTP transactions on the public Internet, particularly important where top-level domains are involved. TLD format ---------- The format of TLDs has changed a number of times. The standards used by IANA have been largely ignored by ICANN, leading to confusion over the standards being followed. These are not defined anywhere, except as a general component of a DNS host name (a label). However, this could potentially lead to 123.123.123.123 being a valid DNS name (rather than an IP address) and thereby creating an ambiguity. The most authoritative statement on TLD formats that the author can find is in a (rejected!) erratum to RFC 1123 submitted by John Klensin, the author of RFC 5321: http://www.rfc-editor.org/errata_search.php?rfc=1123&eid=1353 However, a valid host name can never have the dotted-decimal form #.#.#.#, since this change does not permit the highest-level component label to start with a digit even if it is not all-numeric. Comments -------- Comments at the start of the domain are deprecated in the text Comments at the start of a subdomain are obs-domain (http://tools.ietf.org/html/rfc5322#section-3.4.1) EmailValidator-1.2.11/documentation/RFC5321BNF.html000066400000000000000000000054731262053274000215150ustar00rootroot00000000000000 The BNF from RFC 5321 defining parts of a valid SMTP address
   Mailbox        = Local-part "@" ( Domain / address-literal )

   Local-part     = Dot-string / Quoted-string
                  ; MAY be case-sensitive


   Dot-string     = Atom *("."  Atom)

   Atom           = 1*atext

   Quoted-string  = DQUOTE *QcontentSMTP DQUOTE

   QcontentSMTP   = qtextSMTP / quoted-pairSMTP

   quoted-pairSMTP  = %d92 %d32-126
                    ; i.e., backslash followed by any ASCII
                    ; graphic (including itself) or SPace

   qtextSMTP      = %d32-33 / %d35-91 / %d93-126
                  ; i.e., within a quoted string, any
                  ; ASCII graphic or space is permitted
                  ; without blackslash-quoting except
                  ; double-quote and the backslash itself.

   Domain         = sub-domain *("." sub-domain)

   sub-domain     = Let-dig [Ldh-str]

   Let-dig        = ALPHA / DIGIT

   Ldh-str        = *( ALPHA / DIGIT / "-" ) Let-dig

   address-literal  = "[" ( IPv4-address-literal /
                    IPv6-address-literal /
                    General-address-literal ) "]"
                    ; See Section 4.1.3

   IPv4-address-literal  = Snum 3("."  Snum)

   IPv6-address-literal  = "IPv6:" IPv6-addr

   General-address-literal  = Standardized-tag ":" 1*dcontent

   Standardized-tag  = Ldh-str
                     ; Standardized-tag MUST be specified in a
                     ; Standards-Track RFC and registered with IANA

   dcontent       = %d33-90 / ; Printable US-ASCII
                  %d94-126 ; excl. "[", "\", "]"

   Snum           = 1*3DIGIT
                  ; representing a decimal integer
                  ; value in the range 0 through 255

   IPv6-addr      = IPv6-full / IPv6-comp / IPv6v4-full / IPv6v4-comp

   IPv6-hex       = 1*4HEXDIG

   IPv6-full      = IPv6-hex 7(":" IPv6-hex)

   IPv6-comp      = [IPv6-hex *5(":" IPv6-hex)] "::"
                  [IPv6-hex *5(":" IPv6-hex)]
                  ; The "::" represents at least 2 16-bit groups of
                  ; zeros.  No more than 6 groups in addition to the
                  ; "::" may be present.

   IPv6v4-full    = IPv6-hex 5(":" IPv6-hex) ":" IPv4-address-literal

   IPv6v4-comp    = [IPv6-hex *3(":" IPv6-hex)] "::"
                  [IPv6-hex *3(":" IPv6-hex) ":"]
                  IPv4-address-literal
                  ; The "::" represents at least 2 16-bit groups of
                  ; zeros.  No more than 4 groups in addition to the
                  ; "::" and IPv4-address-literal may be present.

EmailValidator-1.2.11/documentation/RFC5322BNF.html000066400000000000000000000115051262053274000215070ustar00rootroot00000000000000 The BNF from RFC 5322 defining parts of a valid internet message address
   addr-spec       =   local-part "@" domain

   local-part      =   dot-atom / quoted-string / obs-local-part

   dot-atom        =   [CFWS] dot-atom-text [CFWS]

   CFWS            =   (1*([FWS] comment) [FWS]) / FWS

   FWS             =   ([*WSP CRLF] 1*WSP) /  obs-FWS
                                          ; Folding white space

   WSP             =   SP / HTAB          ; white space

   obs-FWS         =   1*([CRLF] WSP)     ; As amended in erratum #1908

   ctext           =   %d33-39 /          ; Printable US-ASCII
                       %d42-91 /          ;  characters not including
                       %d93-126 /         ;  "(", ")", or "\"
                       obs-ctext

   obs-ctext       =   obs-NO-WS-CTL
   ccontent        =   ctext / quoted-pair / comment

   comment         =   "(" *([FWS] ccontent) [FWS] ")"

   dot-atom-text   =   1*atext *("." 1*atext)

   atext           =   ALPHA / DIGIT /    ; Printable US-ASCII
                       "!" / "#" /        ;  characters not including
                       "$" / "%" /        ;  specials.  Used for atoms.
                       "&" / "'" /
                       "*" / "+" /
                       "-" / "/" /
                       "=" / "?" /
                       "^" / "_" /
                       "`" / "{" /
                       "|" / "}" /
                       "~"

   specials        =   "(" / ")" /        ; Special characters that do
                       "<" / ">" /        ;  not appear in atext
                       "[" / "]" /
                       ":" / ";" /
                       "@" / "\" /
                       "," / "." /
                       DQUOTE

   quoted-string   =   [CFWS]
                       DQUOTE *([FWS] qcontent) [FWS] DQUOTE
                       [CFWS]

   qcontent        =   qtext / quoted-pair

   qtext           =   %d33 /             ; Printable US-ASCII
                       %d35-91 /          ;  characters not including
                       %d93-126 /         ;  "\" or the quote character
                       obs-qtext

   obs-qtext       =   obs-NO-WS-CTL

   obs-NO-WS-CTL   =   %d1-8 /            ; US-ASCII control
                       %d11 /             ;  characters that do not
                       %d12 /             ;  include the carriage
                       %d14-31 /          ;  return, line feed, and
                       %d127              ;  white space characters

   quoted-pair     =   ("\" (VCHAR / WSP)) / obs-qp

   VCHAR           =   %x21-7E            ; visible (printing) characters

   obs-qp          =   "\" (%d0 / obs-NO-WS-CTL / LF / CR)

   obs-local-part  =   word *("." word)

   word            =   atom / quoted-string

   atom            =   [CFWS] 1*atext [CFWS]

   domain          =   dot-atom / domain-literal / obs-domain

   domain-literal  =   [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS]

   dtext           =   %d33-90 /          ; Printable US-ASCII
                       %d94-126 /         ;  characters not including
                       obs-dtext          ;  "[", "]", or "\"

   obs-dtext       =   obs-NO-WS-CTL / quoted-pair

   obs-domain      =   atom *("." atom)

NB For SMTP mail, the domain-literal is restricted by RFC5321 as follows:

   Mailbox        = Local-part "@" ( Domain / address-literal )

   address-literal  = "[" ( IPv4-address-literal /
                    IPv6-address-literal /
                    General-address-literal ) "]"

   IPv4-address-literal  = Snum 3("."  Snum)

   IPv6-address-literal  = "IPv6:" IPv6-addr

   Snum           = 1*3DIGIT
                  ; representing a decimal integer
                  ; value in the range 0 through 255

   IPv6-addr      = IPv6-full / IPv6-comp / IPv6v4-full / IPv6v4-comp

   IPv6-hex       = 1*4HEXDIG

   IPv6-full      = IPv6-hex 7(":" IPv6-hex)

   IPv6-comp      = [IPv6-hex *5(":" IPv6-hex)] "::"
                  [IPv6-hex *5(":" IPv6-hex)]
                  ; The "::" represents at least 2 16-bit groups of
                  ; zeros.  No more than 6 groups in addition to the
                  ; "::" may be present.

   IPv6v4-full    = IPv6-hex 5(":" IPv6-hex) ":" IPv4-address-literal

   IPv6v4-comp    = [IPv6-hex *3(":" IPv6-hex)] "::"
                  [IPv6-hex *3(":" IPv6-hex) ":"]
                  IPv4-address-literal
                  ; The "::" represents at least 2 16-bit groups of
                  ; zeros.  No more than 4 groups in addition to the
                  ; "::" and IPv4-address-literal may be present.

EmailValidator-1.2.11/phpunit.xml.dist000066400000000000000000000012341262053274000176450ustar00rootroot00000000000000 ./tests/egulias/Tests/ ./vendor/ ./vendor EmailValidator-1.2.11/src/000077500000000000000000000000001262053274000152615ustar00rootroot00000000000000EmailValidator-1.2.11/src/Egulias/000077500000000000000000000000001262053274000166525ustar00rootroot00000000000000EmailValidator-1.2.11/src/Egulias/EmailValidator/000077500000000000000000000000001262053274000215475ustar00rootroot00000000000000EmailValidator-1.2.11/src/Egulias/EmailValidator/EmailLexer.php000066400000000000000000000117561262053274000243210ustar00rootroot00000000000000 self::S_OPENPARENTHESIS, ')' => self::S_CLOSEPARENTHESIS, '<' => self::S_LOWERTHAN, '>' => self::S_GREATERTHAN, '[' => self::S_OPENBRACKET, ']' => self::S_CLOSEBRACKET, ':' => self::S_COLON, ';' => self::S_SEMICOLON, '@' => self::S_AT, '\\' => self::S_BACKSLASH, '/' => self::S_SLASH, ',' => self::S_COMMA, '.' => self::S_DOT, '"' => self::S_DQUOTE, '-' => self::S_HYPHEN, '::' => self::S_DOUBLECOLON, ' ' => self::S_SP, "\t" => self::S_HTAB, "\r" => self::S_CR, "\n" => self::S_LF, "\r\n" => self::CRLF, 'IPv6' => self::S_IPV6TAG, '{' => self::S_OPENQBRACKET, '}' => self::S_CLOSEQBRACKET, '' => self::S_EMPTY, '\0' => self::C_NUL, ); protected $hasInvalidTokens = false; protected $previous; public function reset() { $this->hasInvalidTokens = false; parent::reset(); } public function hasInvalidTokens() { return $this->hasInvalidTokens; } /** * @param $type * @throws \UnexpectedValueException * @return boolean */ public function find($type) { $search = clone $this; $search->skipUntil($type); if (!$search->lookahead) { throw new \UnexpectedValueException($type . ' not found'); } return true; } /** * getPrevious * * @return array token */ public function getPrevious() { return $this->previous; } /** * moveNext * * @return boolean */ public function moveNext() { $this->previous = $this->token; return parent::moveNext(); } /** * Lexical catchable patterns. * * @return string[] */ protected function getCatchablePatterns() { return array( '[a-zA-Z_]+[46]?', //ASCII and domain literal '[^\x00-\x7F]', //UTF-8 '[0-9]+', '\r\n', '::', '\s+?', '.', ); } /** * Lexical non-catchable patterns. * * @return string[] */ protected function getNonCatchablePatterns() { return array('[\xA0-\xff]+'); } /** * Retrieve token type. Also processes the token value if necessary. * * @param string $value * @throws \InvalidArgumentException * @return integer */ protected function getType(&$value) { if ($this->isNullType($value)) { return self::C_NUL; } if ($this->isValid($value)) { return $this->charValue[$value]; } if ($this->isUTF8Invalid($value)) { $this->hasInvalidTokens = true; return self::INVALID; } return self::GENERIC; } protected function isValid($value) { if (isset($this->charValue[$value])) { return true; } return false; } /** * @param $value * @return bool */ protected function isNullType($value) { if ($value === "\0") { return true; } return false; } /** * @param $value * @return bool */ protected function isUTF8Invalid($value) { if (preg_match('/\p{Cc}+/u', $value)) { return true; } return false; } protected function getModifiers() { return 'iu'; } } EmailValidator-1.2.11/src/Egulias/EmailValidator/EmailParser.php000066400000000000000000000047011262053274000244660ustar00rootroot00000000000000 */ class EmailParser { const EMAIL_MAX_LENGTH = 254; protected $warnings = array(); protected $domainPart = ''; protected $localPart = ''; protected $lexer; protected $localPartParser; protected $domainPartParser; public function __construct(EmailLexer $lexer) { $this->lexer = $lexer; $this->localPartParser = new LocalPart($this->lexer); $this->domainPartParser = new DomainPart($this->lexer); } /** * @param $str * @return array */ public function parse($str) { $this->lexer->setInput($str); if (!$this->hasAtToken()) { throw new \InvalidArgumentException('ERR_NOLOCALPART'); } $this->localPartParser->parse($str); $this->domainPartParser->parse($str); $this->setParts($str); if ($this->lexer->hasInvalidTokens()) { throw new \InvalidArgumentException('ERR_INVALID_ATEXT'); } return array('local' => $this->localPart, 'domain' => $this->domainPart); } public function getWarnings() { $localPartWarnings = $this->localPartParser->getWarnings(); $domainPartWarnings = $this->domainPartParser->getWarnings(); $this->warnings = array_merge($localPartWarnings, $domainPartWarnings); $this->addLongEmailWarning($this->localPart, $this->domainPart); return $this->warnings; } public function getParsedDomainPart() { return $this->domainPart; } protected function setParts($email) { $parts = explode('@', $email); $this->domainPart = $this->domainPartParser->getDomainPart(); $this->localPart = $parts[0]; } protected function hasAtToken() { $this->lexer->moveNext(); $this->lexer->moveNext(); if ($this->lexer->token['type'] === EmailLexer::S_AT) { return false; } return true; } /** * @param string $localPart * @param string $parsedDomainPart */ protected function addLongEmailWarning($localPart, $parsedDomainPart) { if (strlen($localPart . '@' . $parsedDomainPart) > self::EMAIL_MAX_LENGTH) { $this->warnings[] = EmailValidator::RFC5322_TOOLONG; } } } EmailValidator-1.2.11/src/Egulias/EmailValidator/EmailValidator.php000066400000000000000000000107661262053274000251670ustar00rootroot00000000000000 */ class EmailValidator { const ERR_CONSECUTIVEATS = 128; const ERR_EXPECTING_DTEXT = 129; const ERR_NOLOCALPART = 130; const ERR_NODOMAIN = 131; const ERR_CONSECUTIVEDOTS = 132; const ERR_ATEXT_AFTER_CFWS = 133; const ERR_ATEXT_AFTER_QS = 134; const ERR_ATEXT_AFTER_DOMLIT = 135; const ERR_EXPECTING_QPAIR = 136; const ERR_EXPECTING_ATEXT = 137; const ERR_EXPECTING_QTEXT = 138; const ERR_EXPECTING_CTEXT = 139; const ERR_BACKSLASHEND = 140; const ERR_DOT_START = 141; const ERR_DOT_END = 142; const ERR_DOMAINHYPHENSTART = 143; const ERR_DOMAINHYPHENEND = 144; const ERR_UNCLOSEDQUOTEDSTR = 145; const ERR_UNCLOSEDCOMMENT = 146; const ERR_UNCLOSEDDOMLIT = 147; const ERR_FWS_CRLF_X2 = 148; const ERR_FWS_CRLF_END = 149; const ERR_CR_NO_LF = 150; const ERR_DEPREC_REACHED = 151; const ERR_UNOPENEDCOMMENT = 152; const RFC5321_TLD = 9; const RFC5321_TLDNUMERIC = 10; const RFC5321_QUOTEDSTRING = 11; const RFC5321_ADDRESSLITERAL = 12; const RFC5321_IPV6DEPRECATED = 13; const CFWS_COMMENT = 17; const CFWS_FWS = 18; const DEPREC_LOCALPART = 33; const DEPREC_FWS = 34; const DEPREC_QTEXT = 35; const DEPREC_QP = 36; const DEPREC_COMMENT = 37; const DEPREC_CTEXT = 38; const DEPREC_CFWS_NEAR_AT = 49; const RFC5322_LOCAL_TOOLONG = 64; const RFC5322_LABEL_TOOLONG = 63; const RFC5322_DOMAIN = 65; const RFC5322_TOOLONG = 66; const RFC5322_DOMAIN_TOOLONG = 255; const RFC5322_DOMAINLITERAL = 70; const RFC5322_DOMLIT_OBSDTEXT = 71; const RFC5322_IPV6_GRPCOUNT = 72; const RFC5322_IPV6_2X2XCOLON = 73; const RFC5322_IPV6_BADCHAR = 74; const RFC5322_IPV6_MAXGRPS = 75; const RFC5322_IPV6_COLONSTRT = 76; const RFC5322_IPV6_COLONEND = 77; const DNSWARN_NO_MX_RECORD = 5; const DNSWARN_NO_RECORD = 6; protected $parser; protected $warnings = array(); protected $error; protected $threshold = 255; public function __construct() { $this->parser = new EmailParser(new EmailLexer()); } public function isValid($email, $checkDNS = false, $strict = false) { try { $this->parser->parse((string)$email); $this->warnings = $this->parser->getWarnings(); } catch (\Exception $e) { $rClass = new \ReflectionClass($this); $this->error = $rClass->getConstant($e->getMessage()); return false; } $dns = true; if ($checkDNS) { $dns = $this->checkDNS(); } if ($this->hasWarnings() && ((int) max($this->warnings) > $this->threshold)) { $this->error = self::ERR_DEPREC_REACHED; return false; } return !$strict || (!$this->hasWarnings() && $dns); } /** * @return boolean */ public function hasWarnings() { return !empty($this->warnings); } /** * @return array */ public function getWarnings() { return $this->warnings; } /** * @return string */ public function getError() { return $this->error; } /** * @param int $threshold * * @return EmailValidator */ public function setThreshold($threshold) { $this->threshold = (int) $threshold; return $this; } /** * @return int */ public function getThreshold() { return $this->threshold; } protected function checkDNS() { $checked = true; $result = checkdnsrr(trim($this->parser->getParsedDomainPart()), 'MX'); if (!$result) { $this->warnings[] = self::DNSWARN_NO_RECORD; $checked = false; $this->addTLDWarnings(); } return $checked; } protected function addTLDWarnings() { if (!in_array(self::DNSWARN_NO_RECORD, $this->warnings) && !in_array(self::DNSWARN_NO_MX_RECORD, $this->warnings) && in_array(self::RFC5322_DOMAINLITERAL, $this->warnings) ) { $this->warnings[] = self::RFC5321_TLD; } } } EmailValidator-1.2.11/src/Egulias/EmailValidator/Parser/000077500000000000000000000000001262053274000230035ustar00rootroot00000000000000EmailValidator-1.2.11/src/Egulias/EmailValidator/Parser/DomainPart.php000066400000000000000000000260771262053274000255660ustar00rootroot00000000000000lexer->moveNext(); if ($this->lexer->token['type'] === EmailLexer::S_DOT) { throw new \InvalidArgumentException('ERR_DOT_START'); } if ($this->lexer->token['type'] === EmailLexer::S_EMPTY) { throw new \InvalidArgumentException('ERR_NODOMAIN'); } if ($this->lexer->token['type'] === EmailLexer::S_HYPHEN) { throw new \InvalidArgumentException('ERR_DOMAINHYPHENEND'); } if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS) { $this->warnings[] = EmailValidator::DEPREC_COMMENT; $this->parseDomainComments(); } $domain = $this->doParseDomainPart(); $prev = $this->lexer->getPrevious(); $length = strlen($domain); if ($prev['type'] === EmailLexer::S_DOT) { throw new \InvalidArgumentException('ERR_DOT_END'); } if ($prev['type'] === EmailLexer::S_HYPHEN) { throw new \InvalidArgumentException('ERR_DOMAINHYPHENEND'); } if ($length > self::DOMAIN_MAX_LENGTH) { $this->warnings[] = EmailValidator::RFC5322_DOMAIN_TOOLONG; } if ($prev['type'] === EmailLexer::S_CR) { throw new \InvalidArgumentException('ERR_FWS_CRLF_END'); } $this->domainPart = $domain; } public function getDomainPart() { return $this->domainPart; } public function checkIPV6Tag($addressLiteral, $maxGroups = 8) { $prev = $this->lexer->getPrevious(); if ($prev['type'] === EmailLexer::S_COLON) { $this->warnings[] = EmailValidator::RFC5322_IPV6_COLONEND; } $IPv6 = substr($addressLiteral, 5); //Daniel Marschall's new IPv6 testing strategy $matchesIP = explode(':', $IPv6); $groupCount = count($matchesIP); $colons = strpos($IPv6, '::'); if (count(preg_grep('/^[0-9A-Fa-f]{0,4}$/', $matchesIP, PREG_GREP_INVERT)) !== 0) { $this->warnings[] = EmailValidator::RFC5322_IPV6_BADCHAR; } if ($colons === false) { // We need exactly the right number of groups if ($groupCount !== $maxGroups) { $this->warnings[] = EmailValidator::RFC5322_IPV6_GRPCOUNT; } return; } if ($colons !== strrpos($IPv6, '::')) { $this->warnings[] = EmailValidator::RFC5322_IPV6_2X2XCOLON; return; } if ($colons === 0 || $colons === (strlen($IPv6) - 2)) { // RFC 4291 allows :: at the start or end of an address //with 7 other groups in addition ++$maxGroups; } if ($groupCount > $maxGroups) { $this->warnings[] = EmailValidator::RFC5322_IPV6_MAXGRPS; } elseif ($groupCount === $maxGroups) { $this->warnings[] = EmailValidator::RFC5321_IPV6DEPRECATED; } } protected function doParseDomainPart() { $domain = ''; $openedParenthesis = 0; $openBrackets = false; do { $prev = $this->lexer->getPrevious(); if ($this->lexer->token['type'] === EmailLexer::S_SLASH) { throw new \InvalidArgumentException('ERR_DOMAIN_CHAR_NOT_ALLOWED'); } if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS) { $this->parseComments(); $openedParenthesis += $this->getOpenedParenthesis(); $this->lexer->moveNext(); $tmpPrev = $this->lexer->getPrevious(); if ($tmpPrev['type'] === EmailLexer::S_CLOSEPARENTHESIS) { $openedParenthesis--; } } if ($this->lexer->token['type'] === EmailLexer::S_CLOSEPARENTHESIS) { if ($openedParenthesis === 0) { throw new \InvalidArgumentException('ERR_UNOPENEDCOMMENT'); } else { $openedParenthesis--; } } $this->checkConsecutiveDots(); $this->checkDomainPartExceptions($prev); if ($openBrackets = $this->hasBrackets($openBrackets)) { $this->parseDomainLiteral(); } $this->checkLabelLength($prev); if ($this->isFWS()) { $this->parseFWS(); } $domain .= $this->lexer->token['value']; $this->lexer->moveNext(); } while ($this->lexer->token); return $domain; } protected function parseDomainLiteral() { if ($this->lexer->isNextToken(EmailLexer::S_COLON)) { $this->warnings[] = EmailValidator::RFC5322_IPV6_COLONSTRT; } if ($this->lexer->isNextToken(EmailLexer::S_IPV6TAG)) { $lexer = clone $this->lexer; $lexer->moveNext(); if ($lexer->isNextToken(EmailLexer::S_DOUBLECOLON)) { $this->warnings[] = EmailValidator::RFC5322_IPV6_COLONSTRT; } } return $this->doParseDomainLiteral(); } protected function doParseDomainLiteral() { $IPv6TAG = false; $addressLiteral = ''; do { if ($this->lexer->token['type'] === EmailLexer::C_NUL) { throw new \InvalidArgumentException('ERR_EXPECTING_DTEXT'); } if ($this->lexer->token['type'] === EmailLexer::INVALID || $this->lexer->token['type'] === EmailLexer::C_DEL || $this->lexer->token['type'] === EmailLexer::S_LF ) { $this->warnings[] = EmailValidator::RFC5322_DOMLIT_OBSDTEXT; } if ($this->lexer->isNextTokenAny(array(EmailLexer::S_OPENQBRACKET, EmailLexer::S_OPENBRACKET))) { throw new \InvalidArgumentException('ERR_EXPECTING_DTEXT'); } if ($this->lexer->isNextTokenAny( array(EmailLexer::S_HTAB, EmailLexer::S_SP, $this->lexer->token['type'] === EmailLexer::CRLF) )) { $this->warnings[] = EmailValidator::CFWS_FWS; $this->parseFWS(); } if ($this->lexer->isNextToken(EmailLexer::S_CR)) { throw new \InvalidArgumentException('ERR_CR_NO_LF'); } if ($this->lexer->token['type'] === EmailLexer::S_BACKSLASH) { $this->warnings[] = EmailValidator::RFC5322_DOMLIT_OBSDTEXT; $addressLiteral .= $this->lexer->token['value']; $this->lexer->moveNext(); $this->validateQuotedPair(); } if ($this->lexer->token['type'] === EmailLexer::S_IPV6TAG) { $IPv6TAG = true; } if ($this->lexer->token['type'] === EmailLexer::S_CLOSEQBRACKET) { break; } $addressLiteral .= $this->lexer->token['value']; } while ($this->lexer->moveNext()); $addressLiteral = str_replace('[', '', $addressLiteral); $addressLiteral = $this->checkIPV4Tag($addressLiteral); if (false === $addressLiteral) { return $addressLiteral; } if (!$IPv6TAG) { $this->warnings[] = EmailValidator::RFC5322_DOMAINLITERAL; return $addressLiteral; } $this->warnings[] = EmailValidator::RFC5321_ADDRESSLITERAL; $this->checkIPV6Tag($addressLiteral); return $addressLiteral; } protected function checkIPV4Tag($addressLiteral) { $matchesIP = array(); // Extract IPv4 part from the end of the address-literal (if there is one) if (preg_match( '/\\b(?:(?: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]?)$/', $addressLiteral, $matchesIP ) > 0 ) { $index = strrpos($addressLiteral, $matchesIP[0]); if ($index === 0) { $this->warnings[] = EmailValidator::RFC5321_ADDRESSLITERAL; return false; } // Convert IPv4 part to IPv6 format for further testing $addressLiteral = substr($addressLiteral, 0, $index) . '0:0'; } return $addressLiteral; } protected function checkDomainPartExceptions($prev) { $invalidDomainTokens = array( EmailLexer::S_DQUOTE => true, EmailLexer::S_SEMICOLON => true, EmailLexer::S_GREATERTHAN => true, EmailLexer::S_LOWERTHAN => true, ); if (isset($invalidDomainTokens[$this->lexer->token['type']])) { throw new \InvalidArgumentException('ERR_EXPECTING_ATEXT'); } if ($this->lexer->token['type'] === EmailLexer::S_COMMA) { throw new \InvalidArgumentException('ERR_COMMA_IN_DOMAIN'); } if ($this->lexer->token['type'] === EmailLexer::S_AT) { throw new \InvalidArgumentException('ERR_CONSECUTIVEATS'); } if ($this->lexer->token['type'] === EmailLexer::S_OPENQBRACKET && $prev['type'] !== EmailLexer::S_AT) { throw new \InvalidArgumentException('ERR_EXPECTING_ATEXT'); } if ($this->lexer->token['type'] === EmailLexer::S_HYPHEN && $this->lexer->isNextToken(EmailLexer::S_DOT)) { throw new \InvalidArgumentException('ERR_DOMAINHYPHENEND'); } if ($this->lexer->token['type'] === EmailLexer::S_BACKSLASH && $this->lexer->isNextToken(EmailLexer::GENERIC)) { throw new \InvalidArgumentException('ERR_EXPECTING_ATEXT'); } } protected function hasBrackets($openBrackets) { if ($this->lexer->token['type'] === EmailLexer::S_CLOSEBRACKET && !$openBrackets) { throw new \InvalidArgumentException('ERR_EXPECTING_OPENBRACKET'); } if ($this->lexer->token['type'] !== EmailLexer::S_OPENBRACKET) { return false; } try { $this->lexer->find(EmailLexer::S_CLOSEBRACKET); } catch (\RuntimeException $e) { throw new \InvalidArgumentException('ERR_EXPECTING_DOMLIT_CLOSE'); } return true; } protected function checkLabelLength($prev) { if ($this->lexer->token['type'] === EmailLexer::S_DOT && $prev['type'] === EmailLexer::GENERIC && strlen($prev['value']) > 63 ) { $this->warnings[] = EmailValidator::RFC5322_LABEL_TOOLONG; } } protected function parseDomainComments() { $this->isUnclosedComment(); while (!$this->lexer->isNextToken(EmailLexer::S_CLOSEPARENTHESIS)) { $this->warnEscaping(); $this->lexer->moveNext(); } $this->lexer->moveNext(); if ($this->lexer->isNextToken(EmailLexer::S_DOT)) { throw new \InvalidArgumentException('ERR_EXPECTING_ATEXT'); } } } EmailValidator-1.2.11/src/Egulias/EmailValidator/Parser/LocalPart.php000066400000000000000000000077551262053274000254130ustar00rootroot00000000000000lexer->token['type'] !== EmailLexer::S_AT && $this->lexer->token) { if ($this->lexer->token['type'] === EmailLexer::S_DOT && !$this->lexer->getPrevious()) { throw new \InvalidArgumentException('ERR_DOT_START'); } $closingQuote = $this->checkDQUOTE($closingQuote); if ($closingQuote && $parseDQuote) { $parseDQuote = $this->parseDoubleQuote(); } if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS) { $this->parseComments(); $openedParenthesis += $this->getOpenedParenthesis(); } if ($this->lexer->token['type'] === EmailLexer::S_CLOSEPARENTHESIS) { if ($openedParenthesis === 0) { throw new \InvalidArgumentException('ERR_UNOPENEDCOMMENT'); } else { $openedParenthesis--; } } $this->checkConsecutiveDots(); if ($this->lexer->token['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::S_AT) ) { throw new \InvalidArgumentException('ERR_DOT_END'); } $this->warnEscaping(); $this->isInvalidToken($this->lexer->token, $closingQuote); if ($this->isFWS()) { $this->parseFWS(); } $this->lexer->moveNext(); } $prev = $this->lexer->getPrevious(); if (strlen($prev['value']) > EmailValidator::RFC5322_LOCAL_TOOLONG) { $this->warnings[] = EmailValidator::RFC5322_LOCAL_TOOLONG; } } protected function parseDoubleQuote() { $parseAgain = true; $special = array( EmailLexer::S_CR => true, EmailLexer::S_HTAB => true, EmailLexer::S_LF => true ); $invalid = array( EmailLexer::C_NUL => true, EmailLexer::S_HTAB => true, EmailLexer::S_CR => true, EmailLexer::S_LF => true ); $setSpecialsWarning = true; $this->lexer->moveNext(); while ($this->lexer->token['type'] !== EmailLexer::S_DQUOTE && $this->lexer->token) { $parseAgain = false; if (isset($special[$this->lexer->token['type']]) && $setSpecialsWarning) { $this->warnings[] = EmailValidator::CFWS_FWS; $setSpecialsWarning = false; } $this->lexer->moveNext(); if (!$this->escaped() && isset($invalid[$this->lexer->token['type']])) { throw new \InvalidArgumentException('ERR_EXPECTED_ATEXT'); } } $prev = $this->lexer->getPrevious(); if ($prev['type'] === EmailLexer::S_BACKSLASH) { if (!$this->checkDQUOTE(false)) { throw new \InvalidArgumentException('ERR_UNCLOSED_DQUOTE'); } } if (!$this->lexer->isNextToken(EmailLexer::S_AT) && $prev['type'] !== EmailLexer::S_BACKSLASH) { throw new \InvalidArgumentException('ERR_EXPECED_AT'); } return $parseAgain; } protected function isInvalidToken($token, $closingQuote) { $forbidden = array( EmailLexer::S_COMMA, EmailLexer::S_CLOSEBRACKET, EmailLexer::S_OPENBRACKET, EmailLexer::S_GREATERTHAN, EmailLexer::S_LOWERTHAN, EmailLexer::S_COLON, EmailLexer::S_SEMICOLON, EmailLexer::INVALID ); if (in_array($token['type'], $forbidden) && !$closingQuote) { throw new \InvalidArgumentException('ERR_EXPECTING_ATEXT'); } } } EmailValidator-1.2.11/src/Egulias/EmailValidator/Parser/Parser.php000066400000000000000000000133301262053274000247500ustar00rootroot00000000000000lexer = $lexer; } public function getWarnings() { return $this->warnings; } abstract public function parse($str); /** @return int */ public function getOpenedParenthesis() { return $this->openedParenthesis; } /** * validateQuotedPair */ protected function validateQuotedPair() { if (!($this->lexer->token['type'] === EmailLexer::INVALID || $this->lexer->token['type'] === EmailLexer::C_DEL)) { throw new \InvalidArgumentException('ERR_EXPECTING_QPAIR'); } $this->warnings[] = EmailValidator::DEPREC_QP; } protected function parseComments() { $this->openedParenthesis = 1; $this->isUnclosedComment(); $this->warnings[] = EmailValidator::CFWS_COMMENT; while (!$this->lexer->isNextToken(EmailLexer::S_CLOSEPARENTHESIS)) { if ($this->lexer->isNextToken(EmailLexer::S_OPENPARENTHESIS)) { $this->openedParenthesis++; } $this->warnEscaping(); $this->lexer->moveNext(); } $this->lexer->moveNext(); if ($this->lexer->isNextTokenAny(array(EmailLexer::GENERIC, EmailLexer::S_EMPTY))) { throw new \InvalidArgumentException('ERR_EXPECTING_ATEXT'); } if ($this->lexer->isNextToken(EmailLexer::S_AT)) { $this->warnings[] = EmailValidator::DEPREC_CFWS_NEAR_AT; } } protected function isUnclosedComment() { try { $this->lexer->find(EmailLexer::S_CLOSEPARENTHESIS); return true; } catch (\RuntimeException $e) { throw new \InvalidArgumentException('ERR_UNCLOSEDCOMMENT'); } } protected function parseFWS() { $previous = $this->lexer->getPrevious(); $this->checkCRLFInFWS(); if ($this->lexer->token['type'] === EmailLexer::S_CR) { throw new \InvalidArgumentException('ERR_CR_NO_LF'); } if ($this->lexer->isNextToken(EmailLexer::GENERIC) && $previous['type'] !== EmailLexer::S_AT) { throw new \InvalidArgumentException('ERR_ATEXT_AFTER_CFWS'); } if ($this->lexer->token['type'] === EmailLexer::S_LF || $this->lexer->token['type'] === EmailLexer::C_NUL) { throw new \InvalidArgumentException('ERR_EXPECTING_CTEXT'); } if ($this->lexer->isNextToken(EmailLexer::S_AT) || $previous['type'] === EmailLexer::S_AT) { $this->warnings[] = EmailValidator::DEPREC_CFWS_NEAR_AT; } else { $this->warnings[] = EmailValidator::CFWS_FWS; } } protected function checkConsecutiveDots() { if ($this->lexer->token['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::S_DOT)) { throw new \InvalidArgumentException('ERR_CONSECUTIVEDOTS'); } } protected function isFWS() { if ($this->escaped()) { return false; } if ($this->lexer->token['type'] === EmailLexer::S_SP || $this->lexer->token['type'] === EmailLexer::S_HTAB || $this->lexer->token['type'] === EmailLexer::S_CR || $this->lexer->token['type'] === EmailLexer::S_LF || $this->lexer->token['type'] === EmailLexer::CRLF ) { return true; } return false; } protected function escaped() { $previous = $this->lexer->getPrevious(); if ($previous['type'] === EmailLexer::S_BACKSLASH && $this->lexer->token['type'] !== EmailLexer::GENERIC ) { return true; } return false; } protected function warnEscaping() { if ($this->lexer->token['type'] !== EmailLexer::S_BACKSLASH) { return false; } if ($this->lexer->isNextToken(EmailLexer::GENERIC)) { throw new \InvalidArgumentException('ERR_EXPECTING_ATEXT'); } if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB, EmailLexer::C_DEL))) { return false; } $this->warnings[] = EmailValidator::DEPREC_QP; return true; } protected function checkDQUOTE($hasClosingQuote) { if ($this->lexer->token['type'] !== EmailLexer::S_DQUOTE) { return $hasClosingQuote; } if ($hasClosingQuote) { return $hasClosingQuote; } $previous = $this->lexer->getPrevious(); if ($previous['type'] === EmailLexer::GENERIC && $this->lexer->isNextToken(EmailLexer::GENERIC)) { throw new \InvalidArgumentException('ERR_EXPECTING_ATEXT'); } $this->warnings[] = EmailValidator::RFC5321_QUOTEDSTRING; try { $this->lexer->find(EmailLexer::S_DQUOTE); $hasClosingQuote = true; } catch (\Exception $e) { throw new \InvalidArgumentException('ERR_UNCLOSEDQUOTEDSTR'); } return $hasClosingQuote; } protected function checkCRLFInFWS() { if ($this->lexer->token['type'] !== EmailLexer::CRLF) { return; } if ($this->lexer->isNextToken(EmailLexer::CRLF)) { throw new \InvalidArgumentException('ERR_FWS_CRLF_X2'); } if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB))) { throw new \InvalidArgumentException('ERR_FWS_CRLF_END'); } } } EmailValidator-1.2.11/tests/000077500000000000000000000000001262053274000156345ustar00rootroot00000000000000EmailValidator-1.2.11/tests/bootstrap.php000066400000000000000000000003421262053274000203610ustar00rootroot00000000000000isValid($testingMail); } $b = microtime(true); echo ($b - $a) . ' seconds with EmailValidator + instantiation' . PHP_EOL; $a = microtime(true); $validator = new EmailValidator(); for ($i = 0; $i < $iterations; $i++) { $isValid = $validator->isValid($testingMail); } $b = microtime(true); echo ($b - $a) . ' seconds with EmailValidator once instanced' . PHP_EOL; EmailValidator-1.2.11/tests/egulias/Performance/AgainstOldIsemail.php000066400000000000000000000016771262053274000256030ustar00rootroot00000000000000isValid($testingMail); } $b = microtime(true); echo ($b - $a) . ' seconds with EmailValidator + instantiation' . PHP_EOL; $a = microtime(true); $validator = new EmailValidator(); for ($i = 0; $i < $iterations; $i++) { $isValid = $validator->isValid($testingMail); } $b = microtime(true); echo ($b - $a) . ' seconds with EmailValidator once instanced' . PHP_EOL; EmailValidator-1.2.11/tests/egulias/Tests/000077500000000000000000000000001262053274000203675ustar00rootroot00000000000000EmailValidator-1.2.11/tests/egulias/Tests/EmailValidator/000077500000000000000000000000001262053274000232645ustar00rootroot00000000000000EmailValidator-1.2.11/tests/egulias/Tests/EmailValidator/EmailLexerTest.php000066400000000000000000000120571262053274000266710ustar00rootroot00000000000000assertInstanceOf('Doctrine\Common\Lexer\AbstractLexer', $lexer); } /** * @dataProvider getTokens * */ public function testLexerTokens($str, $token) { $lexer = new EmailLexer(); $lexer->setInput($str); $lexer->moveNext(); $lexer->moveNext(); $this->assertEquals($token, $lexer->token['type']); } public function testLexerParsesMultipleSpaces() { $lexer = new EmailLexer(); $lexer->setInput(' '); $lexer->moveNext(); $lexer->moveNext(); $this->assertEquals(EmailLexer::S_SP, $lexer->token['type']); $lexer->moveNext(); $this->assertEquals(EmailLexer::S_SP, $lexer->token['type']); } /** * @dataProvider invalidUTF8CharsProvider */ public function testLexerParsesInvalidUTF8($char) { $lexer = new EmailLexer(); $lexer->setInput($char); $lexer->moveNext(); $lexer->moveNext(); $this->assertEquals(EmailLexer::INVALID, $lexer->token['type']); } public function invalidUTF8CharsProvider() { $chars = array(); for ($i = 0; $i < 0x100; ++$i) { $c = $this->utf8Chr($i); if (preg_match('/(?=\p{Cc})(?=[^\t\n\n\r])/u', $c) && !preg_match('/\x{0000}/u', $c)) { $chars[] = array($c); } } return $chars; } protected function utf8Chr($code_point) { if ($code_point < 0 || 0x10FFFF < $code_point || (0xD800 <= $code_point && $code_point <= 0xDFFF)) { return ''; } if ($code_point < 0x80) { $hex[0] = $code_point; $ret = chr($hex[0]); } elseif ($code_point < 0x800) { $hex[0] = 0x1C0 | $code_point >> 6; $hex[1] = 0x80 | $code_point & 0x3F; $ret = chr($hex[0]).chr($hex[1]); } elseif ($code_point < 0x10000) { $hex[0] = 0xE0 | $code_point >> 12; $hex[1] = 0x80 | $code_point >> 6 & 0x3F; $hex[2] = 0x80 | $code_point & 0x3F; $ret = chr($hex[0]).chr($hex[1]).chr($hex[2]); } else { $hex[0] = 0xF0 | $code_point >> 18; $hex[1] = 0x80 | $code_point >> 12 & 0x3F; $hex[2] = 0x80 | $code_point >> 6 & 0x3F; $hex[3] = 0x80 | $code_point & 0x3F; $ret = chr($hex[0]).chr($hex[1]).chr($hex[2]).chr($hex[3]); } return $ret; } public function testLexerForTab() { $lexer = new EmailLexer(); $lexer->setInput("foo\tbar"); $lexer->moveNext(); $lexer->skipUntil(EmailLexer::S_HTAB); $lexer->moveNext(); $this->assertEquals(EmailLexer::S_HTAB, $lexer->token['type']); } public function testLexerForUTF8() { $lexer = new EmailLexer(); $lexer->setInput("áÇ@bar.com"); $lexer->moveNext(); $lexer->moveNext(); $this->assertEquals(EmailLexer::GENERIC, $lexer->token['type']); $lexer->moveNext(); $this->assertEquals(EmailLexer::GENERIC, $lexer->token['type']); } public function testLexerSearchToken() { $lexer = new EmailLexer(); $lexer->setInput("foo\tbar"); $lexer->moveNext(); $this->assertTrue($lexer->find(EmailLexer::S_HTAB)); } public function getTokens() { return array( array("foo", EmailLexer::GENERIC), array("\r", EmailLexer::S_CR), array("\t", EmailLexer::S_HTAB), array("\r\n", EmailLexer::CRLF), array("\n", EmailLexer::S_LF), array(" ", EmailLexer::S_SP), array("@", EmailLexer::S_AT), array("IPv6", EmailLexer::S_IPV6TAG), array("::", EmailLexer::S_DOUBLECOLON), array(":", EmailLexer::S_COLON), array(".", EmailLexer::S_DOT), array("\"", EmailLexer::S_DQUOTE), array("-", EmailLexer::S_HYPHEN), array("\\", EmailLexer::S_BACKSLASH), array("/", EmailLexer::S_SLASH), array("(", EmailLexer::S_OPENPARENTHESIS), array(")", EmailLexer::S_CLOSEPARENTHESIS), array('<', EmailLexer::S_LOWERTHAN), array('>', EmailLexer::S_GREATERTHAN), array('[', EmailLexer::S_OPENBRACKET), array(']', EmailLexer::S_CLOSEBRACKET), array(';', EmailLexer::S_SEMICOLON), array(',', EmailLexer::S_COMMA), array('<', EmailLexer::S_LOWERTHAN), array('>', EmailLexer::S_GREATERTHAN), array('{', EmailLexer::S_OPENQBRACKET), array('}', EmailLexer::S_CLOSEQBRACKET), array('', EmailLexer::S_EMPTY), array(chr(31), EmailLexer::INVALID), array(chr(226), EmailLexer::GENERIC), array(chr(0), EmailLexer::C_NUL) ); } } EmailValidator-1.2.11/tests/egulias/Tests/EmailValidator/EmailValidatorTest.php000066400000000000000000000342501262053274000275360ustar00rootroot00000000000000validator = new EmailValidator(); } protected function tearDown() { $this->validator = null; } /** * @dataProvider getValidEmails */ public function testValidEmails($email) { $this->assertTrue($this->validator->isValid($email)); } public function testInvalidUTF8Email() { $validator = new EmailValidator; $email = "\x80\x81\x82@\x83\x84\x85.\x86\x87\x88"; $this->assertFalse($validator->isValid($email)); } public function getValidEmails() { return array( array('â@iana.org'), array('fabien@symfony.com'), array('example@example.co.uk'), array('fabien_potencier@example.fr'), array('example@localhost'), array('fab\'ien@symfony.com'), array('fab\ ien@symfony.com'), array('example((example))@fakedfake.co.uk'), array('example@faked(fake).co.uk'), array('fabien+@symfony.com'), array('инфо@письмо.рф'), array('"username"@example.com'), array('"user,name"@example.com'), array('"user name"@example.com'), array('"user@name"@example.com'), array('"\a"@iana.org'), array('"test\ test"@iana.org'), array('""@iana.org'), array('"\""@iana.org'), array('müller@möller.de'), array('test@email*'), array('test@email!'), array('test@email&'), array('test@email^'), array('test@email%'), array('test@email$'), array('test@email.com.au'), ); } /** * @dataProvider getInvalidEmails */ public function testInvalidEmails($email) { $this->assertFalse($this->validator->isValid($email)); } public function getInvalidEmails() { return array( array('test@example.com test'), array('user name@example.com'), array('user name@example.com'), array('example.@example.co.uk'), array('example@example@example.co.uk'), array('(test_exampel@example.fr)'), array('example(example)example@example.co.uk'), array('.example@localhost'), array('ex\ample@localhost'), array('example@local\host'), array('example@localhost.'), array('user name@example.com'), array('username@ example . com'), array('example@(fake).com'), array('example@(fake.com'), array('username@example,com'), array('usern,ame@example.com'), array('user[na]me@example.com'), array('"""@iana.org'), array('"\"@iana.org'), array('"test"test@iana.org'), array('"test""test"@iana.org'), array('"test"."test"@iana.org'), array('"test".test@iana.org'), array('"test"' . chr(0) . '@iana.org'), array('"test\"@iana.org'), array(chr(226) . '@iana.org'), array('test@' . chr(226) . '.org'), array('\r\ntest@iana.org'), array('\r\n test@iana.org'), array('\r\n \r\ntest@iana.org'), array('\r\n \r\ntest@iana.org'), array('\r\n \r\n test@iana.org'), array('test@iana.org \r\n'), array('test@iana.org \r\n '), array('test@iana.org \r\n \r\n'), array('test@iana.org \r\n\r\n'), array('test@iana.org \r\n\r\n '), array('test@iana/icann.org'), array('test@foo;bar.com'), array('test;123@foobar.com'), array('test@example..com'), array('email.email@email."'), array('test@email>'), array('test@email<'), array('test@email{'), array('test@email.com]'), array('test@ema[il.com'), ); } /** * @dataProvider getInvalidEmailsWithErrors */ public function testInvalidEmailsWithErrorsCheck($errors, $email) { $this->assertFalse($this->validator->isValid($email)); $this->assertEquals($errors, $this->validator->getError()); } public function getInvalidEmailsWithErrors() { return array( array(EmailValidator::ERR_NOLOCALPART, '@example.co.uk'), array(EmailValidator::ERR_NODOMAIN, 'example@'), array(EmailValidator::ERR_DOMAINHYPHENEND, 'example@example-.co.uk'), array(EmailValidator::ERR_DOMAINHYPHENEND, 'example@example-'), array(EmailValidator::ERR_CONSECUTIVEATS, 'example@@example.co.uk'), array(EmailValidator::ERR_CONSECUTIVEDOTS, 'example..example@example.co.uk'), array(EmailValidator::ERR_CONSECUTIVEDOTS, 'example@example..co.uk'), array(EmailValidator::ERR_EXPECTING_ATEXT, '@example.fr'), array(EmailValidator::ERR_DOT_START, '.example@localhost'), array(EmailValidator::ERR_DOT_START, 'example@.localhost'), array(EmailValidator::ERR_DOT_END, 'example@localhost.'), array(EmailValidator::ERR_DOT_END, 'example.@example.co.uk'), array(EmailValidator::ERR_UNCLOSEDCOMMENT, '(example@localhost'), array(EmailValidator::ERR_UNOPENEDCOMMENT, 'comment)example@localhost'), array(EmailValidator::ERR_UNOPENEDCOMMENT, 'example(comment))@localhost'), array(EmailValidator::ERR_UNOPENEDCOMMENT, 'example@comment)localhost'), array(EmailValidator::ERR_UNOPENEDCOMMENT, 'example@localhost(comment))'), array(EmailValidator::ERR_UNOPENEDCOMMENT, 'example@(comment))example.com'), array(EmailValidator::ERR_UNCLOSEDQUOTEDSTR, '"example@localhost'), array(EmailValidator::ERR_EXPECTING_ATEXT, 'exa"mple@localhost'), //This was the original. But atext is not allowed after \n //array(EmailValidator::ERR_EXPECTING_ATEXT, "exampl\ne@example.co.uk"), array(EmailValidator::ERR_ATEXT_AFTER_CFWS, "exampl\ne@example.co.uk"), array(EmailValidator::ERR_EXPECTING_DTEXT, "example@[[]"), array(EmailValidator::ERR_ATEXT_AFTER_CFWS, "exampl\te@example.co.uk"), array(EmailValidator::ERR_CR_NO_LF, "example@exa\rmple.co.uk"), array(EmailValidator::ERR_CR_NO_LF, "example@[\r]"), array(EmailValidator::ERR_CR_NO_LF, "exam\rple@example.co.uk"), ); } /** * @dataProvider getInvalidEmailsWithWarnings */ public function testValidEmailsWithWarningsCheck($warnings, $email) { $this->assertTrue($this->validator->isValid($email, true)); $this->assertEquals($warnings, $this->validator->getWarnings()); } /** * @dataProvider getInvalidEmailsWithWarnings */ public function testInvalidEmailsWithDnsCheckAndStrictMode($warnings, $email) { $this->assertFalse($this->validator->isValid($email, true, true)); $this->assertEquals($warnings, $this->validator->getWarnings()); } public function getInvalidEmailsWithWarnings() { return array( array( array( EmailValidator::DEPREC_CFWS_NEAR_AT, EmailValidator::DNSWARN_NO_RECORD ), 'example @example.co.uk' ), array( array( EmailValidator::DEPREC_CFWS_NEAR_AT, EmailValidator::DNSWARN_NO_RECORD ), 'example@ example.co.uk' ), array( array( EmailValidator::CFWS_COMMENT, EmailValidator::DNSWARN_NO_RECORD ), 'example@example(examplecomment).co.uk' ), array( array( EmailValidator::CFWS_COMMENT, EmailValidator::DEPREC_CFWS_NEAR_AT, EmailValidator::DNSWARN_NO_RECORD, ), 'example(examplecomment)@example.co.uk' ), array( array( EmailValidator::RFC5321_QUOTEDSTRING, EmailValidator::CFWS_FWS, EmailValidator::DNSWARN_NO_RECORD, ), "\"\t\"@example.co.uk" ), array( array( EmailValidator::RFC5321_QUOTEDSTRING, EmailValidator::CFWS_FWS, EmailValidator::DNSWARN_NO_RECORD ), "\"\r\"@example.co.uk" ), array( array( EmailValidator::RFC5321_ADDRESSLITERAL, EmailValidator::DNSWARN_NO_RECORD, ), 'example@[127.0.0.1]' ), array( array( EmailValidator::RFC5321_ADDRESSLITERAL, EmailValidator::DNSWARN_NO_RECORD, ), 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334]' ), array( array( EmailValidator::RFC5321_ADDRESSLITERAL, EmailValidator::RFC5321_IPV6DEPRECATED, EmailValidator::DNSWARN_NO_RECORD, ), 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370::]' ), array( array( EmailValidator::RFC5321_ADDRESSLITERAL, EmailValidator::RFC5322_IPV6_MAXGRPS, EmailValidator::DNSWARN_NO_RECORD, ), 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334::]' ), array( array( EmailValidator::RFC5321_ADDRESSLITERAL, EmailValidator::RFC5322_IPV6_2X2XCOLON, EmailValidator::DNSWARN_NO_RECORD, ), 'example@[IPv6:1::1::1]' ), array( array( EmailValidator::RFC5322_DOMLIT_OBSDTEXT, EmailValidator::RFC5322_DOMAINLITERAL, EmailValidator::DNSWARN_NO_RECORD, ), "example@[\n]" ), array( array( EmailValidator::RFC5322_DOMAINLITERAL, EmailValidator::DNSWARN_NO_RECORD, ), 'example@[::1]' ), array( array( EmailValidator::RFC5322_DOMAINLITERAL, EmailValidator::DNSWARN_NO_RECORD, ), 'example@[::123.45.67.178]' ), array( array( EmailValidator::RFC5322_IPV6_COLONSTRT, EmailValidator::RFC5321_ADDRESSLITERAL, EmailValidator::RFC5322_IPV6_GRPCOUNT, EmailValidator::DNSWARN_NO_RECORD, ), 'example@[IPv6::2001:0db8:85a3:0000:0000:8a2e:0370:7334]' ), array( array( EmailValidator::RFC5321_ADDRESSLITERAL, EmailValidator::RFC5322_IPV6_BADCHAR, EmailValidator::DNSWARN_NO_RECORD, ), 'example@[IPv6:z001:0db8:85a3:0000:0000:8a2e:0370:7334]' ), array( array( EmailValidator::RFC5321_ADDRESSLITERAL, EmailValidator::RFC5322_IPV6_COLONEND, EmailValidator::DNSWARN_NO_RECORD, ), 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:]' ), array( array( EmailValidator::RFC5321_QUOTEDSTRING, EmailValidator::DNSWARN_NO_RECORD ), '"example"@example.co.uk' ), array( array( EmailValidator::RFC5322_LOCAL_TOOLONG, EmailValidator::DNSWARN_NO_RECORD ), 'too_long_localpart_too_long_localpart_too_long_localpart_too_long_localpart@example.co.uk' ), array( array( EmailValidator::RFC5322_LABEL_TOOLONG, EmailValidator::DNSWARN_NO_RECORD, ), 'example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart.co.uk' ), array( array( EmailValidator::RFC5322_DOMAIN_TOOLONG, EmailValidator::RFC5322_TOOLONG, EmailValidator::DNSWARN_NO_RECORD, ), 'example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocal'. 'parttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'. 'toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart' ), array( array( EmailValidator::RFC5322_DOMAIN_TOOLONG, EmailValidator::RFC5322_TOOLONG, EmailValidator::DNSWARN_NO_RECORD, ), 'example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocal'. 'parttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'. 'toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpar' ), array( array( EmailValidator::DNSWARN_NO_RECORD, ), 'test@test' ), ); } public function testInvalidEmailsWithStrict() { $this->assertFalse($this->validator->isValid('"test"@test', false, true)); } }