diff --git a/src/Parser/DomainPart.php b/src/Parser/DomainPart.php index 40c7021..dbdcee4 100644 --- a/src/Parser/DomainPart.php +++ b/src/Parser/DomainPart.php @@ -41,6 +41,9 @@ class DomainPart extends Parser return $domainChecks; } + if ($this->lexer->token['type'] === EmailLexer::S_AT) { + return new InvalidEmail(new ConsecutiveAt(), $this->lexer->token['value']); + } $domain = $this->doParseDomainPart(); if ($domain->isInvalid()) { return $domain; @@ -139,6 +142,7 @@ class DomainPart extends Parser protected function doParseDomainPart() : Result { $tldMissing = true; + $hasComments = false; $domain = ''; do { $prev = $this->lexer->getPrevious(); @@ -150,6 +154,7 @@ class DomainPart extends Parser if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS || $this->lexer->token['type'] === EmailLexer::S_CLOSEPARENTHESIS ) { + $hasComments = true; $commentsResult = $this->parseComments(); //Invalid comment parsing @@ -162,17 +167,16 @@ class DomainPart extends Parser if ($dotsResult->isInvalid()) { return $dotsResult; } - $exceptionsResult = $this->checkDomainPartExceptions($prev); - if ($exceptionsResult->isInvalid()) { - return $exceptionsResult; - } if ($this->lexer->token['type'] === EmailLexer::S_OPENBRACKET) { $literalResult = $this->parseDomainLiteral(); + + $this->addTLDWarnings($tldMissing); //Invalid literal parsing - if($literalResult->isInvalid()) { - return $literalResult; - } + //if($literalResult->isInvalid()) { + // return $literalResult; + //} + return $literalResult; } $this->checkLabelLength($prev); @@ -188,10 +192,14 @@ class DomainPart extends Parser $tldMissing = false; } - $this->lexer->moveNext(); - if ($this->lexer->token['type'] === EmailLexer::S_SP) { - return new InvalidEmail(new CharNotAllowed(), $this->lexer->token['value']); + $exceptionsResult = $this->checkDomainPartExceptions($prev, $hasComments); + if ($exceptionsResult->isInvalid()) { + return $exceptionsResult; } + $this->lexer->moveNext(); + //if ($this->lexer->token['type'] === EmailLexer::S_SP) { + // return new InvalidEmail(new CharNotAllowed(), $this->lexer->token['value']); + //} } while (null !== $this->lexer->token['type']); @@ -231,7 +239,7 @@ class DomainPart extends Parser /** * @return InvalidEmail|ValidEmail */ - protected function checkDomainPartExceptions(array $prev) : Result + protected function checkDomainPartExceptions(array $prev, bool $hasComments) : Result { $invalidDomainTokens = array( EmailLexer::S_DQUOTE => true, @@ -241,16 +249,15 @@ class DomainPart extends Parser EmailLexer::S_LOWERTHAN => true, ); - if (isset($invalidDomainTokens[$this->lexer->token['type']])) { - return new InvalidEmail(new ExpectingATEXT('Invalid token in domain'), $this->lexer->token['value']); - } + $validDomainTokens = array( + EmailLexer::GENERIC => true, + EmailLexer::S_HYPHEN => true, + EmailLexer::S_DOT => true, + ); - if ($this->lexer->token['type'] === EmailLexer::S_COMMA) { - return new InvalidEmail(new CommaInDomain(), $this->lexer->token['value']); - } - - if ($this->lexer->token['type'] === EmailLexer::S_AT) { - return new InvalidEmail(new ConsecutiveAt(), $this->lexer->token['value']); + if ($hasComments) { + $validDomainTokens[EmailLexer::S_OPENPARENTHESIS] = true; + $validDomainTokens[EmailLexer::S_CLOSEPARENTHESIS] = true; } if ($this->lexer->token['type'] === EmailLexer::S_OPENQBRACKET && $prev['type'] !== EmailLexer::S_AT) { @@ -266,6 +273,10 @@ class DomainPart extends Parser return new InvalidEmail(new ExpectingATEXT('Escaping following "ATOM"'), $this->lexer->token['value']); } + if (!isset($validDomainTokens[$this->lexer->token['type']])) { + return new InvalidEmail(new ExpectingATEXT('Invalid token in domain: ' . $this->lexer->token['value']), $this->lexer->token['value']); + } + return new ValidEmail(); } diff --git a/tests/EmailValidator/Validation/RFCValidationDomainPartTest.php b/tests/EmailValidator/Validation/RFCValidationDomainPartTest.php new file mode 100644 index 0000000..cfc6530 --- /dev/null +++ b/tests/EmailValidator/Validation/RFCValidationDomainPartTest.php @@ -0,0 +1,229 @@ +validator = new RFCValidation(); + $this->lexer = new EmailLexer(); + } + + protected function tearDown() : void + { + $this->validator = null; + } + + /** + * @dataProvider getValidEmails + */ + public function testValidEmails($email) + { + $this->assertTrue($this->validator->isValid($email, $this->lexer)); + } + + public function getValidEmails() + { + return array( + ['fabien@symfony.com'], + ['example@example.co.uk'], + ['example@localhost'], + ['example@faked(fake).co.uk'], + ['инфо@письмо.рф'], + ['müller@möller.de'], + ['test@email*'], + ['test@email!'], + ['test@email&'], + ['test@email^'], + ['test@email%'], + ['test@email$'], + ["1500111@профи-инвест.рф"], + ['validipv6@[IPv6:2001:db8:1ff::a0b:dbd0]'], + ['validipv4@[127.0.0.0]'], + ['validipv4@127.0.0.0'], + ['withhyphen@domain-exam.com'], + ); + } + + /** + * @dataProvider getInvalidEmails + */ + public function testInvalidEmails($email) + { + $this->assertFalse($this->validator->isValid($email, $this->lexer)); + } + + public function getInvalidEmails() + { + return [ + ['test@example.com test'], + ['example@example@example.co.uk'], + ['test_exampel@example.fr]'], + ['example@local\host'], + ['example@localhost\\'], + ['example@localhost.'], + ['username@ example . com'], + ['example@(fake].com'], + ['example@(fake.com'], + ['username@example,com'], + ['test@' . chr(226) . '.org'], + ['test@iana.org \r\n'], + ['test@iana.org \r\n '], + ['test@iana.org \r\n \r\n'], + ['test@iana.org \r\n\r\n'], + ['test@iana.org \r\n\r\n '], + ['test@iana/icann.org'], + ['test@foo;bar.com'], + ['test@example..com'], + ["test@examp'le.com"], + ['email.email@email."'], + ['test@email>'], + ['test@email<'], + ['test@email{'], + ['username@examp,le.com'], + ['test@ '], + ['invalidipv4@[127.\0.0.0]'], + ['test@example.com []'], + ['test@example.com. []'], + ['test@test. example.com'], + ]; + } + + /** + * @dataProvider getInvalidEmailsWithErrors + */ + public function testInvalidEmailsWithErrorsCheck($error, $email) + { + $this->assertFalse($this->validator->isValid($email, $this->lexer)); + $this->assertEquals($error, $this->validator->getError()); + } + + public function getInvalidEmailsWithErrors() + { + return [ + [new InvalidEmail(new NoDomainPart(), ''), 'example@'], + [new InvalidEmail(new DomainHyphened('Hypen found near DOT'), '-'), 'example@example-.co.uk'], [new InvalidEmail(new CRNoLF(), "\r"), "example@example\r.com"], + [new InvalidEmail(new DomainHyphened('Hypen found at the end of the domain'), '-'), 'example@example-'], + [new InvalidEmail(new ConsecutiveAt(), '@'), 'example@@example.co.uk'], + [new InvalidEmail(new ConsecutiveDot(), '.'), 'example@example..co.uk'], + [new InvalidEmail(new DotAtStart(), '.'), 'example@.localhost'], + [new InvalidEmail(new DomainHyphened('After AT'), '-'), 'example@-localhost'], + [new InvalidEmail(new DotAtEnd(), ''), 'example@localhost.'], + [new InvalidEmail(new UnOpenedComment(), ')'), 'example@comment)localhost'], + [new InvalidEmail(new UnOpenedComment(), ')'), 'example@localhost(comment))'], + [new InvalidEmail(new UnOpenedComment(), 'com'), 'example@(comment))example.com'], + [new InvalidEmail(new ExpectingDTEXT(), '['), "example@[[]"], + [new InvalidEmail(new CRNoLF(), "\r"), "example@exa\rmple.co.uk"], + [new InvalidEmail(new CRNoLF(), "["), "example@[\r]"], + [new InvalidEmail(new ExpectingATEXT('Invalid token in domain: ,'), ','), 'example@exam,ple.com'], + [new InvalidEmail(new ExpectingATEXT("Invalid token in domain: '"), "'"), "test@example.com'"], + ]; + } + + /** + * @dataProvider getValidEmailsWithWarnings + */ + public function testValidEmailsWithWarningsCheck($expectedWarnings, $email) + { + $this->assertTrue($this->validator->isValid($email, $this->lexer)); + $warnings = $this->validator->getWarnings(); + $this->assertCount( + count($expectedWarnings), $warnings, + "Expected: " . implode(",", $expectedWarnings) . " and got: " . PHP_EOL . implode(PHP_EOL, $warnings) + ); + + foreach ($warnings as $warning) { + $this->assertArrayHasKey($warning->code(), $expectedWarnings); + } + } + + public function getValidEmailsWithWarnings() + { + return [ + [[CFWSNearAt::CODE], 'example@ invalid.example.com'], + [[Comment::CODE], 'example@invalid.example(examplecomment).com'], + [[AddressLiteral::CODE, TLD::CODE], 'example@[127.0.0.1]'], + [[AddressLiteral::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334]'], + [[AddressLiteral::CODE, IPV6Deprecated::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370::]'], + [[AddressLiteral::CODE, IPV6MaxGroups::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334::]'], + [[AddressLiteral::CODE, IPV6DoubleColon::CODE, TLD::CODE], 'example@[IPv6:1::1::1]'], + [[ObsoleteDTEXT::CODE, DomainLiteral::CODE, TLD::CODE], "example@[\n]"], + [[DomainLiteral::CODE, TLD::CODE], 'example@[::1]'], + [[DomainLiteral::CODE, TLD::CODE], 'example@[::123.45.67.178]'], + [ + [IPV6ColonStart::CODE, AddressLiteral::CODE, IPV6GroupCount::CODE, TLD::CODE], + 'example@[IPv6::2001:0db8:85a3:0000:0000:8a2e:0370:7334]' + ], + [ + [AddressLiteral::CODE, IPV6BadChar::CODE, TLD::CODE], + 'example@[IPv6:z001:0db8:85a3:0000:0000:8a2e:0370:7334]' + ], + [ + [AddressLiteral::CODE, IPV6ColonEnd::CODE, TLD::CODE], + 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:]' + ], + [ + [LabelTooLong::CODE,], + 'example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart.co.uk' + ], + [ + [DomainTooLong::CODE, LabelTooLong::CODE, TLD::CODE], + 'example2@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocal'. + 'parttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'. + 'toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart' + ], + [ + [DomainTooLong::CODE, LabelTooLong::CODE, TLD::CODE], + 'example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocal'. + 'parttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'. + 'toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpar' + ], + ]; + } + + +} \ No newline at end of file diff --git a/tests/EmailValidator/Validation/RFCValidationTest.php b/tests/EmailValidator/Validation/RFCValidationTest.php index dd4e2b0..80fb3e2 100644 --- a/tests/EmailValidator/Validation/RFCValidationTest.php +++ b/tests/EmailValidator/Validation/RFCValidationTest.php @@ -8,35 +8,18 @@ use Egulias\EmailValidator\Warning\Comment; use Egulias\EmailValidator\Warning\CFWSNearAt; use Egulias\EmailValidator\Result\InvalidEmail; use Egulias\EmailValidator\Warning\CFWSWithFWS; -use Egulias\EmailValidator\Warning\IPV6BadChar; -use Egulias\EmailValidator\Warning\IPV6ColonEnd; -use Egulias\EmailValidator\Warning\LabelTooLong; use Egulias\EmailValidator\Warning\LocalTooLong; use Egulias\EmailValidator\Warning\QuotedString; -use Egulias\EmailValidator\Warning\DomainLiteral; -use Egulias\EmailValidator\Warning\DomainTooLong; -use Egulias\EmailValidator\Warning\IPV6MaxGroups; -use Egulias\EmailValidator\Warning\ObsoleteDTEXT; -use Egulias\EmailValidator\Warning\AddressLiteral; -use Egulias\EmailValidator\Warning\IPV6ColonStart; -use Egulias\EmailValidator\Warning\IPV6Deprecated; -use Egulias\EmailValidator\Warning\IPV6GroupCount; -use Egulias\EmailValidator\Warning\IPV6DoubleColon; use Egulias\EmailValidator\Validation\RFCValidation; use Egulias\EmailValidator\Result\Reason\NoLocalPart; use Egulias\EmailValidator\Result\Reason\AtextAfterCFWS; -use Egulias\EmailValidator\Result\Reason\CommaInDomain; -use Egulias\EmailValidator\Result\Reason\ConsecutiveAt; use Egulias\EmailValidator\Result\Reason\UnOpenedComment; use Egulias\EmailValidator\Result\Reason\UnclosedQuotedString; use Egulias\EmailValidator\Result\Reason\CRNoLF; use Egulias\EmailValidator\Result\Reason\DotAtEnd; use Egulias\EmailValidator\Result\Reason\DotAtStart; -use Egulias\EmailValidator\Result\Reason\NoDomainPart; use Egulias\EmailValidator\Result\Reason\ConsecutiveDot; -use Egulias\EmailValidator\Result\Reason\DomainHyphened; use Egulias\EmailValidator\Result\Reason\ExpectingATEXT; -use Egulias\EmailValidator\Result\Reason\ExpectingDTEXT; use Egulias\EmailValidator\Result\Reason\UnclosedComment; use Egulias\EmailValidator\Warning\TLD; @@ -78,11 +61,9 @@ class RFCValidationTest extends TestCase ['fabien@symfony.com'], ['example@example.co.uk'], ['fabien_potencier@example.fr'], - ['example@localhost'], ['fab\'ien@symfony.com'], ['fab\ ien@symfony.com'], ['example((example))@fakedfake.co.uk'], - ['example@faked(fake).co.uk'], ['fabien+@symfony.com'], ['инфо@письмо.рф'], ['"username"@example.com'], @@ -95,18 +76,7 @@ class RFCValidationTest extends TestCase ['""@iana.org'], ['"\""@iana.org'], ['müller@möller.de'], - ['test@email*'], - ['test@email!'], - ['test@email&'], - ['test@email^'], - ['test@email%'], - ['test@email$'], ["1500111@профи-инвест.рф"], - ['validipv6@[IPv6:2001:db8:1ff::a0b:dbd0]'], - ['validipv4@[127.0.0.0]'], - ['validipv4@127.0.0.0'], - ['withhyphen@domain-exam.com'], - ); } @@ -123,7 +93,14 @@ class RFCValidationTest extends TestCase { return [ ['a5aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@example.com', [new LocalTooLong()]], - ['example@example', [new TLD()]] + ['example@example', [new TLD()]], + ['example @invalid.example.com', [new CFWSNearAt()]], + ['example(examplecomment)@invalid.example.com',[new Comment(), new CFWSNearAt()]], + ["\"\t\"@invalid.example.com", [new QuotedString("", '"'), new CFWSWithFWS(),]], + ["\"\r\"@invalid.example.com", [new QuotedString('', '"'), new CFWSWithFWS(),]], + ['"example"@invalid.example.com', [new QuotedString('', '"')]], + ['too_long_localpart_too_long_localpart_too_long_localpart_too_long_localpart@invalid.example.com', + [new LocalTooLong()]], ]; } @@ -144,23 +121,15 @@ class RFCValidationTest extends TestCase public function getInvalidEmails() { return [ - ['test@example.com test'], ['user name@example.com'], ['user name@example.com'], ['example.@example.co.uk'], ['example@example@example.co.uk'], - ['(test_exampel@example.fr]'], + ['(test_exampel@example.fr'], ['example(example]example@example.co.uk'], ['.example@localhost'], ['ex\ample@localhost'], - ['example@local\host'], - ['example@localhost\\'], - ['example@localhost.'], ['user name@example.com'], - ['username@ example . com'], - ['example@(fake].com'], - ['example@(fake.com'], - ['username@example,com'], ['usern,ame@example.com'], ['user[na]me@example.com'], ['"""@iana.org'], @@ -172,32 +141,12 @@ class RFCValidationTest extends TestCase ['"test"' . chr(0) . '@iana.org'], ['"test\"@iana.org'], [chr(226) . '@iana.org'], - ['test@' . chr(226) . '.org'], ['\r\ntest@iana.org'], ['\r\n test@iana.org'], ['\r\n \r\ntest@iana.org'], ['\r\n \r\ntest@iana.org'], ['\r\n \r\n test@iana.org'], - ['test@iana.org \r\n'], - ['test@iana.org \r\n '], - ['test@iana.org \r\n \r\n'], - ['test@iana.org \r\n\r\n'], - ['test@iana.org \r\n\r\n '], - ['test@iana/icann.org'], - ['test@foo;bar.com'], ['test;123@foobar.com'], - ['test@example..com'], - ["test@examp'le.com"], - ['email.email@email."'], - ['test@email>'], - ['test@email<'], - ['test@email{'], - ['username@examp,le.com'], - ['test@ '], - ['validipv4@[127.\0.0.0]'], - ['test@example.com []'], - ['test@example.com. []'], - ['test@test. example.com'], ]; } @@ -214,17 +163,9 @@ class RFCValidationTest extends TestCase { return [ [new InvalidEmail(new NoLocalPart(), "@"), '@example.co.uk'], - [new InvalidEmail(new NoDomainPart(), ''), 'example@'], - [new InvalidEmail(new DomainHyphened('Hypen found near DOT'), '-'), 'example@example-.co.uk'], [new InvalidEmail(new CRNoLF(), "\r"), "example@example\r.com"], - [new InvalidEmail(new DomainHyphened('Hypen found at the end of the domain'), '-'), 'example@example-'], - [new InvalidEmail(new ConsecutiveAt(), '@'), 'example@@example.co.uk'], [new InvalidEmail(new ConsecutiveDot(), '.'), 'example..example@example.co.uk'], - [new InvalidEmail(new ConsecutiveDot(), '.'), 'example@example..co.uk'], [new InvalidEmail(new ExpectingATEXT('Invalid token found'), '<'), '@example.fr'], [new InvalidEmail(new DotAtStart(), '.'), '.example@localhost'], - [new InvalidEmail(new DotAtStart(), '.'), 'example@.localhost'], - [new InvalidEmail(new DomainHyphened('After AT'), '-'), 'example@-localhost'], - [new InvalidEmail(new DotAtEnd(), ''), 'example@localhost.'], [new InvalidEmail(new DotAtEnd(), '.'), 'example.@example.co.uk'], [new InvalidEmail(new UnclosedComment(), '('), '(example@localhost'], [new InvalidEmail(new UnclosedQuotedString(), '"'), '"example@localhost'], @@ -236,93 +177,9 @@ class RFCValidationTest extends TestCase ], [new InvalidEmail(new UnOpenedComment(), ')'), 'comment)example@localhost'], [new InvalidEmail(new UnOpenedComment(), ')'), 'example(comment))@localhost'], - [new InvalidEmail(new UnOpenedComment(), ')'), 'example@comment)localhost'], - [new InvalidEmail(new UnOpenedComment(), ')'), 'example@localhost(comment))'], - [new InvalidEmail(new UnOpenedComment(), 'com'), 'example@(comment))example.com'], - //This was the original. But atext is not allowed after \n - //array(EmailValidator::ERR_EXPECTING_ATEXT, "exampl\ne@example.co.uk"), [new InvalidEmail(new AtextAfterCFWS(), "\n"), "exampl\ne@example.co.uk"], - [new InvalidEmail(new ExpectingDTEXT(), '['), "example@[[]"], [new InvalidEmail(new AtextAfterCFWS(), "\t"), "exampl\te@example.co.uk"], - [new InvalidEmail(new CRNoLF(), "\r"), "example@exa\rmple.co.uk"], - [new InvalidEmail(new CRNoLF(), "["), "example@[\r]"], [new InvalidEmail(new CRNoLF(), "\r"), "exam\rple@example.co.uk"], - [new InvalidEmail(new CommaInDomain(), ','), 'example@exam,ple.com'], - [new InvalidEmail(new ExpectingATEXT('Invalid token in domain'), "'"), "test@example.com'"], ]; } - - /** - * @dataProvider getInvalidEmailsWithWarnings - */ - public function testInvalidEmailsWithWarningsCheck($expectedWarnings, $email) - { - $this->assertTrue($this->validator->isValid($email, $this->lexer)); - $warnings = $this->validator->getWarnings(); - $this->assertCount( - count($expectedWarnings), $warnings, - "Expected: " . implode(",", $expectedWarnings) . " and got: " . PHP_EOL . implode(PHP_EOL, $warnings) - ); - - foreach ($warnings as $warning) { - $this->assertArrayHasKey($warning->code(), $expectedWarnings); - } - } - - public function getInvalidEmailsWithWarnings() - { - return [ - [[CFWSNearAt::CODE], 'example @invalid.example.com'], - [[CFWSNearAt::CODE], 'example@ invalid.example.com'], - [[Comment::CODE], 'example@invalid.example(examplecomment).com'], - [[Comment::CODE,CFWSNearAt::CODE], 'example(examplecomment)@invalid.example.com'], - [[QuotedString::CODE, CFWSWithFWS::CODE,], "\"\t\"@invalid.example.com"], - [[QuotedString::CODE, CFWSWithFWS::CODE,], "\"\r\"@invalid.example.com"], - [[AddressLiteral::CODE, TLD::CODE], 'example@[127.0.0.1]'], - [[AddressLiteral::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334]'], - [[AddressLiteral::CODE, IPV6Deprecated::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370::]'], - [[AddressLiteral::CODE, IPV6MaxGroups::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334::]'], - [[AddressLiteral::CODE, IPV6DoubleColon::CODE, TLD::CODE], 'example@[IPv6:1::1::1]'], - [[ObsoleteDTEXT::CODE, DomainLiteral::CODE, TLD::CODE], "example@[\n]"], - [[DomainLiteral::CODE, TLD::CODE], 'example@[::1]'], - [[DomainLiteral::CODE, TLD::CODE], 'example@[::123.45.67.178]'], - [ - [IPV6ColonStart::CODE, AddressLiteral::CODE, IPV6GroupCount::CODE, TLD::CODE], - 'example@[IPv6::2001:0db8:85a3:0000:0000:8a2e:0370:7334]' - ], - [ - [AddressLiteral::CODE, IPV6BadChar::CODE, TLD::CODE], - 'example@[IPv6:z001:0db8:85a3:0000:0000:8a2e:0370:7334]' - ], - [ - [AddressLiteral::CODE, IPV6ColonEnd::CODE, TLD::CODE], - 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:]' - ], - [[QuotedString::CODE,], '"example"@invalid.example.com'], - [ - [LocalTooLong::CODE,], - 'too_long_localpart_too_long_localpart_too_long_localpart_too_long_localpart@invalid.example.com' - ], - [ - [LocalTooLong::CODE], - 'too_long_localpart_too_long_localpart_123_too_long_localpart_too_long_localpart@example.com' - ], - [ - [LabelTooLong::CODE,], - 'example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart.co.uk' - ], - [ - [DomainTooLong::CODE, LabelTooLong::CODE, TLD::CODE], - 'example2@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocal'. - 'parttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'. - 'toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart' - ], - [ - [DomainTooLong::CODE, LabelTooLong::CODE, TLD::CODE], - 'example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocal'. - 'parttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'. - 'toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpar' - ], - ]; - } -} +} \ No newline at end of file