<?php
/**
* PHPMailer - PHP email transport unit tests.
* PHP version 5.5.
*
* @author Marcus Bointon <phpmailer@synchromedia.co.uk>
* @author Andy Prevost
* @copyright 2012 - 2020 Marcus Bointon
* @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace PHPMailer\Test\PHPMailer;
use PHPMailer\PHPMailer\PHPMailer;
use Yoast\PHPUnitPolyfills\TestCases\TestCase;
final class ParseAddressesTest extends TestCase
{
public function testAddressSplittingNative($addrstr, $expected, $charset = null)
{
if (isset($charset)) {
$parsed = PHPMailer::parseAddresses($addrstr, false, $charset);
} else {
$parsed = PHPMailer::parseAddresses($addrstr, false);
}
$expectedOutput = $expected['default'];
if (empty($expected['native+mbstring']) === false) {
$expectedOutput = $expected['native+mbstring'];
} elseif (empty($expected['native']) === false) {
$expectedOutput = $expected['native'];
}
$this->verifyExpectations($parsed, $expectedOutput);
}
public function testAddressSplittingImap($addrstr, $expected, $charset = null)
{
if (isset($charset)) {
$parsed = PHPMailer::parseAddresses($addrstr, true, $charset);
} else {
$parsed = PHPMailer::parseAddresses($addrstr, true);
}
$expectedOutput = $expected['default'];
if (empty($expected['imap+mbstring']) === false) {
$expectedOutput = $expected['imap+mbstring'];
} elseif (empty($expected['imap']) === false) {
$expectedOutput = $expected['imap'];
}
$this->verifyExpectations($parsed, $expectedOutput);
}
public function testAddressSplittingNativeNoMbstring($addrstr, $expected, $charset = null)
{
if (extension_loaded('mbstring')) {
$this->markTestSkipped('Test requires MbString *not* to be available');
}
if (isset($charset)) {
$parsed = PHPMailer::parseAddresses($addrstr, false, $charset);
} else {
$parsed = PHPMailer::parseAddresses($addrstr, false);
}
$expectedOutput = $expected['default'];
if (empty($expected['native--mbstring']) === false) {
$expectedOutput = $expected['native--mbstring'];
} elseif (empty($expected['native']) === false) {
$expectedOutput = $expected['native'];
}
$this->verifyExpectations($parsed, $expectedOutput);
}
public function testAddressSplittingImapNoMbstring($addrstr, $expected, $charset = null)
{
if (extension_loaded('mbstring')) {
$this->markTestSkipped('Test requires MbString *not* to be available');
}
if (isset($charset)) {
$parsed = PHPMailer::parseAddresses($addrstr, true, $charset);
} else {
$parsed = PHPMailer::parseAddresses($addrstr, true);
}
$expectedOutput = $expected['default'];
if (empty($expected['imap--mbstring']) === false) {
$expectedOutput = $expected['imap--mbstring'];
} elseif (empty($expected['imap']) === false) {
$expectedOutput = $expected['imap'];
}
$this->verifyExpectations($parsed, $expectedOutput);
}
protected function verifyExpectations($actual, $expected)
{
self::assertIsArray($actual, 'parseAddresses() did not return an array');
self::assertSame(
$expected,
$actual,
'The return value from parseAddresses() did not match the expected output'
);
}
public function dataAddressSplitting()
{
return [
'Valid address: single address without name' => [
'addrstr' => 'joe@example.com',
'expected' => [
'default' => [
['name' => '', 'address' => 'joe@example.com'],
],
],
],
'Valid address: single address with name' => [
'addrstr' => 'Joe User <joe@example.com>',
'expected' => [
'default' => [
['name' => 'Joe User', 'address' => 'joe@example.com'],
],
],
],
'Valid address: single RFC2047 address folded onto multiple lines' => [
'addrstr' => "=?iso-8859-1?B?QWJjZGVmZ2ggSWprbG3DsSDmnIPorbDlrqTpoJDntITn?=\r\n" .
' =?iso-8859-1?B?s7vntbE=?= <xyz@example.com>',
'expected' => [
'default' => [
['name' => 'Abcdefgh Ijklmñ 會議室預約系統', 'address' => 'xyz@example.com'],
],
],
],
'Valid address: single RFC2047 address with space encoded as _' => [
'addrstr' => '=?iso-8859-1?Q?Abcdefgh_ijklm=C3=B1?= <xyz@example.com>',
'expected' => [
'default' => [
['name' => 'Abcdefgh ijklmñ', 'address' => 'xyz@example.com'],
],
],
],
'Valid address: single address, quotes within name' => [
'addrstr' => 'Tim "The Book" O\'Reilly <foo@example.com>',
'expected' => [
'default' => [
['name' => 'Tim "The Book" O\'Reilly', 'address' => 'foo@example.com'],
],
'imap' => [
['name' => 'Tim The Book O\'Reilly', 'address' => 'foo@example.com'],
],
],
],
'Valid address: two addresses with names' => [
'addrstr' => 'Joe User <joe@example.com>, Jill User <jill@example.net>',
'expected' => [
'default' => [
['name' => 'Joe User', 'address' => 'joe@example.com'],
['name' => 'Jill User', 'address' => 'jill@example.net'],
],
],
],
'Valid address: two addresses with names, one without' => [
'addrstr' => 'Joe User <joe@example.com>,'
. 'Jill User <jill@example.net>,'
. 'frank@example.com,',
'expected' => [
'default' => [
['name' => 'Joe User', 'address' => 'joe@example.com'],
['name' => 'Jill User', 'address' => 'jill@example.net'],
['name' => '', 'address' => 'frank@example.com'],
],
],
],
'Valid address: multiple address, various formats, including one utf8-encoded name' => [
'addrstr' => 'joe@example.com, <me@example.com>, Joe Doe <doe@example.com>,' .
' "John O\'Groats" <johnog@example.net>,' .
' =?utf-8?B?0J3QsNC30LLQsNC90LjQtSDRgtC10YHRgtCw?= <encoded@example.org>',
'expected' => [
'default' => [
[
'name' => '',
'address' => 'joe@example.com',
],
[
'name' => '',
'address' => 'me@example.com',
],
[
'name' => 'Joe Doe',
'address' => 'doe@example.com',
],
[
'name' => "John O'Groats",
'address' => 'johnog@example.net',
],
[
'name' => 'Название теста',
'address' => 'encoded@example.org',
],
],
'native--mbstring' => [
[
'name' => '',
'address' => 'joe@example.com',
],
[
'name' => '',
'address' => 'me@example.com',
],
[
'name' => 'Joe Doe',
'address' => 'doe@example.com',
],
[
'name' => "John O'Groats",
'address' => 'johnog@example.net',
],
[
'name' => '=?utf-8?B?0J3QsNC30LLQsNC90LjQtSDRgtC10YHRgtCw?=',
'address' => 'encoded@example.org',
],
],
'imap--mbstring' => [
[
'name' => '',
'address' => 'joe@example.com',
],
[
'name' => '',
'address' => 'me@example.com',
],
[
'name' => 'Joe Doe',
'address' => 'doe@example.com',
],
[
'name' => "John O'Groats",
'address' => 'johnog@example.net',
],
[
'name' => '=?utf-8?B?0J3QsNC30LLQsNC90LjQtSDRgtC10YHRgtCw?=',
'address' => 'encoded@example.org',
],
],
],
'charset' => PHPMailer::CHARSET_UTF8,
],
'Invalid address: single address, incomplete email' => [
'addrstr' => 'Jill User <doug@>',
'expected' => [
'default' => [],
],
],
'Invalid address: single address, invalid characters in email' => [
'addrstr' => 'Joe User <{^c\@**Dog^}@cartoon.com>',
'expected' => [
'default' => [],
],
],
'Invalid address: multiple addresses, invalid periods' => [
'addrstr' => 'Joe User <joe@example.com.>, Jill User <jill.@example.net>',
'expected' => [
'default' => [],
],
],
];
}
}