[Web] Update libs

master
andryyy 2021-01-04 11:11:04 +01:00
parent 46928269bb
commit ee6989bd1d
No known key found for this signature in database
GPG Key ID: 8EC34FF2794E25EF
84 changed files with 3264 additions and 931 deletions

File diff suppressed because one or more lines are too long

View File

@ -62,35 +62,39 @@
"oauth", "oauth",
"oauth2" "oauth2"
], ],
"support": {
"issues": "https://github.com/bshaffer/oauth2-server-php/issues",
"source": "https://github.com/bshaffer/oauth2-server-php/tree/master"
},
"time": "2018-12-04T00:29:32+00:00" "time": "2018-12-04T00:29:32+00:00"
}, },
{ {
"name": "ddeboer/imap", "name": "ddeboer/imap",
"version": "1.10.0", "version": "1.11.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/ddeboer/imap.git", "url": "https://github.com/ddeboer/imap.git",
"reference": "fc09dbf6fb9ba7317a95c719e45893efc4fe6bde" "reference": "a089dfcb9d177f921eb5dadc8d4144a44dff22ee"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/ddeboer/imap/zipball/fc09dbf6fb9ba7317a95c719e45893efc4fe6bde", "url": "https://api.github.com/repos/ddeboer/imap/zipball/a089dfcb9d177f921eb5dadc8d4144a44dff22ee",
"reference": "fc09dbf6fb9ba7317a95c719e45893efc4fe6bde", "reference": "a089dfcb9d177f921eb5dadc8d4144a44dff22ee",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-iconv": "*", "ext-iconv": "*",
"ext-imap": "*", "ext-imap": "*",
"ext-mbstring": "*", "ext-mbstring": "*",
"php": "^7.2" "php": "^7.3 || ^8.0"
}, },
"require-dev": { "require-dev": {
"friendsofphp/php-cs-fixer": "^2.16", "friendsofphp/php-cs-fixer": "^2.16.7",
"phpstan/phpstan": "^0.12", "laminas/laminas-mail": "^2.12.3",
"phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan": "^0.12.57",
"phpstan/phpstan-strict-rules": "^0.12", "phpstan/phpstan-phpunit": "^0.12.16",
"phpunit/phpunit": "^8.5", "phpstan/phpstan-strict-rules": "^0.12.5",
"zendframework/zend-mail": "^2.10" "phpunit/phpunit": "^9.4.3"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -122,20 +126,34 @@
"imap", "imap",
"mail" "mail"
], ],
"time": "2020-01-24T08:15:24+00:00" "support": {
"issues": "https://github.com/ddeboer/imap/issues",
"source": "https://github.com/ddeboer/imap/tree/1.11.0"
},
"funding": [
{
"url": "https://github.com/Slamdunk",
"type": "github"
},
{
"url": "https://github.com/ddeboer",
"type": "github"
}
],
"time": "2020-11-30T14:52:49+00:00"
}, },
{ {
"name": "matthiasmullie/minify", "name": "matthiasmullie/minify",
"version": "1.3.63", "version": "1.3.65",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/matthiasmullie/minify.git", "url": "https://github.com/matthiasmullie/minify.git",
"reference": "9ba1b459828adc13430f4dd6c49dae4950dc4117" "reference": "227f19062451c55a797e0cc667ef983834e6580c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/matthiasmullie/minify/zipball/9ba1b459828adc13430f4dd6c49dae4950dc4117", "url": "https://api.github.com/repos/matthiasmullie/minify/zipball/227f19062451c55a797e0cc667ef983834e6580c",
"reference": "9ba1b459828adc13430f4dd6c49dae4950dc4117", "reference": "227f19062451c55a797e0cc667ef983834e6580c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -182,7 +200,25 @@
"minifier", "minifier",
"minify" "minify"
], ],
"time": "2020-01-21T20:21:08+00:00" "support": {
"issues": "https://github.com/matthiasmullie/minify/issues",
"source": "https://github.com/matthiasmullie/minify/tree/1.3.65"
},
"funding": [
{
"url": "https://github.com/[user1",
"type": "github"
},
{
"url": "https://github.com/matthiasmullie] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g.",
"type": "github"
},
{
"url": "https://github.com/user2",
"type": "github"
}
],
"time": "2020-12-27T21:43:29+00:00"
}, },
{ {
"name": "matthiasmullie/path-converter", "name": "matthiasmullie/path-converter",
@ -231,6 +267,10 @@
"paths", "paths",
"relative" "relative"
], ],
"support": {
"issues": "https://github.com/matthiasmullie/path-converter/issues",
"source": "https://github.com/matthiasmullie/path-converter/tree/1.1.3"
},
"time": "2019-02-05T23:41:09+00:00" "time": "2019-02-05T23:41:09+00:00"
}, },
{ {
@ -285,20 +325,20 @@
}, },
{ {
"name": "paragonie/random_compat", "name": "paragonie/random_compat",
"version": "v9.99.99", "version": "v9.99.100",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/paragonie/random_compat.git", "url": "https://github.com/paragonie/random_compat.git",
"reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
"reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7" "php": ">= 7"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "4.*|5.*", "phpunit/phpunit": "4.*|5.*",
@ -326,7 +366,12 @@
"pseudorandom", "pseudorandom",
"random" "random"
], ],
"time": "2018-07-02T15:55:56+00:00" "support": {
"email": "info@paragonie.com",
"issues": "https://github.com/paragonie/random_compat/issues",
"source": "https://github.com/paragonie/random_compat"
},
"time": "2020-10-15T08:29:30+00:00"
}, },
{ {
"name": "php-mime-mail-parser/php-mime-mail-parser", "name": "php-mime-mail-parser/php-mime-mail-parser",
@ -408,31 +453,39 @@
"parser", "parser",
"php" "php"
], ],
"support": {
"issues": "https://github.com/php-mime-mail-parser/php-mime-mail-parser/issues",
"source": "https://github.com/php-mime-mail-parser/php-mime-mail-parser/tree/master"
},
"time": "2019-09-23T11:57:58+00:00" "time": "2019-09-23T11:57:58+00:00"
}, },
{ {
"name": "phpmailer/phpmailer", "name": "phpmailer/phpmailer",
"version": "v6.1.6", "version": "v6.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PHPMailer/PHPMailer.git", "url": "https://github.com/PHPMailer/PHPMailer.git",
"reference": "c2796cb1cb99d7717290b48c4e6f32cb6c60b7b3" "reference": "e38888a75c070304ca5514197d4847a59a5c853f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/c2796cb1cb99d7717290b48c4e6f32cb6c60b7b3", "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/e38888a75c070304ca5514197d4847a59a5c853f",
"reference": "c2796cb1cb99d7717290b48c4e6f32cb6c60b7b3", "reference": "e38888a75c070304ca5514197d4847a59a5c853f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-ctype": "*", "ext-ctype": "*",
"ext-filter": "*", "ext-filter": "*",
"ext-hash": "*",
"php": ">=5.5.0" "php": ">=5.5.0"
}, },
"require-dev": { "require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
"doctrine/annotations": "^1.2", "doctrine/annotations": "^1.2",
"friendsofphp/php-cs-fixer": "^2.2", "phpcompatibility/php-compatibility": "^9.3.5",
"phpunit/phpunit": "^4.8 || ^5.7" "roave/security-advisories": "dev-latest",
"squizlabs/php_codesniffer": "^3.5.6",
"yoast/phpunit-polyfills": "^0.2.0"
}, },
"suggest": { "suggest": {
"ext-mbstring": "Needed to send email in multibyte encoding charset", "ext-mbstring": "Needed to send email in multibyte encoding charset",
@ -470,13 +523,17 @@
} }
], ],
"description": "PHPMailer is a full-featured email creation and transfer class for PHP", "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
"support": {
"issues": "https://github.com/PHPMailer/PHPMailer/issues",
"source": "https://github.com/PHPMailer/PHPMailer/tree/v6.2.0"
},
"funding": [ "funding": [
{ {
"url": "https://github.com/synchro", "url": "https://github.com/Synchro",
"type": "github" "type": "github"
} }
], ],
"time": "2020-05-27T12:24:03+00:00" "time": "2020-11-25T15:24:57+00:00"
}, },
{ {
"name": "robthree/twofactorauth", "name": "robthree/twofactorauth",
@ -527,6 +584,10 @@
"php", "php",
"tfa" "tfa"
], ],
"support": {
"issues": "https://github.com/RobThree/TwoFactorAuth/issues",
"source": "https://github.com/RobThree/TwoFactorAuth"
},
"time": "2020-01-02T19:56:46+00:00" "time": "2020-01-02T19:56:46+00:00"
}, },
{ {
@ -577,6 +638,11 @@
"php", "php",
"text" "text"
], ],
"support": {
"email": "support@jevon.org",
"issues": "https://github.com/soundasleep/html2text/issues",
"source": "https://github.com/soundasleep/html2text/tree/master"
},
"time": "2017-04-19T22:01:50+00:00" "time": "2017-04-19T22:01:50+00:00"
}, },
{ {
@ -614,6 +680,10 @@
], ],
"description": "Library for U2F implementation", "description": "Library for U2F implementation",
"homepage": "https://developers.yubico.com/php-u2flib-server", "homepage": "https://developers.yubico.com/php-u2flib-server",
"support": {
"issues": "https://github.com/Yubico/php-u2flib-server/issues",
"source": "https://github.com/Yubico/php-u2flib-server/tree/1.0.2"
},
"time": "2018-09-07T08:16:44+00:00" "time": "2018-09-07T08:16:44+00:00"
} }
], ],
@ -625,5 +695,5 @@
"prefer-lowest": false, "prefer-lowest": false,
"platform": [], "platform": [],
"platform-dev": [], "platform-dev": [],
"plugin-api-version": "1.1.0" "plugin-api-version": "2.0.0"
} }

View File

@ -37,8 +37,8 @@ namespace Composer\Autoload;
* *
* @author Fabien Potencier <fabien@symfony.com> * @author Fabien Potencier <fabien@symfony.com>
* @author Jordi Boggiano <j.boggiano@seld.be> * @author Jordi Boggiano <j.boggiano@seld.be>
* @see http://www.php-fig.org/psr/psr-0/ * @see https://www.php-fig.org/psr/psr-0/
* @see http://www.php-fig.org/psr/psr-4/ * @see https://www.php-fig.org/psr/psr-4/
*/ */
class ClassLoader class ClassLoader
{ {
@ -60,7 +60,7 @@ class ClassLoader
public function getPrefixes() public function getPrefixes()
{ {
if (!empty($this->prefixesPsr0)) { if (!empty($this->prefixesPsr0)) {
return call_user_func_array('array_merge', $this->prefixesPsr0); return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
} }
return array(); return array();

View File

@ -0,0 +1,332 @@
<?php
namespace Composer;
use Composer\Semver\VersionParser;
class InstalledVersions
{
private static $installed = array (
'root' =>
array (
'pretty_version' => '1.0.0+no-version-set',
'version' => '1.0.0.0',
'aliases' =>
array (
),
'reference' => NULL,
'name' => '__root__',
),
'versions' =>
array (
'__root__' =>
array (
'pretty_version' => '1.0.0+no-version-set',
'version' => '1.0.0.0',
'aliases' =>
array (
),
'reference' => NULL,
),
'bshaffer/oauth2-server-php' =>
array (
'pretty_version' => 'v1.11.1',
'version' => '1.11.1.0',
'aliases' =>
array (
),
'reference' => '5a0c8000d4763b276919e2106f54eddda6bc50fa',
),
'ddeboer/imap' =>
array (
'pretty_version' => '1.11.0',
'version' => '1.11.0.0',
'aliases' =>
array (
),
'reference' => 'a089dfcb9d177f921eb5dadc8d4144a44dff22ee',
),
'exorus/php-mime-mail-parser' =>
array (
'replaced' =>
array (
0 => '*',
),
),
'matthiasmullie/minify' =>
array (
'pretty_version' => '1.3.65',
'version' => '1.3.65.0',
'aliases' =>
array (
),
'reference' => '227f19062451c55a797e0cc667ef983834e6580c',
),
'matthiasmullie/path-converter' =>
array (
'pretty_version' => '1.1.3',
'version' => '1.1.3.0',
'aliases' =>
array (
),
'reference' => 'e7d13b2c7e2f2268e1424aaed02085518afa02d9',
),
'messaged/php-mime-mail-parser' =>
array (
'replaced' =>
array (
0 => '*',
),
),
'mustangostang/spyc' =>
array (
'pretty_version' => '0.6.3',
'version' => '0.6.3.0',
'aliases' =>
array (
),
'reference' => '4627c838b16550b666d15aeae1e5289dd5b77da0',
),
'paragonie/random_compat' =>
array (
'pretty_version' => 'v9.99.100',
'version' => '9.99.100.0',
'aliases' =>
array (
),
'reference' => '996434e5492cb4c3edcb9168db6fbb1359ef965a',
),
'php-mime-mail-parser/php-mime-mail-parser' =>
array (
'pretty_version' => '5.0.5',
'version' => '5.0.5.0',
'aliases' =>
array (
),
'reference' => '27983433aabeccee832573c3c56e6a4855e57745',
),
'phpmailer/phpmailer' =>
array (
'pretty_version' => 'v6.2.0',
'version' => '6.2.0.0',
'aliases' =>
array (
),
'reference' => 'e38888a75c070304ca5514197d4847a59a5c853f',
),
'robthree/twofactorauth' =>
array (
'pretty_version' => '1.7.0',
'version' => '1.7.0.0',
'aliases' =>
array (
),
'reference' => '37983bf675c5baca09d19d6705170489d0df0002',
),
'soundasleep/html2text' =>
array (
'pretty_version' => '0.5.0',
'version' => '0.5.0.0',
'aliases' =>
array (
),
'reference' => 'cdb89f6ffa2c4cc78f8ed9ea6ee0594a9133ccad',
),
'yubico/u2flib-server' =>
array (
'pretty_version' => '1.0.2',
'version' => '1.0.2.0',
'aliases' =>
array (
),
'reference' => '55d813acf68212ad2cadecde07551600d6971939',
),
),
);
public static function getInstalledPackages()
{
return array_keys(self::$installed['versions']);
}
public static function isInstalled($packageName)
{
return isset(self::$installed['versions'][$packageName]);
}
public static function satisfies(VersionParser $parser, $packageName, $constraint)
{
$constraint = $parser->parseConstraints($constraint);
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
return $provided->matches($constraint);
}
public static function getVersionRanges($packageName)
{
if (!isset(self::$installed['versions'][$packageName])) {
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
$ranges = array();
if (isset(self::$installed['versions'][$packageName]['pretty_version'])) {
$ranges[] = self::$installed['versions'][$packageName]['pretty_version'];
}
if (array_key_exists('aliases', self::$installed['versions'][$packageName])) {
$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['aliases']);
}
if (array_key_exists('replaced', self::$installed['versions'][$packageName])) {
$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['replaced']);
}
if (array_key_exists('provided', self::$installed['versions'][$packageName])) {
$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['provided']);
}
return implode(' || ', $ranges);
}
public static function getVersion($packageName)
{
if (!isset(self::$installed['versions'][$packageName])) {
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
if (!isset(self::$installed['versions'][$packageName]['version'])) {
return null;
}
return self::$installed['versions'][$packageName]['version'];
}
public static function getPrettyVersion($packageName)
{
if (!isset(self::$installed['versions'][$packageName])) {
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
if (!isset(self::$installed['versions'][$packageName]['pretty_version'])) {
return null;
}
return self::$installed['versions'][$packageName]['pretty_version'];
}
public static function getReference($packageName)
{
if (!isset(self::$installed['versions'][$packageName])) {
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
if (!isset(self::$installed['versions'][$packageName]['reference'])) {
return null;
}
return self::$installed['versions'][$packageName]['reference'];
}
public static function getRootPackage()
{
return self::$installed['root'];
}
public static function getRawData()
{
return self::$installed;
}
public static function reload($data)
{
self::$installed = $data;
}
}

View File

@ -6,6 +6,7 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir); $baseDir = dirname($vendorDir);
return array( return array(
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
'u2flib_server\\Error' => $vendorDir . '/yubico/u2flib-server/src/u2flib_server/U2F.php', 'u2flib_server\\Error' => $vendorDir . '/yubico/u2flib-server/src/u2flib_server/U2F.php',
'u2flib_server\\RegisterRequest' => $vendorDir . '/yubico/u2flib-server/src/u2flib_server/U2F.php', 'u2flib_server\\RegisterRequest' => $vendorDir . '/yubico/u2flib-server/src/u2flib_server/U2F.php',
'u2flib_server\\Registration' => $vendorDir . '/yubico/u2flib-server/src/u2flib_server/U2F.php', 'u2flib_server\\Registration' => $vendorDir . '/yubico/u2flib-server/src/u2flib_server/U2F.php',

View File

@ -22,13 +22,15 @@ class ComposerAutoloaderInit873464e4bd965a3168f133248b1b218b
return self::$loader; return self::$loader;
} }
require __DIR__ . '/platform_check.php';
spl_autoload_register(array('ComposerAutoloaderInit873464e4bd965a3168f133248b1b218b', 'loadClassLoader'), true, true); spl_autoload_register(array('ComposerAutoloaderInit873464e4bd965a3168f133248b1b218b', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(); self::$loader = $loader = new \Composer\Autoload\ClassLoader();
spl_autoload_unregister(array('ComposerAutoloaderInit873464e4bd965a3168f133248b1b218b', 'loadClassLoader')); spl_autoload_unregister(array('ComposerAutoloaderInit873464e4bd965a3168f133248b1b218b', 'loadClassLoader'));
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
if ($useStaticLoader) { if ($useStaticLoader) {
require_once __DIR__ . '/autoload_static.php'; require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInit873464e4bd965a3168f133248b1b218b::getInitializer($loader)); call_user_func(\Composer\Autoload\ComposerStaticInit873464e4bd965a3168f133248b1b218b::getInitializer($loader));
} else { } else {

View File

@ -77,6 +77,7 @@ class ComposerStaticInit873464e4bd965a3168f133248b1b218b
); );
public static $classMap = array ( public static $classMap = array (
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
'u2flib_server\\Error' => __DIR__ . '/..' . '/yubico/u2flib-server/src/u2flib_server/U2F.php', 'u2flib_server\\Error' => __DIR__ . '/..' . '/yubico/u2flib-server/src/u2flib_server/U2F.php',
'u2flib_server\\RegisterRequest' => __DIR__ . '/..' . '/yubico/u2flib-server/src/u2flib_server/U2F.php', 'u2flib_server\\RegisterRequest' => __DIR__ . '/..' . '/yubico/u2flib-server/src/u2flib_server/U2F.php',
'u2flib_server\\Registration' => __DIR__ . '/..' . '/yubico/u2flib-server/src/u2flib_server/U2F.php', 'u2flib_server\\Registration' => __DIR__ . '/..' . '/yubico/u2flib-server/src/u2flib_server/U2F.php',

View File

@ -1,4 +1,5 @@
[ {
"packages": [
{ {
"name": "bshaffer/oauth2-server-php", "name": "bshaffer/oauth2-server-php",
"version": "v1.11.1", "version": "v1.11.1",
@ -57,38 +58,39 @@
"auth", "auth",
"oauth", "oauth",
"oauth2" "oauth2"
] ],
"install-path": "../bshaffer/oauth2-server-php"
}, },
{ {
"name": "ddeboer/imap", "name": "ddeboer/imap",
"version": "1.10.0", "version": "1.11.0",
"version_normalized": "1.10.0.0", "version_normalized": "1.11.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/ddeboer/imap.git", "url": "https://github.com/ddeboer/imap.git",
"reference": "fc09dbf6fb9ba7317a95c719e45893efc4fe6bde" "reference": "a089dfcb9d177f921eb5dadc8d4144a44dff22ee"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/ddeboer/imap/zipball/fc09dbf6fb9ba7317a95c719e45893efc4fe6bde", "url": "https://api.github.com/repos/ddeboer/imap/zipball/a089dfcb9d177f921eb5dadc8d4144a44dff22ee",
"reference": "fc09dbf6fb9ba7317a95c719e45893efc4fe6bde", "reference": "a089dfcb9d177f921eb5dadc8d4144a44dff22ee",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-iconv": "*", "ext-iconv": "*",
"ext-imap": "*", "ext-imap": "*",
"ext-mbstring": "*", "ext-mbstring": "*",
"php": "^7.2" "php": "^7.3 || ^8.0"
}, },
"require-dev": { "require-dev": {
"friendsofphp/php-cs-fixer": "^2.16", "friendsofphp/php-cs-fixer": "^2.16.7",
"phpstan/phpstan": "^0.12", "laminas/laminas-mail": "^2.12.3",
"phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan": "^0.12.57",
"phpstan/phpstan-strict-rules": "^0.12", "phpstan/phpstan-phpunit": "^0.12.16",
"phpunit/phpunit": "^8.5", "phpstan/phpstan-strict-rules": "^0.12.5",
"zendframework/zend-mail": "^2.10" "phpunit/phpunit": "^9.4.3"
}, },
"time": "2020-01-24T08:15:24+00:00", "time": "2020-11-30T14:52:49+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@ -119,21 +121,36 @@
"email", "email",
"imap", "imap",
"mail" "mail"
] ],
"support": {
"issues": "https://github.com/ddeboer/imap/issues",
"source": "https://github.com/ddeboer/imap/tree/1.11.0"
},
"funding": [
{
"url": "https://github.com/Slamdunk",
"type": "github"
},
{
"url": "https://github.com/ddeboer",
"type": "github"
}
],
"install-path": "../ddeboer/imap"
}, },
{ {
"name": "matthiasmullie/minify", "name": "matthiasmullie/minify",
"version": "1.3.63", "version": "1.3.65",
"version_normalized": "1.3.63.0", "version_normalized": "1.3.65.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/matthiasmullie/minify.git", "url": "https://github.com/matthiasmullie/minify.git",
"reference": "9ba1b459828adc13430f4dd6c49dae4950dc4117" "reference": "227f19062451c55a797e0cc667ef983834e6580c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/matthiasmullie/minify/zipball/9ba1b459828adc13430f4dd6c49dae4950dc4117", "url": "https://api.github.com/repos/matthiasmullie/minify/zipball/227f19062451c55a797e0cc667ef983834e6580c",
"reference": "9ba1b459828adc13430f4dd6c49dae4950dc4117", "reference": "227f19062451c55a797e0cc667ef983834e6580c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -149,7 +166,7 @@
"suggest": { "suggest": {
"psr/cache-implementation": "Cache implementation to use with Minify::cache" "psr/cache-implementation": "Cache implementation to use with Minify::cache"
}, },
"time": "2020-01-21T20:21:08+00:00", "time": "2020-12-27T21:43:29+00:00",
"bin": [ "bin": [
"bin/minifycss", "bin/minifycss",
"bin/minifyjs" "bin/minifyjs"
@ -181,7 +198,26 @@
"javascript", "javascript",
"minifier", "minifier",
"minify" "minify"
] ],
"support": {
"issues": "https://github.com/matthiasmullie/minify/issues",
"source": "https://github.com/matthiasmullie/minify/tree/1.3.65"
},
"funding": [
{
"url": "https://github.com/[user1",
"type": "github"
},
{
"url": "https://github.com/matthiasmullie] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g.",
"type": "github"
},
{
"url": "https://github.com/user2",
"type": "github"
}
],
"install-path": "../matthiasmullie/minify"
}, },
{ {
"name": "matthiasmullie/path-converter", "name": "matthiasmullie/path-converter",
@ -232,7 +268,8 @@
"path", "path",
"paths", "paths",
"relative" "relative"
] ],
"install-path": "../matthiasmullie/path-converter"
}, },
{ {
"name": "mustangostang/spyc", "name": "mustangostang/spyc",
@ -284,25 +321,26 @@
"spyc", "spyc",
"yaml", "yaml",
"yml" "yml"
] ],
"install-path": "../mustangostang/spyc"
}, },
{ {
"name": "paragonie/random_compat", "name": "paragonie/random_compat",
"version": "v9.99.99", "version": "v9.99.100",
"version_normalized": "9.99.99.0", "version_normalized": "9.99.100.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/paragonie/random_compat.git", "url": "https://github.com/paragonie/random_compat.git",
"reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
"reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7" "php": ">= 7"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "4.*|5.*", "phpunit/phpunit": "4.*|5.*",
@ -311,7 +349,7 @@
"suggest": { "suggest": {
"ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
}, },
"time": "2018-07-02T15:55:56+00:00", "time": "2020-10-15T08:29:30+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"notification-url": "https://packagist.org/downloads/", "notification-url": "https://packagist.org/downloads/",
@ -331,7 +369,13 @@
"polyfill", "polyfill",
"pseudorandom", "pseudorandom",
"random" "random"
] ],
"support": {
"email": "info@paragonie.com",
"issues": "https://github.com/paragonie/random_compat/issues",
"source": "https://github.com/paragonie/random_compat"
},
"install-path": "../paragonie/random_compat"
}, },
{ {
"name": "php-mime-mail-parser/php-mime-mail-parser", "name": "php-mime-mail-parser/php-mime-mail-parser",
@ -415,32 +459,37 @@
"mime", "mime",
"parser", "parser",
"php" "php"
] ],
"install-path": "../php-mime-mail-parser/php-mime-mail-parser"
}, },
{ {
"name": "phpmailer/phpmailer", "name": "phpmailer/phpmailer",
"version": "v6.1.6", "version": "v6.2.0",
"version_normalized": "6.1.6.0", "version_normalized": "6.2.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PHPMailer/PHPMailer.git", "url": "https://github.com/PHPMailer/PHPMailer.git",
"reference": "c2796cb1cb99d7717290b48c4e6f32cb6c60b7b3" "reference": "e38888a75c070304ca5514197d4847a59a5c853f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/c2796cb1cb99d7717290b48c4e6f32cb6c60b7b3", "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/e38888a75c070304ca5514197d4847a59a5c853f",
"reference": "c2796cb1cb99d7717290b48c4e6f32cb6c60b7b3", "reference": "e38888a75c070304ca5514197d4847a59a5c853f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-ctype": "*", "ext-ctype": "*",
"ext-filter": "*", "ext-filter": "*",
"ext-hash": "*",
"php": ">=5.5.0" "php": ">=5.5.0"
}, },
"require-dev": { "require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
"doctrine/annotations": "^1.2", "doctrine/annotations": "^1.2",
"friendsofphp/php-cs-fixer": "^2.2", "phpcompatibility/php-compatibility": "^9.3.5",
"phpunit/phpunit": "^4.8 || ^5.7" "roave/security-advisories": "dev-latest",
"squizlabs/php_codesniffer": "^3.5.6",
"yoast/phpunit-polyfills": "^0.2.0"
}, },
"suggest": { "suggest": {
"ext-mbstring": "Needed to send email in multibyte encoding charset", "ext-mbstring": "Needed to send email in multibyte encoding charset",
@ -450,7 +499,7 @@
"stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication",
"symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)"
}, },
"time": "2020-05-27T12:24:03+00:00", "time": "2020-11-25T15:24:57+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@ -480,12 +529,17 @@
} }
], ],
"description": "PHPMailer is a full-featured email creation and transfer class for PHP", "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
"support": {
"issues": "https://github.com/PHPMailer/PHPMailer/issues",
"source": "https://github.com/PHPMailer/PHPMailer/tree/v6.2.0"
},
"funding": [ "funding": [
{ {
"url": "https://github.com/synchro", "url": "https://github.com/Synchro",
"type": "github" "type": "github"
} }
] ],
"install-path": "../phpmailer/phpmailer"
}, },
{ {
"name": "robthree/twofactorauth", "name": "robthree/twofactorauth",
@ -538,7 +592,8 @@
"authy", "authy",
"php", "php",
"tfa" "tfa"
] ],
"install-path": "../robthree/twofactorauth"
}, },
{ {
"name": "soundasleep/html2text", "name": "soundasleep/html2text",
@ -590,7 +645,8 @@
"html", "html",
"php", "php",
"text" "text"
] ],
"install-path": "../soundasleep/html2text"
}, },
{ {
"name": "yubico/u2flib-server", "name": "yubico/u2flib-server",
@ -629,6 +685,10 @@
"BSD-2-Clause" "BSD-2-Clause"
], ],
"description": "Library for U2F implementation", "description": "Library for U2F implementation",
"homepage": "https://developers.yubico.com/php-u2flib-server" "homepage": "https://developers.yubico.com/php-u2flib-server",
"install-path": "../yubico/u2flib-server"
}
],
"dev": true,
"dev-package-names": []
} }
]

View File

@ -0,0 +1,137 @@
<?php return array (
'root' =>
array (
'pretty_version' => '1.0.0+no-version-set',
'version' => '1.0.0.0',
'aliases' =>
array (
),
'reference' => NULL,
'name' => '__root__',
),
'versions' =>
array (
'__root__' =>
array (
'pretty_version' => '1.0.0+no-version-set',
'version' => '1.0.0.0',
'aliases' =>
array (
),
'reference' => NULL,
),
'bshaffer/oauth2-server-php' =>
array (
'pretty_version' => 'v1.11.1',
'version' => '1.11.1.0',
'aliases' =>
array (
),
'reference' => '5a0c8000d4763b276919e2106f54eddda6bc50fa',
),
'ddeboer/imap' =>
array (
'pretty_version' => '1.11.0',
'version' => '1.11.0.0',
'aliases' =>
array (
),
'reference' => 'a089dfcb9d177f921eb5dadc8d4144a44dff22ee',
),
'exorus/php-mime-mail-parser' =>
array (
'replaced' =>
array (
0 => '*',
),
),
'matthiasmullie/minify' =>
array (
'pretty_version' => '1.3.65',
'version' => '1.3.65.0',
'aliases' =>
array (
),
'reference' => '227f19062451c55a797e0cc667ef983834e6580c',
),
'matthiasmullie/path-converter' =>
array (
'pretty_version' => '1.1.3',
'version' => '1.1.3.0',
'aliases' =>
array (
),
'reference' => 'e7d13b2c7e2f2268e1424aaed02085518afa02d9',
),
'messaged/php-mime-mail-parser' =>
array (
'replaced' =>
array (
0 => '*',
),
),
'mustangostang/spyc' =>
array (
'pretty_version' => '0.6.3',
'version' => '0.6.3.0',
'aliases' =>
array (
),
'reference' => '4627c838b16550b666d15aeae1e5289dd5b77da0',
),
'paragonie/random_compat' =>
array (
'pretty_version' => 'v9.99.100',
'version' => '9.99.100.0',
'aliases' =>
array (
),
'reference' => '996434e5492cb4c3edcb9168db6fbb1359ef965a',
),
'php-mime-mail-parser/php-mime-mail-parser' =>
array (
'pretty_version' => '5.0.5',
'version' => '5.0.5.0',
'aliases' =>
array (
),
'reference' => '27983433aabeccee832573c3c56e6a4855e57745',
),
'phpmailer/phpmailer' =>
array (
'pretty_version' => 'v6.2.0',
'version' => '6.2.0.0',
'aliases' =>
array (
),
'reference' => 'e38888a75c070304ca5514197d4847a59a5c853f',
),
'robthree/twofactorauth' =>
array (
'pretty_version' => '1.7.0',
'version' => '1.7.0.0',
'aliases' =>
array (
),
'reference' => '37983bf675c5baca09d19d6705170489d0df0002',
),
'soundasleep/html2text' =>
array (
'pretty_version' => '0.5.0',
'version' => '0.5.0.0',
'aliases' =>
array (
),
'reference' => 'cdb89f6ffa2c4cc78f8ed9ea6ee0594a9133ccad',
),
'yubico/u2flib-server' =>
array (
'pretty_version' => '1.0.2',
'version' => '1.0.2.0',
'aliases' =>
array (
),
'reference' => '55d813acf68212ad2cadecde07551600d6971939',
),
),
);

View File

@ -0,0 +1,26 @@
<?php
// platform_check.php @generated by Composer
$issues = array();
if (!(PHP_VERSION_ID >= 70300)) {
$issues[] = 'Your Composer dependencies require a PHP version ">= 7.3.0". You are running ' . PHP_VERSION . '.';
}
if ($issues) {
if (!headers_sent()) {
header('HTTP/1.1 500 Internal Server Error');
}
if (!ini_get('display_errors')) {
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
} elseif (!headers_sent()) {
echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
}
}
trigger_error(
'Composer detected issues in your platform: ' . implode(' ', $issues),
E_USER_ERROR
);
}

View File

@ -1,5 +1,46 @@
# Changelog # Changelog
## [1.11.0](https://github.com/ddeboer/imap/tree/1.11.0) (2020-11-30)
[Full Changelog](https://github.com/ddeboer/imap/compare/1.10.1...1.11.0)
**Implemented enhancements:**
- PHP 8 Compatibility [\#481](https://github.com/ddeboer/imap/issues/481)
- \[GA\] PHP 8 compatibility fix [\#483](https://github.com/ddeboer/imap/pull/483) ([Slamdunk](https://github.com/Slamdunk))
- Support PHP 8.0, require PHP 7.3 [\#482](https://github.com/ddeboer/imap/pull/482) ([Slamdunk](https://github.com/Slamdunk))
**Fixed bugs:**
- Fix: Outlook date format [\#480](https://github.com/ddeboer/imap/pull/480) ([gajosadrian](https://github.com/gajosadrian))
**Closed issues:**
- Closing Connection [\#479](https://github.com/ddeboer/imap/issues/479)
- Problem with charset of message part / DataPartInfo [\#475](https://github.com/ddeboer/imap/issues/475)
- Unsupported charset "X-UNKNOWN" [\#425](https://github.com/ddeboer/imap/issues/425)
## [1.10.1](https://github.com/ddeboer/imap/tree/1.10.1) (2020-08-26)
[Full Changelog](https://github.com/ddeboer/imap/compare/1.10.0...1.10.1)
**Fixed bugs:**
- getThread and getMessageSequence not using with the same id [\#469](https://github.com/ddeboer/imap/issues/469)
- imap\_thread: use absolude ids [\#474](https://github.com/ddeboer/imap/pull/474) ([Slamdunk](https://github.com/Slamdunk))
**Closed issues:**
- How to get a message by Message-ID [\#472](https://github.com/ddeboer/imap/issues/472)
- Mail with e-sign [\#467](https://github.com/ddeboer/imap/issues/467)
- Duplicate method definition in MessageInterface [\#455](https://github.com/ddeboer/imap/issues/455)
- Missed errors in search method [\#444](https://github.com/ddeboer/imap/issues/444)
**Merged pull requests:**
- Subtype not always present [\#473](https://github.com/ddeboer/imap/pull/473) ([Piskvor](https://github.com/Piskvor))
- Improved error handling for message search method [\#445](https://github.com/ddeboer/imap/pull/445) ([ikarol](https://github.com/ikarol))
## [1.10.0](https://github.com/ddeboer/imap/tree/1.10.0) (2020-01-24) ## [1.10.0](https://github.com/ddeboer/imap/tree/1.10.0) (2020-01-24)
[Full Changelog](https://github.com/ddeboer/imap/compare/1.9.0...1.10.0) [Full Changelog](https://github.com/ddeboer/imap/compare/1.9.0...1.10.0)

View File

@ -1,12 +1,11 @@
# IMAP library # IMAP library
[![Build Status](https://travis-ci.org/ddeboer/imap.svg?branch=master)](https://travis-ci.org/ddeboer/imap) [![Latest Stable Version](https://img.shields.io/packagist/v/ddeboer/imap.svg)](https://packagist.org/packages/ddeboer/imap)
[![Code Coverage](https://scrutinizer-ci.com/g/ddeboer/imap/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/ddeboer/imap/?branch=master) [![Downloads](https://img.shields.io/packagist/dt/ddeboer/imap.svg)](https://packagist.org/packages/ddeboer/imap)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/ddeboer/imap/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/ddeboer/imap/?branch=master) [![Integrate](https://github.com/ddeboer/imap/workflows/Integrate/badge.svg?branch=master)](https://github.com/ddeboer/imap/actions)
[![Latest Stable Version](https://poser.pugx.org/ddeboer/imap/v/stable.svg)](https://packagist.org/packages/ddeboer/imap) [![Code Coverage](https://codecov.io/gh/ddeboer/imap/coverage.svg?branch=master)](https://codecov.io/gh/ddeboer/imap?branch=master)
[![Total Downloads](https://poser.pugx.org/ddeboer/imap/downloads.png)](https://packagist.org/packages/ddeboer/imap)
A PHP 7.2+ library to read and process e-mails over IMAP. A PHP 7.3+ library to read and process e-mails over IMAP.
This library requires [IMAP](https://secure.php.net/manual/en/book.imap.php), This library requires [IMAP](https://secure.php.net/manual/en/book.imap.php),
[iconv](https://secure.php.net/manual/en/book.iconv.php) and [iconv](https://secure.php.net/manual/en/book.iconv.php) and

View File

@ -22,18 +22,23 @@
} }
], ],
"require": { "require": {
"php": "^7.2", "php": "^7.3 || ^8.0",
"ext-iconv": "*", "ext-iconv": "*",
"ext-imap": "*", "ext-imap": "*",
"ext-mbstring": "*" "ext-mbstring": "*"
}, },
"require-dev": { "require-dev": {
"friendsofphp/php-cs-fixer": "^2.16", "friendsofphp/php-cs-fixer": "^2.16.7",
"phpstan/phpstan": "^0.12", "laminas/laminas-mail": "^2.12.3",
"phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan": "^0.12.57",
"phpstan/phpstan-strict-rules": "^0.12", "phpstan/phpstan-phpunit": "^0.12.16",
"phpunit/phpunit": "^8.5", "phpstan/phpstan-strict-rules": "^0.12.5",
"zendframework/zend-mail": "^2.10" "phpunit/phpunit": "^9.4.3"
},
"config": {
"platform": {
"php": "7.3"
}
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

View File

@ -228,6 +228,7 @@ final class Connection implements ConnectionInterface
foreach ($mailboxesInfo as $mailboxInfo) { foreach ($mailboxesInfo as $mailboxInfo) {
$name = \mb_convert_encoding(\str_replace($this->server, '', $mailboxInfo->name), 'UTF-8', 'UTF7-IMAP'); $name = \mb_convert_encoding(\str_replace($this->server, '', $mailboxInfo->name), 'UTF-8', 'UTF7-IMAP');
\assert(\is_string($name));
$this->mailboxNames[$name] = $mailboxInfo; $this->mailboxNames[$name] = $mailboxInfo;
} }
} }

View File

@ -154,6 +154,10 @@ final class Mailbox implements MailboxInterface
} }
$query = $search->toString(); $query = $search->toString();
if (\PHP_VERSION_ID < 80000) {
$descending = (int) $descending;
}
// We need to clear the stack to know whether imap_last_error() // We need to clear the stack to know whether imap_last_error()
// is related to this imap_search // is related to this imap_search
\imap_errors(); \imap_errors();
@ -162,7 +166,7 @@ final class Mailbox implements MailboxInterface
$params = [ $params = [
$this->resource->getStream(), $this->resource->getStream(),
$sortCriteria, $sortCriteria,
$descending ? 1 : 0, $descending,
\SE_UID, \SE_UID,
$query, $query,
]; ];
@ -181,11 +185,13 @@ final class Mailbox implements MailboxInterface
} }
$messageNumbers = \imap_search(...$params); $messageNumbers = \imap_search(...$params);
} }
if (false === $messageNumbers) {
if (false !== \imap_last_error()) { if (false !== \imap_last_error()) {
throw new InvalidSearchCriteriaException(\sprintf('Invalid search criteria [%s]', $query)); // this way all errors occurred during search will be reported
throw new InvalidSearchCriteriaException(
\sprintf('Invalid search criteria [%s]', $query)
);
} }
if (false === $messageNumbers) {
// imap_search can also return false // imap_search can also return false
$messageNumbers = []; $messageNumbers = [];
} }
@ -203,13 +209,14 @@ final class Mailbox implements MailboxInterface
\imap_errors(); \imap_errors();
$overview = \imap_fetch_overview($this->resource->getStream(), $sequence, \FT_UID); $overview = \imap_fetch_overview($this->resource->getStream(), $sequence, \FT_UID);
if (false !== \imap_last_error()) {
throw new InvalidSearchCriteriaException(
\sprintf('Invalid sequence [%s]', $sequence)
);
}
if (\is_array($overview) && [] !== $overview) { if (\is_array($overview) && [] !== $overview) {
$messageNumbers = \array_column($overview, 'uid'); $messageNumbers = \array_column($overview, 'uid');
} else { } else {
if (false !== \imap_last_error()) {
throw new InvalidSearchCriteriaException(\sprintf('Invalid sequence [%s]', $sequence));
}
$messageNumbers = []; $messageNumbers = [];
} }
@ -264,7 +271,7 @@ final class Mailbox implements MailboxInterface
}); });
/** @var array|false $tree */ /** @var array|false $tree */
$tree = \imap_thread($this->resource->getStream()); $tree = \imap_thread($this->resource->getStream(), \SE_UID);
\restore_error_handler(); \restore_error_handler();

View File

@ -109,7 +109,15 @@ final class Message extends Message\AbstractMessage implements MessageInterface
} }
$this->messageNumberVerified = true; $this->messageNumberVerified = true;
$msgno = null;
\set_error_handler(static function (): bool {
return true;
});
$msgno = \imap_msgno($this->resource->getStream(), $messageNumber); $msgno = \imap_msgno($this->resource->getStream(), $messageNumber);
\restore_error_handler();
if (\is_numeric($msgno) && $msgno > 0) { if (\is_numeric($msgno) && $msgno > 0) {
$this->imapMsgNo = $msgno; $this->imapMsgNo = $msgno;
@ -306,7 +314,7 @@ final class Message extends Message\AbstractMessage implements MessageInterface
// 'deleted' header changed, force to reload headers, would be better to set deleted flag to true on header // 'deleted' header changed, force to reload headers, would be better to set deleted flag to true on header
$this->clearHeaders(); $this->clearHeaders();
if (!\imap_delete($this->resource->getStream(), $this->getNumber(), \FT_UID)) { if (!\imap_delete($this->resource->getStream(), (string) $this->getNumber(), \FT_UID)) {
throw new MessageDeleteException(\sprintf('Message "%s" cannot be deleted', $this->getNumber())); throw new MessageDeleteException(\sprintf('Message "%s" cannot be deleted', $this->getNumber()));
} }
} }
@ -320,7 +328,7 @@ final class Message extends Message\AbstractMessage implements MessageInterface
{ {
// 'deleted' header changed, force to reload headers, would be better to set deleted flag to false on header // 'deleted' header changed, force to reload headers, would be better to set deleted flag to false on header
$this->clearHeaders(); $this->clearHeaders();
if (!\imap_undelete($this->resource->getStream(), $this->getNumber(), \FT_UID)) { if (!\imap_undelete($this->resource->getStream(), (string) $this->getNumber(), \FT_UID)) {
throw new MessageUndeleteException(\sprintf('Message "%s" cannot be undeleted', $this->getNumber())); throw new MessageUndeleteException(\sprintf('Message "%s" cannot be undeleted', $this->getNumber()));
} }
} }

View File

@ -113,6 +113,7 @@ abstract class AbstractMessage extends AbstractPart
$alteredValue = \str_replace(',', '', $alteredValue); $alteredValue = \str_replace(',', '', $alteredValue);
$alteredValue = (string) \preg_replace('/^[a-zA-Z]+ ?/', '', $alteredValue); $alteredValue = (string) \preg_replace('/^[a-zA-Z]+ ?/', '', $alteredValue);
$alteredValue = (string) \preg_replace('/\(.*\)/', '', $alteredValue); $alteredValue = (string) \preg_replace('/\(.*\)/', '', $alteredValue);
$alteredValue = (string) \preg_replace('/\<.*\>/', '', $alteredValue);
$alteredValue = (string) \preg_replace('/\bUT\b/', 'UTC', $alteredValue); $alteredValue = (string) \preg_replace('/\bUT\b/', 'UTC', $alteredValue);
if (0 === \preg_match('/\d\d:\d\d:\d\d.* [\+\-]\d\d:?\d\d/', $alteredValue)) { if (0 === \preg_match('/\d\d:\d\d:\d\d.* [\+\-]\d\d:?\d\d/', $alteredValue)) {
$alteredValue .= ' +0000'; $alteredValue .= ' +0000';

View File

@ -471,9 +471,11 @@ abstract class AbstractPart implements PartInterface
$this->type = self::$typesMap[$this->structure->type] ?? self::TYPE_UNKNOWN; $this->type = self::$typesMap[$this->structure->type] ?? self::TYPE_UNKNOWN;
// In our context, \ENCOTHER is as useful as an uknown encoding // In our context, \ENCOTHER is as useful as an unknown encoding
$this->encoding = self::$encodingsMap[$this->structure->encoding] ?? self::ENCODING_UNKNOWN; $this->encoding = self::$encodingsMap[$this->structure->encoding] ?? self::ENCODING_UNKNOWN;
if (isset($this->structure->subtype)) {
$this->subtype = $this->structure->subtype; $this->subtype = $this->structure->subtype;
}
if (isset($this->structure->bytes)) { if (isset($this->structure->bytes)) {
$this->bytes = $this->structure->bytes; $this->bytes = $this->structure->bytes;

View File

@ -310,7 +310,13 @@ final class Transcoder
return true; return true;
}); });
$decodedText = '';
try {
$decodedText = \mb_convert_encoding($text, 'UTF-8', $fromCharset); $decodedText = \mb_convert_encoding($text, 'UTF-8', $fromCharset);
} catch (\Error $error) {
$errorMessage = $error->getMessage();
}
\restore_error_handler(); \restore_error_handler();

View File

@ -0,0 +1,12 @@
# These are supported funding model platforms
github: [matthiasmullie] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

View File

@ -6,7 +6,7 @@ WORKDIR /var/www
RUN apt-get update RUN apt-get update
RUN apt-get install -y zip unzip zlib1g-dev RUN apt-get install -y zip unzip zlib1g-dev
RUN docker-php-ext-install zip RUN if [[ `php-config --vernum` -ge 73000 ]]; then docker-php-ext-install zip; fi
RUN docker-php-ext-install pcntl RUN docker-php-ext-install pcntl
RUN curl -sS https://getcomposer.org/installer | php RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer RUN mv composer.phar /usr/local/bin/composer

View File

@ -9,6 +9,21 @@ services:
- ./data:/var/www/data - ./data:/var/www/data
- ./tests:/var/www/tests - ./tests:/var/www/tests
- ./phpunit.xml.dist:/var/www/phpunit.xml.dist - ./phpunit.xml.dist:/var/www/phpunit.xml.dist
'8.0':
extends: php
build:
args:
version: 8.0-cli
'7.4':
extends: php
build:
args:
version: 7.4-cli
'7.3':
extends: php
build:
args:
version: 7.3-cli
'7.2': '7.2':
extends: php extends: php
build: build:

View File

@ -216,7 +216,7 @@ class CSS extends Minify
// grab referenced file & minify it (which may include importing // grab referenced file & minify it (which may include importing
// yet other @import statements recursively) // yet other @import statements recursively)
$minifier = new static($importPath); $minifier = new self($importPath);
$minifier->setMaxImportSize($this->maxImportSize); $minifier->setMaxImportSize($this->maxImportSize);
$minifier->setImportExtensions($this->importExtensions); $minifier->setImportExtensions($this->importExtensions);
$importContent = $minifier->execute($source, $parents); $importContent = $minifier->execute($source, $parents);
@ -307,7 +307,8 @@ class CSS extends Minify
*/ */
$this->extractStrings(); $this->extractStrings();
$this->stripComments(); $this->stripComments();
$this->extractCalcs(); $this->extractMath();
$this->extractCustomProperties();
$css = $this->replace($css); $css = $this->replace($css);
$css = $this->stripWhitespace($css); $css = $this->stripWhitespace($css);
@ -678,19 +679,29 @@ class CSS extends Minify
} }
/** /**
* Replace all `calc()` occurrences. * Replace all occurrences of functions that may contain math, where
* whitespace around operators needs to be preserved (e.g. calc, clamp)
*/ */
protected function extractCalcs() protected function extractMath()
{ {
$functions = array('calc', 'clamp', 'min', 'max');
$pattern = '/('. implode('|', $functions) .')(\(.+?)(?=$|;|})/m';
// PHP only supports $this inside anonymous functions since 5.4 // PHP only supports $this inside anonymous functions since 5.4
$minifier = $this; $minifier = $this;
$callback = function ($match) use ($minifier) { $callback = function ($match) use ($minifier, $pattern, &$callback) {
$length = strlen($match[1]); $function = $match[1];
$length = strlen($match[2]);
$expr = ''; $expr = '';
$opened = 0; $opened = 0;
// the regular expression for extracting math has 1 significant problem:
// it can't determine the correct closing parenthesis...
// instead, it'll match a larger portion of code to where it's certain that
// the calc() musts have ended, and we'll figure out which is the correct
// closing parenthesis here, by counting how many have opened
for ($i = 0; $i < $length; $i++) { for ($i = 0; $i < $length; $i++) {
$char = $match[1][$i]; $char = $match[2][$i];
$expr .= $char; $expr .= $char;
if ($char === '(') { if ($char === '(') {
$opened++; $opened++;
@ -698,18 +709,41 @@ class CSS extends Minify
break; break;
} }
} }
$rest = str_replace($expr, '', $match[1]);
$expr = trim(substr($expr, 1, -1));
// now that we've figured out where the calc() starts and ends, extract it
$count = count($minifier->extracted); $count = count($minifier->extracted);
$placeholder = 'calc('.$count.')'; $placeholder = 'math('.$count.')';
$minifier->extracted[$placeholder] = 'calc('.$expr.')'; $minifier->extracted[$placeholder] = $function.'('.trim(substr($expr, 1, -1)).')';
// and since we've captured more code than required, we may have some leftover
// calc() in here too - go recursive on the remaining but of code to go figure
// that out and extract what is needed
$rest = str_replace($function.$expr, '', $match[0]);
$rest = preg_replace_callback($pattern, $callback, $rest);
return $placeholder.$rest; return $placeholder.$rest;
}; };
$this->registerPattern('/calc(\(.+?)(?=$|;|}|calc\()/', $callback); $this->registerPattern($pattern, $callback);
$this->registerPattern('/calc(\(.+?)(?=$|;|}|calc\()/m', $callback); }
/**
* Replace custom properties, whose values may be used in scenarios where
* we wouldn't want them to be minified (e.g. inside calc)
*/
protected function extractCustomProperties()
{
// PHP only supports $this inside anonymous functions since 5.4
$minifier = $this;
$this->registerPattern(
'/(?<=^|[;}])(--[^:;{}"\'\s]+)\s*:([^;{}]+)/m',
function ($match) use ($minifier) {
$placeholder = '--custom-'. count($minifier->extracted) . ':0';
$minifier->extracted[$placeholder] = $match[1] .':'. trim($match[2]);
return $placeholder;
}
);
} }
/** /**

View File

@ -22,7 +22,7 @@
"source": "https://github.com/paragonie/random_compat" "source": "https://github.com/paragonie/random_compat"
}, },
"require": { "require": {
"php": "^7" "php": ">= 7"
}, },
"require-dev": { "require-dev": {
"vimeo/psalm": "^1", "vimeo/psalm": "^1",

View File

@ -167,15 +167,9 @@ Build status: [![Build Status](https://travis-ci.org/PHPMailer/PHPMailer.svg)](h
If this isn't passing, is there something you can do to help? If this isn't passing, is there something you can do to help?
## Security ## Security
Please disclose any vulnerabilities found responsibly - report any security problems found to the maintainers privately. Please disclose any vulnerabilities found responsibly report security issues to the maintainers privately.
PHPMailer versions prior to 5.2.22 (released January 9th 2017) have a local file disclosure vulnerability, [CVE-2017-5223](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2017-5223). If content passed into `msgHTML()` is sourced from unfiltered user input, relative paths can map to absolute local file paths and added as attachments. Also note that `addAttachment` (just like `file_get_contents`, `passthru`, `unlink`, etc) should not be passed user-sourced params either! Reported by Yongxiang Li of Asiasecurity. See [SECURITY](https://github.com/PHPMailer/PHPMailer/tree/master/SECURITY.md) for details on security issues.
PHPMailer versions prior to 5.2.20 (released December 28th 2016) are vulnerable to [CVE-2016-10045](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-10045) a remote code execution vulnerability, responsibly reported by [Dawid Golunski](https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10045-Vuln-Patch-Bypass.html), and patched by Paul Buonopane (@Zenexer).
PHPMailer versions prior to 5.2.18 (released December 2016) are vulnerable to [CVE-2016-10033](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-10033) a critical remote code execution vulnerability, responsibly reported by [Dawid Golunski](http://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html).
See [SECURITY](https://github.com/PHPMailer/PHPMailer/tree/master/SECURITY.md) for more detail on security issues.
## Contributing ## Contributing
Please submit bug reports, suggestions and pull requests to the [GitHub issue tracker](https://github.com/PHPMailer/PHPMailer/issues). Please submit bug reports, suggestions and pull requests to the [GitHub issue tracker](https://github.com/PHPMailer/PHPMailer/issues).

View File

@ -1 +1 @@
6.1.6 6.2.0

View File

@ -21,26 +21,30 @@
], ],
"funding": [ "funding": [
{ {
"url": "https://github.com/synchro", "url": "https://github.com/Synchro",
"type": "github" "type": "github"
} }
], ],
"require": { "require": {
"php": ">=5.5.0", "php": ">=5.5.0",
"ext-ctype": "*", "ext-ctype": "*",
"ext-filter": "*" "ext-filter": "*",
"ext-hash": "*"
}, },
"require-dev": { "require-dev": {
"friendsofphp/php-cs-fixer": "^2.2", "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
"phpunit/phpunit": "^4.8 || ^5.7", "doctrine/annotations": "^1.2",
"doctrine/annotations": "^1.2" "phpcompatibility/php-compatibility": "^9.3.5",
"roave/security-advisories": "dev-latest",
"squizlabs/php_codesniffer": "^3.5.6",
"yoast/phpunit-polyfills": "^0.2.0"
}, },
"suggest": { "suggest": {
"psr/log": "For optional PSR-3 debug logging",
"league/oauth2-google": "Needed for Google XOAUTH2 authentication",
"hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication",
"stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication",
"ext-mbstring": "Needed to send email in multibyte encoding charset", "ext-mbstring": "Needed to send email in multibyte encoding charset",
"hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication",
"league/oauth2-google": "Needed for Google XOAUTH2 authentication",
"psr/log": "For optional PSR-3 debug logging",
"stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication",
"symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)"
}, },
"autoload": { "autoload": {

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* PHPMailer - PHP email creation and transport class. * PHPMailer - PHP email creation and transport class.
* PHP Version 5.5 * PHP Version 5.5
@ -8,7 +9,7 @@
* @author Jim Jagielski (jimjag) <jimjag@gmail.com> * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
* @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net> * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
* @author Brent R. Matzelle (original founder) * @author Brent R. Matzelle (original founder)
* @copyright 2012 - 2017 Marcus Bointon * @copyright 2012 - 2020 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski * @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost * @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
@ -16,6 +17,7 @@
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. * FITNESS FOR A PARTICULAR PURPOSE.
*/ */
/** /**
* Get an OAuth2 token from an OAuth2 provider. * Get an OAuth2 token from an OAuth2 provider.
* * Install this script on your server so that it's accessible * * Install this script on your server so that it's accessible

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Afrikaans PHPMailer language file: refer to English translation for definitive list * Afrikaans PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Arabic PHPMailer language file: refer to English translation for definitive list * Arabic PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Azerbaijani PHPMailer language file: refer to English translation for definitive list * Azerbaijani PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Bosnian PHPMailer language file: refer to English translation for definitive list * Bosnian PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Belarusian PHPMailer language file: refer to English translation for definitive list * Belarusian PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Bulgarian PHPMailer language file: refer to English translation for definitive list * Bulgarian PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Catalan PHPMailer language file: refer to English translation for definitive list * Catalan PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Chinese PHPMailer language file: refer to English translation for definitive list * Chinese PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Czech PHPMailer language file: refer to English translation for definitive list * Czech PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Danish PHPMailer language file: refer to English translation for definitive list * Danish PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* German PHPMailer language file: refer to English translation for definitive list * German PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer
@ -15,6 +16,8 @@ $PHPMAILER_LANG['file_open'] = 'Dateifehler: Konnte folgende Datei ni
$PHPMAILER_LANG['from_failed'] = 'Die folgende Absenderadresse ist nicht korrekt: '; $PHPMAILER_LANG['from_failed'] = 'Die folgende Absenderadresse ist nicht korrekt: ';
$PHPMAILER_LANG['instantiate'] = 'Mail-Funktion konnte nicht initialisiert werden.'; $PHPMAILER_LANG['instantiate'] = 'Mail-Funktion konnte nicht initialisiert werden.';
$PHPMAILER_LANG['invalid_address'] = 'Die Adresse ist ungültig: '; $PHPMAILER_LANG['invalid_address'] = 'Die Adresse ist ungültig: ';
$PHPMAILER_LANG['invalid_hostentry'] = 'Ungültiger Hosteintrag: ';
$PHPMAILER_LANG['invalid_host'] = 'Ungültiger Host: ';
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer wird nicht unterstützt.'; $PHPMAILER_LANG['mailer_not_supported'] = ' mailer wird nicht unterstützt.';
$PHPMAILER_LANG['provide_address'] = 'Bitte geben Sie mindestens eine Empfängeradresse an.'; $PHPMAILER_LANG['provide_address'] = 'Bitte geben Sie mindestens eine Empfängeradresse an.';
$PHPMAILER_LANG['recipients_failed'] = 'SMTP-Fehler: Die folgenden Empfänger sind nicht korrekt: '; $PHPMAILER_LANG['recipients_failed'] = 'SMTP-Fehler: Die folgenden Empfänger sind nicht korrekt: ';

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Greek PHPMailer language file: refer to English translation for definitive list * Greek PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Esperanto PHPMailer language file: refer to English translation for definitive list * Esperanto PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Spanish PHPMailer language file: refer to English translation for definitive list * Spanish PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Estonian PHPMailer language file: refer to English translation for definitive list * Estonian PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Persian/Farsi PHPMailer language file: refer to English translation for definitive list * Persian/Farsi PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Finnish PHPMailer language file: refer to English translation for definitive list * Finnish PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Faroese PHPMailer language file: refer to English translation for definitive list * Faroese PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* French PHPMailer language file: refer to English translation for definitive list * French PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer
@ -19,6 +20,8 @@ $PHPMAILER_LANG['file_open'] = 'Ouverture du fichier impossible: '
$PHPMAILER_LANG['from_failed'] = 'L\'adresse d\'expéditeur suivante a échoué: '; $PHPMAILER_LANG['from_failed'] = 'L\'adresse d\'expéditeur suivante a échoué: ';
$PHPMAILER_LANG['instantiate'] = 'Impossible d\'instancier la fonction mail.'; $PHPMAILER_LANG['instantiate'] = 'Impossible d\'instancier la fonction mail.';
$PHPMAILER_LANG['invalid_address'] = 'L\'adresse courriel n\'est pas valide: '; $PHPMAILER_LANG['invalid_address'] = 'L\'adresse courriel n\'est pas valide: ';
$PHPMAILER_LANG['invalid_hostentry'] = 'L\'entrée hôte n\'est pas valide: ';
$PHPMAILER_LANG['invalid_host'] = 'L\'hôte n\'est pas valide: ';
$PHPMAILER_LANG['mailer_not_supported'] = ' client de messagerie non supporté.'; $PHPMAILER_LANG['mailer_not_supported'] = ' client de messagerie non supporté.';
$PHPMAILER_LANG['provide_address'] = 'Vous devez fournir au moins une adresse de destinataire.'; $PHPMAILER_LANG['provide_address'] = 'Vous devez fournir au moins une adresse de destinataire.';
$PHPMAILER_LANG['recipients_failed'] = 'Erreur SMTP: les destinataires suivants sont en erreur: '; $PHPMAILER_LANG['recipients_failed'] = 'Erreur SMTP: les destinataires suivants sont en erreur: ';

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Galician PHPMailer language file: refer to English translation for definitive list * Galician PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Hebrew PHPMailer language file: refer to English translation for definitive list * Hebrew PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Hindi PHPMailer language file: refer to English translation for definitive list * Hindi PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Croatian PHPMailer language file: refer to English translation for definitive list * Croatian PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Hungarian PHPMailer language file: refer to English translation for definitive list * Hungarian PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Armenian PHPMailer language file: refer to English translation for definitive list * Armenian PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,9 +1,11 @@
<?php <?php
/** /**
* Indonesian PHPMailer language file: refer to English translation for definitive list * Indonesian PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer
* @author Cecep Prawiro <cecep.prawiro@gmail.com> * @author Cecep Prawiro <cecep.prawiro@gmail.com>
* @author @januridp * @author @januridp
* @author Ian Mustafa <mail@ianmustafa.com>
*/ */
$PHPMAILER_LANG['authenticate'] = 'Kesalahan SMTP: Tidak dapat mengotentikasi.'; $PHPMAILER_LANG['authenticate'] = 'Kesalahan SMTP: Tidak dapat mengotentikasi.';
@ -13,15 +15,17 @@ $PHPMAILER_LANG['empty_message'] = 'Isi pesan kosong';
$PHPMAILER_LANG['encoding'] = 'Pengkodean karakter tidak dikenali: '; $PHPMAILER_LANG['encoding'] = 'Pengkodean karakter tidak dikenali: ';
$PHPMAILER_LANG['execute'] = 'Tidak dapat menjalankan proses: '; $PHPMAILER_LANG['execute'] = 'Tidak dapat menjalankan proses: ';
$PHPMAILER_LANG['file_access'] = 'Tidak dapat mengakses berkas: '; $PHPMAILER_LANG['file_access'] = 'Tidak dapat mengakses berkas: ';
$PHPMAILER_LANG['file_open'] = 'Kesalahan File: Berkas tidak dapat dibuka : '; $PHPMAILER_LANG['file_open'] = 'Kesalahan Berkas: Berkas tidak dapat dibuka: ';
$PHPMAILER_LANG['from_failed'] = 'Alamat pengirim berikut mengakibatkan kesalahan: '; $PHPMAILER_LANG['from_failed'] = 'Alamat pengirim berikut mengakibatkan kesalahan: ';
$PHPMAILER_LANG['instantiate'] = 'Tidak dapat menginisialisasi fungsi surel'; $PHPMAILER_LANG['instantiate'] = 'Tidak dapat menginisialisasi fungsi surel.';
$PHPMAILER_LANG['invalid_address'] = 'Gagal terkirim, alamat surel tidak benar : '; $PHPMAILER_LANG['invalid_address'] = 'Gagal terkirim, alamat surel tidak sesuai: ';
$PHPMAILER_LANG['provide_address'] = 'Harus disediakan minimal satu alamat tujuan'; $PHPMAILER_LANG['invalid_hostentry'] = 'Gagal terkirim, entri host tidak sesuai: ';
$PHPMAILER_LANG['invalid_host'] = 'Gagal terkirim, host tidak sesuai: ';
$PHPMAILER_LANG['provide_address'] = 'Harus tersedia minimal satu alamat tujuan';
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer tidak didukung'; $PHPMAILER_LANG['mailer_not_supported'] = ' mailer tidak didukung';
$PHPMAILER_LANG['recipients_failed'] = 'Kesalahan SMTP: Alamat tujuan berikut menghasilkan kesalahan : '; $PHPMAILER_LANG['recipients_failed'] = 'Kesalahan SMTP: Alamat tujuan berikut menyebabkan kesalahan: ';
$PHPMAILER_LANG['signing'] = 'Kesalahan dalam tanda tangan : '; $PHPMAILER_LANG['signing'] = 'Kesalahan dalam penandatangan SSL: ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() gagal.'; $PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() gagal.';
$PHPMAILER_LANG['smtp_error'] = 'Kesalahan pada pelayan SMTP: '; $PHPMAILER_LANG['smtp_error'] = 'Kesalahan pada pelayan SMTP: ';
$PHPMAILER_LANG['variable_set'] = 'Tidak dapat mengatur atau mengatur ulang variable : '; $PHPMAILER_LANG['variable_set'] = 'Tidak dapat mengatur atau mengatur ulang variabel: ';
$PHPMAILER_LANG['extension_missing'] = 'Ekstensi hilang: '; $PHPMAILER_LANG['extension_missing'] = 'Ekstensi PHP tidak tersedia: ';

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Italian PHPMailer language file: refer to English translation for definitive list * Italian PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Japanese PHPMailer language file: refer to English translation for definitive list * Japanese PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Georgian PHPMailer language file: refer to English translation for definitive list * Georgian PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Korean PHPMailer language file: refer to English translation for definitive list * Korean PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Lithuanian PHPMailer language file: refer to English translation for definitive list * Lithuanian PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Latvian PHPMailer language file: refer to English translation for definitive list * Latvian PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,9 +1,11 @@
<?php <?php
/** /**
* Malagasy PHPMailer language file: refer to English translation for definitive list * Malagasy PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer
* @author Hackinet <piyushjha8164@gmail.com> * @author Hackinet <piyushjha8164@gmail.com>
*/ */
$PHPMAILER_LANG['authenticate'] = 'Hadisoana SMTP: Tsy nahomby ny fanamarinana.'; $PHPMAILER_LANG['authenticate'] = 'Hadisoana SMTP: Tsy nahomby ny fanamarinana.';
$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Tsy afaka mampifandray amin\'ny mpampiantrano SMTP.'; $PHPMAILER_LANG['connect_host'] = 'SMTP Error: Tsy afaka mampifandray amin\'ny mpampiantrano SMTP.';
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP diso: tsy voarakitra ny angona.'; $PHPMAILER_LANG['data_not_accepted'] = 'SMTP diso: tsy voarakitra ny angona.';

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Malaysian PHPMailer language file: refer to English translation for definitive list * Malaysian PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Norwegian Bokmål PHPMailer language file: refer to English translation for definitive list * Norwegian Bokmål PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Dutch PHPMailer language file: refer to PHPMailer.php for definitive list. * Dutch PHPMailer language file: refer to PHPMailer.php for definitive list.
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Polish PHPMailer language file: refer to English translation for definitive list * Polish PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Portuguese (European) PHPMailer language file: refer to English translation for definitive list * Portuguese (European) PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Brazilian Portuguese PHPMailer language file: refer to English translation for definitive list * Brazilian Portuguese PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Romanian PHPMailer language file: refer to English translation for definitive list * Romanian PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Russian PHPMailer language file: refer to English translation for definitive list * Russian PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Slovak PHPMailer language file: refer to English translation for definitive list * Slovak PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,9 +1,11 @@
<?php <?php
/** /**
* Slovene PHPMailer language file: refer to English translation for definitive list * Slovene PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer
* @author Klemen Tušar <techouse@gmail.com> * @author Klemen Tušar <techouse@gmail.com>
* @author Filip Š <projects@filips.si> * @author Filip Š <projects@filips.si>
* @author Blaž Oražem <blaz@orazem.si>
*/ */
$PHPMAILER_LANG['authenticate'] = 'SMTP napaka: Avtentikacija ni uspela.'; $PHPMAILER_LANG['authenticate'] = 'SMTP napaka: Avtentikacija ni uspela.';
@ -17,8 +19,10 @@ $PHPMAILER_LANG['file_open'] = 'Ne morem odpreti datoteke: ';
$PHPMAILER_LANG['from_failed'] = 'Neveljaven e-naslov pošiljatelja: '; $PHPMAILER_LANG['from_failed'] = 'Neveljaven e-naslov pošiljatelja: ';
$PHPMAILER_LANG['instantiate'] = 'Ne morem inicializirati mail funkcije.'; $PHPMAILER_LANG['instantiate'] = 'Ne morem inicializirati mail funkcije.';
$PHPMAILER_LANG['invalid_address'] = 'E-poštno sporočilo ni bilo poslano. E-naslov je neveljaven: '; $PHPMAILER_LANG['invalid_address'] = 'E-poštno sporočilo ni bilo poslano. E-naslov je neveljaven: ';
$PHPMAILER_LANG['invalid_hostentry'] = 'Neveljaven vnos gostitelja: ';
$PHPMAILER_LANG['invalid_host'] = 'Neveljaven gostitelj: ';
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer ni podprt.'; $PHPMAILER_LANG['mailer_not_supported'] = ' mailer ni podprt.';
$PHPMAILER_LANG['provide_address'] = 'Prosim vnesite vsaj enega naslovnika.'; $PHPMAILER_LANG['provide_address'] = 'Prosimo, vnesite vsaj enega naslovnika.';
$PHPMAILER_LANG['recipients_failed'] = 'SMTP napaka: Sledeči naslovniki so neveljavni: '; $PHPMAILER_LANG['recipients_failed'] = 'SMTP napaka: Sledeči naslovniki so neveljavni: ';
$PHPMAILER_LANG['signing'] = 'Napaka pri podpisovanju: '; $PHPMAILER_LANG['signing'] = 'Napaka pri podpisovanju: ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'Ne morem vzpostaviti povezave s SMTP strežnikom.'; $PHPMAILER_LANG['smtp_connect_failed'] = 'Ne morem vzpostaviti povezave s SMTP strežnikom.';

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Serbian PHPMailer language file: refer to English translation for definitive list * Serbian PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Swedish PHPMailer language file: refer to English translation for definitive list * Swedish PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,27 +1,28 @@
<?php <?php
/** /**
* Tagalog PHPMailer language file: refer to English translation for definitive list * Tagalog PHPMailer language file: refer to English translation for definitive list
* *
* @package PHPMailer * @package PHPMailer
* @author Adriane Justine Tan <adrianetan12@gmail.com> * @author Adriane Justine Tan <eidoriantan@gmail.com>
*/ */
$PHPMAILER_LANG['authenticate'] = 'SMTP Error: Hindi mapatotohanan.'; $PHPMAILER_LANG['authenticate'] = 'SMTP Error: Hindi mapatotohanan.';
$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Hindi makakonekta sa SMTP host.'; $PHPMAILER_LANG['connect_host'] = 'SMTP Error: Hindi makakonekta sa SMTP host.';
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: Ang datos ay hindi maaaring matatanggap.'; $PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: Ang datos ay hindi naitanggap.';
$PHPMAILER_LANG['empty_message'] = 'Walang laman ang mensahe'; $PHPMAILER_LANG['empty_message'] = 'Walang laman ang mensahe';
$PHPMAILER_LANG['encoding'] = 'Hindi alam ang encoding: '; $PHPMAILER_LANG['encoding'] = 'Hindi alam ang encoding: ';
$PHPMAILER_LANG['execute'] = 'Hindi maisasagawa: '; $PHPMAILER_LANG['execute'] = 'Hindi maisasagawa: ';
$PHPMAILER_LANG['file_access'] = 'Hindi ma-access ang file: '; $PHPMAILER_LANG['file_access'] = 'Hindi ma-access ang file: ';
$PHPMAILER_LANG['file_open'] = 'Hindi mabuksan ang file: '; $PHPMAILER_LANG['file_open'] = 'File Error: Hindi mabuksan ang file: ';
$PHPMAILER_LANG['from_failed'] = 'Ang sumusunod na address ay nabigo: '; $PHPMAILER_LANG['from_failed'] = 'Ang sumusunod na address ay nabigo: ';
$PHPMAILER_LANG['instantiate'] = 'Hindi maaaring magbigay ng institusyon ang mail'; $PHPMAILER_LANG['instantiate'] = 'Hindi maisimulan ang instance ng mail function.';
$PHPMAILER_LANG['invalid_address'] = 'Hindi wasto ang address na naibigay: '; $PHPMAILER_LANG['invalid_address'] = 'Hindi wasto ang address na naibigay: ';
$PHPMAILER_LANG['mailer_not_supported'] = 'Ang mailer ay hindi suportado'; $PHPMAILER_LANG['mailer_not_supported'] = 'Ang mailer ay hindi suportado.';
$PHPMAILER_LANG['provide_address'] = 'Kailangan mong magbigay ng kahit isang email address na tatanggap'; $PHPMAILER_LANG['provide_address'] = 'Kailangan mong magbigay ng kahit isang email address na tatanggap.';
$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: Ang mga sumusunod na tatanggap ay nabigo: '; $PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: Ang mga sumusunod na tatanggap ay nabigo: ';
$PHPMAILER_LANG['signing'] = 'Hindi ma-sign'; $PHPMAILER_LANG['signing'] = 'Hindi ma-sign: ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'Ang SMTP connect() ay nabigo'; $PHPMAILER_LANG['smtp_connect_failed'] = 'Ang SMTP connect() ay nabigo.';
$PHPMAILER_LANG['smtp_error'] = 'Ang server ng SMTP ay nabigo'; $PHPMAILER_LANG['smtp_error'] = 'Ang server ng SMTP ay nabigo: ';
$PHPMAILER_LANG['variable_set'] = 'Hindi matatakda ang mga variables: '; $PHPMAILER_LANG['variable_set'] = 'Hindi matatakda o ma-reset ang mga variables: ';
$PHPMAILER_LANG['extension_missing'] = 'Nawawala ang extension'; $PHPMAILER_LANG['extension_missing'] = 'Nawawala ang extension: ';

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Turkish PHPMailer language file: refer to English translation for definitive list * Turkish PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Ukrainian PHPMailer language file: refer to English translation for definitive list * Ukrainian PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Vietnamese (Tiếng Việt) PHPMailer language file: refer to English translation for definitive list. * Vietnamese (Tiếng Việt) PHPMailer language file: refer to English translation for definitive list.
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Traditional Chinese PHPMailer language file: refer to English translation for definitive list * Traditional Chinese PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Simplified Chinese PHPMailer language file: refer to English translation for definitive list * Simplified Chinese PHPMailer language file: refer to English translation for definitive list
* @package PHPMailer * @package PHPMailer

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* PHPMailer Exception class. * PHPMailer Exception class.
* PHP Version 5.5. * PHP Version 5.5.
@ -9,7 +10,7 @@
* @author Jim Jagielski (jimjag) <jimjag@gmail.com> * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
* @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net> * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
* @author Brent R. Matzelle (original founder) * @author Brent R. Matzelle (original founder)
* @copyright 2012 - 2017 Marcus Bointon * @copyright 2012 - 2020 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski * @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost * @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* PHPMailer - PHP email creation and transport class. * PHPMailer - PHP email creation and transport class.
* PHP Version 5.5. * PHP Version 5.5.
@ -9,7 +10,7 @@
* @author Jim Jagielski (jimjag) <jimjag@gmail.com> * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
* @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net> * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
* @author Brent R. Matzelle (original founder) * @author Brent R. Matzelle (original founder)
* @copyright 2012 - 2015 Marcus Bointon * @copyright 2012 - 2020 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski * @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost * @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* PHPMailer - PHP email creation and transport class. * PHPMailer - PHP email creation and transport class.
* PHP Version 5.5. * PHP Version 5.5.
@ -9,7 +10,7 @@
* @author Jim Jagielski (jimjag) <jimjag@gmail.com> * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
* @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net> * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
* @author Brent R. Matzelle (original founder) * @author Brent R. Matzelle (original founder)
* @copyright 2012 - 2019 Marcus Bointon * @copyright 2012 - 2020 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski * @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost * @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
@ -388,11 +389,11 @@ class PHPMailer
* SMTP class debug output mode. * SMTP class debug output mode.
* Debug output level. * Debug output level.
* Options: * Options:
* * SMTP::DEBUG_OFF: No output * @see SMTP::DEBUG_OFF: No output
* * SMTP::DEBUG_CLIENT: Client messages * @see SMTP::DEBUG_CLIENT: Client messages
* * SMTP::DEBUG_SERVER: Client and server messages * @see SMTP::DEBUG_SERVER: Client and server messages
* * SMTP::DEBUG_CONNECTION: As SERVER plus connection status * @see SMTP::DEBUG_CONNECTION: As SERVER plus connection status
* * SMTP::DEBUG_LOWLEVEL: Noisy, low-level data output, rarely needed * @see SMTP::DEBUG_LOWLEVEL: Noisy, low-level data output, rarely needed
* *
* @see SMTP::$do_debug * @see SMTP::$do_debug
* *
@ -441,6 +442,8 @@ class PHPMailer
* Only supported in `mail` and `sendmail` transports, not in SMTP. * Only supported in `mail` and `sendmail` transports, not in SMTP.
* *
* @var bool * @var bool
*
* @deprecated 6.0.0 PHPMailer isn't a mailing list manager!
*/ */
public $SingleTo = false; public $SingleTo = false;
@ -745,7 +748,7 @@ class PHPMailer
* *
* @var string * @var string
*/ */
const VERSION = '6.1.6'; const VERSION = '6.2.0';
/** /**
* Error severity: message only, continue processing. * Error severity: message only, continue processing.
@ -897,6 +900,7 @@ class PHPMailer
switch ($this->Debugoutput) { switch ($this->Debugoutput) {
case 'error_log': case 'error_log':
//Don't output, just log //Don't output, just log
/** @noinspection ForgottenDebugOutputInspection */
error_log($str); error_log($str);
break; break;
case 'html': case 'html':
@ -1182,9 +1186,11 @@ class PHPMailer
//Use this built-in parser if it's available //Use this built-in parser if it's available
$list = imap_rfc822_parse_adrlist($addrstr, ''); $list = imap_rfc822_parse_adrlist($addrstr, '');
foreach ($list as $address) { foreach ($list as $address) {
if (('.SYNTAX-ERROR.' !== $address->host) && static::validateAddress( if (
('.SYNTAX-ERROR.' !== $address->host) && static::validateAddress(
$address->mailbox . '@' . $address->host $address->mailbox . '@' . $address->host
)) { )
) {
$addresses[] = [ $addresses[] = [
'name' => (property_exists($address, 'personal') ? $address->personal : ''), 'name' => (property_exists($address, 'personal') ? $address->personal : ''),
'address' => $address->mailbox . '@' . $address->host, 'address' => $address->mailbox . '@' . $address->host,
@ -1238,7 +1244,8 @@ class PHPMailer
$name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
// Don't validate now addresses with IDN. Will be done in send(). // Don't validate now addresses with IDN. Will be done in send().
$pos = strrpos($address, '@'); $pos = strrpos($address, '@');
if ((false === $pos) if (
(false === $pos)
|| ((!$this->has8bitChars(substr($address, ++$pos)) || !static::idnSupported()) || ((!$this->has8bitChars(substr($address, ++$pos)) || !static::idnSupported())
&& !static::validateAddress($address)) && !static::validateAddress($address))
) { ) {
@ -1307,7 +1314,7 @@ class PHPMailer
$patternselect = static::$validator; $patternselect = static::$validator;
} }
if (is_callable($patternselect)) { if (is_callable($patternselect)) {
return $patternselect($address); return call_user_func($patternselect, $address);
} }
//Reject line breaks in addresses; it's valid RFC5322, but not RFC5321 //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
if (strpos($address, "\n") !== false || strpos($address, "\r") !== false) { if (strpos($address, "\n") !== false || strpos($address, "\r") !== false) {
@ -1348,7 +1355,7 @@ class PHPMailer
/* /*
* This is the pattern used in the HTML5 spec for validation of 'email' type form input elements. * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
* *
* @see http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email) * @see https://html.spec.whatwg.org/#e-mail-state-(type=email)
*/ */
return (bool) preg_match( return (bool) preg_match(
'/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' . '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
@ -1390,7 +1397,8 @@ class PHPMailer
{ {
// Verify we have required functions, CharSet, and at-sign. // Verify we have required functions, CharSet, and at-sign.
$pos = strrpos($address, '@'); $pos = strrpos($address, '@');
if (!empty($this->CharSet) && if (
!empty($this->CharSet) &&
false !== $pos && false !== $pos &&
static::idnSupported() static::idnSupported()
) { ) {
@ -1452,8 +1460,9 @@ class PHPMailer
*/ */
public function preSend() public function preSend()
{ {
if ('smtp' === $this->Mailer if (
|| ('mail' === $this->Mailer && stripos(PHP_OS, 'WIN') === 0) 'smtp' === $this->Mailer
|| ('mail' === $this->Mailer && (PHP_VERSION_ID >= 80000 || stripos(PHP_OS, 'WIN') === 0))
) { ) {
//SMTP mandates RFC-compliant line endings //SMTP mandates RFC-compliant line endings
//and it's also used with mail() on Windows //and it's also used with mail() on Windows
@ -1463,7 +1472,8 @@ class PHPMailer
static::setLE(PHP_EOL); static::setLE(PHP_EOL);
} }
//Check for buggy PHP versions that add a header with an incorrect line break //Check for buggy PHP versions that add a header with an incorrect line break
if ('mail' === $this->Mailer if (
'mail' === $this->Mailer
&& ((PHP_VERSION_ID >= 70000 && PHP_VERSION_ID < 70017) && ((PHP_VERSION_ID >= 70000 && PHP_VERSION_ID < 70017)
|| (PHP_VERSION_ID >= 70100 && PHP_VERSION_ID < 70103)) || (PHP_VERSION_ID >= 70100 && PHP_VERSION_ID < 70103))
&& ini_get('mail.add_x_header') === '1' && ini_get('mail.add_x_header') === '1'
@ -1550,7 +1560,8 @@ class PHPMailer
} }
// Sign with DKIM if enabled // Sign with DKIM if enabled
if (!empty($this->DKIM_domain) if (
!empty($this->DKIM_domain)
&& !empty($this->DKIM_selector) && !empty($this->DKIM_selector)
&& (!empty($this->DKIM_private_string) && (!empty($this->DKIM_private_string)
|| (!empty($this->DKIM_private) || (!empty($this->DKIM_private)
@ -1607,6 +1618,9 @@ class PHPMailer
return $this->mailSend($this->MIMEHeader, $this->MIMEBody); return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
} }
} catch (Exception $exc) { } catch (Exception $exc) {
if ($this->Mailer === 'smtp' && $this->SMTPKeepAlive == true) {
$this->smtp->reset();
}
$this->setError($exc->getMessage()); $this->setError($exc->getMessage());
$this->edebug($exc->getMessage()); $this->edebug($exc->getMessage());
if ($this->exceptions) { if ($this->exceptions) {
@ -1711,7 +1725,8 @@ class PHPMailer
protected static function isShellSafe($string) protected static function isShellSafe($string)
{ {
// Future-proof // Future-proof
if (escapeshellcmd($string) !== $string if (
escapeshellcmd($string) !== $string
|| !in_array(escapeshellarg($string), ["'$string'", "\"$string\""]) || !in_array(escapeshellarg($string), ["'$string'", "\"$string\""])
) { ) {
return false; return false;
@ -1747,6 +1762,23 @@ class PHPMailer
return !preg_match('#^[a-z]+://#i', $path); return !preg_match('#^[a-z]+://#i', $path);
} }
/**
* Check whether a file path is safe, accessible, and readable.
*
* @param string $path A relative or absolute path to a file
*
* @return bool
*/
protected static function fileIsAccessible($path)
{
$readable = file_exists($path);
//If not a UNC path (expected to start with \\), check read permission, see #2069
if (strpos($path, '\\\\') !== 0) {
$readable = $readable && is_readable($path);
}
return static::isPermittedPath($path) && $readable;
}
/** /**
* Send mail using the PHP mail() function. * Send mail using the PHP mail() function.
* *
@ -1958,11 +1990,13 @@ class PHPMailer
foreach ($hosts as $hostentry) { foreach ($hosts as $hostentry) {
$hostinfo = []; $hostinfo = [];
if (!preg_match( if (
!preg_match(
'/^(?:(ssl|tls):\/\/)?(.+?)(?::(\d+))?$/', '/^(?:(ssl|tls):\/\/)?(.+?)(?::(\d+))?$/',
trim($hostentry), trim($hostentry),
$hostinfo $hostinfo
)) { )
) {
$this->edebug($this->lang('invalid_hostentry') . ' ' . trim($hostentry)); $this->edebug($this->lang('invalid_hostentry') . ' ' . trim($hostentry));
// Not a valid host entry // Not a valid host entry
continue; continue;
@ -2000,7 +2034,12 @@ class PHPMailer
} }
$host = $hostinfo[2]; $host = $hostinfo[2];
$port = $this->Port; $port = $this->Port;
if (array_key_exists(3, $hostinfo) && is_numeric($hostinfo[3]) && $hostinfo[3] > 0 && $hostinfo[3] < 65536) { if (
array_key_exists(3, $hostinfo) &&
is_numeric($hostinfo[3]) &&
$hostinfo[3] > 0 &&
$hostinfo[3] < 65536
) {
$port = (int) $hostinfo[3]; $port = (int) $hostinfo[3];
} }
if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) { if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
@ -2026,12 +2065,14 @@ class PHPMailer
// We must resend EHLO after TLS negotiation // We must resend EHLO after TLS negotiation
$this->smtp->hello($hello); $this->smtp->hello($hello);
} }
if ($this->SMTPAuth && !$this->smtp->authenticate( if (
$this->SMTPAuth && !$this->smtp->authenticate(
$this->Username, $this->Username,
$this->Password, $this->Password,
$this->AuthType, $this->AuthType,
$this->oauth $this->oauth
)) { )
) {
throw new Exception($this->lang('authenticate')); throw new Exception($this->lang('authenticate'));
} }
@ -2089,7 +2130,7 @@ class PHPMailer
'am' => 'hy', 'am' => 'hy',
]; ];
if (isset($renamed_langcodes[$langcode])) { if (array_key_exists($langcode, $renamed_langcodes)) {
$langcode = $renamed_langcodes[$langcode]; $langcode = $renamed_langcodes[$langcode];
} }
@ -2130,7 +2171,7 @@ class PHPMailer
// There is no English translation file // There is no English translation file
if ('en' !== $langcode) { if ('en' !== $langcode) {
// Make sure language file path is readable // Make sure language file path is readable
if (!static::isPermittedPath($lang_file) || !file_exists($lang_file)) { if (!static::fileIsAccessible($lang_file)) {
$foundlang = false; $foundlang = false;
} else { } else {
// Overwrite language-specific strings. // Overwrite language-specific strings.
@ -2378,21 +2419,18 @@ class PHPMailer
$result .= $this->headerLine('Date', '' === $this->MessageDate ? self::rfcDate() : $this->MessageDate); $result .= $this->headerLine('Date', '' === $this->MessageDate ? self::rfcDate() : $this->MessageDate);
// To be created automatically by mail() // The To header is created automatically by mail(), so needs to be omitted here
if ($this->SingleTo) {
if ('mail' !== $this->Mailer) { if ('mail' !== $this->Mailer) {
if ($this->SingleTo) {
foreach ($this->to as $toaddr) { foreach ($this->to as $toaddr) {
$this->SingleToArray[] = $this->addrFormat($toaddr); $this->SingleToArray[] = $this->addrFormat($toaddr);
} }
}
} elseif (count($this->to) > 0) { } elseif (count($this->to) > 0) {
if ('mail' !== $this->Mailer) {
$result .= $this->addrAppend('To', $this->to); $result .= $this->addrAppend('To', $this->to);
}
} elseif (count($this->cc) === 0) { } elseif (count($this->cc) === 0) {
$result .= $this->headerLine('To', 'undisclosed-recipients:;'); $result .= $this->headerLine('To', 'undisclosed-recipients:;');
} }
}
$result .= $this->addrAppend('From', [[trim($this->From), $this->FromName]]); $result .= $this->addrAppend('From', [[trim($this->From), $this->FromName]]);
// sendmail and mail() extract Cc from the header before sending // sendmail and mail() extract Cc from the header before sending
@ -2401,7 +2439,8 @@ class PHPMailer
} }
// sendmail and mail() extract Bcc from the header before sending // sendmail and mail() extract Bcc from the header before sending
if (( if (
(
'sendmail' === $this->Mailer || 'qmail' === $this->Mailer || 'mail' === $this->Mailer 'sendmail' === $this->Mailer || 'qmail' === $this->Mailer || 'mail' === $this->Mailer
) )
&& count($this->bcc) > 0 && count($this->bcc) > 0
@ -2947,7 +2986,7 @@ class PHPMailer
* @param string $path Path to the attachment * @param string $path Path to the attachment
* @param string $name Overrides the attachment name * @param string $name Overrides the attachment name
* @param string $encoding File encoding (see $Encoding) * @param string $encoding File encoding (see $Encoding)
* @param string $type File extension (MIME) type * @param string $type MIME type, e.g. `image/jpeg`; determined automatically from $path if not specified
* @param string $disposition Disposition to use * @param string $disposition Disposition to use
* *
* @throws Exception * @throws Exception
@ -2962,7 +3001,7 @@ class PHPMailer
$disposition = 'attachment' $disposition = 'attachment'
) { ) {
try { try {
if (!static::isPermittedPath($path) || !@is_file($path) || !is_readable($path)) { if (!static::fileIsAccessible($path)) {
throw new Exception($this->lang('file_access') . $path, self::STOP_CONTINUE); throw new Exception($this->lang('file_access') . $path, self::STOP_CONTINUE);
} }
@ -2975,7 +3014,6 @@ class PHPMailer
if ('' === $name) { if ('' === $name) {
$name = $filename; $name = $filename;
} }
if (!$this->validateEncoding($encoding)) { if (!$this->validateEncoding($encoding)) {
throw new Exception($this->lang('encoding') . $encoding); throw new Exception($this->lang('encoding') . $encoding);
} }
@ -3137,7 +3175,7 @@ class PHPMailer
protected function encodeFile($path, $encoding = self::ENCODING_BASE64) protected function encodeFile($path, $encoding = self::ENCODING_BASE64)
{ {
try { try {
if (!static::isPermittedPath($path) || !file_exists($path) || !is_readable($path)) { if (!static::fileIsAccessible($path)) {
throw new Exception($this->lang('file_open') . $path, self::STOP_CONTINUE); throw new Exception($this->lang('file_open') . $path, self::STOP_CONTINUE);
} }
$file_buffer = file_get_contents($path); $file_buffer = file_get_contents($path);
@ -3523,7 +3561,7 @@ class PHPMailer
$disposition = 'inline' $disposition = 'inline'
) { ) {
try { try {
if (!static::isPermittedPath($path) || !@is_file($path) || !is_readable($path)) { if (!static::fileIsAccessible($path)) {
throw new Exception($this->lang('file_access') . $path, self::STOP_CONTINUE); throw new Exception($this->lang('file_access') . $path, self::STOP_CONTINUE);
} }
@ -3872,7 +3910,8 @@ class PHPMailer
public static function isValidHost($host) public static function isValidHost($host)
{ {
//Simple syntax limits //Simple syntax limits
if (empty($host) if (
empty($host)
|| !is_string($host) || !is_string($host)
|| strlen($host) > 256 || strlen($host) > 256
|| !preg_match('/^([a-zA-Z\d.-]*|\[[a-fA-F\d:]+])$/', $host) || !preg_match('/^([a-zA-Z\d.-]*|\[[a-fA-F\d:]+])$/', $host)
@ -3990,7 +4029,8 @@ class PHPMailer
* @param string $message HTML message string * @param string $message HTML message string
* @param string $basedir Absolute path to a base directory to prepend to relative paths to images * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
* @param bool|callable $advanced Whether to use the internal HTML to text converter * @param bool|callable $advanced Whether to use the internal HTML to text converter
* or your own custom converter @return string $message The transformed message Body * or your own custom converter
* @return string The transformed message body
* *
* @throws Exception * @throws Exception
* *
@ -4037,7 +4077,8 @@ class PHPMailer
); );
continue; continue;
} }
if (// Only process relative URLs if a basedir is provided (i.e. no absolute local paths) if (
// Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
!empty($basedir) !empty($basedir)
// Ignore URLs containing parent dir traversal (..) // Ignore URLs containing parent dir traversal (..)
&& (strpos($url, '..') === false) && (strpos($url, '..') === false)
@ -4059,7 +4100,8 @@ class PHPMailer
if (strlen($directory) > 1 && '/' !== substr($directory, -1)) { if (strlen($directory) > 1 && '/' !== substr($directory, -1)) {
$directory .= '/'; $directory .= '/';
} }
if ($this->addEmbeddedImage( if (
$this->addEmbeddedImage(
$basedir . $directory . $filename, $basedir . $directory . $filename,
$cid, $cid,
$filename, $filename,
@ -4114,7 +4156,7 @@ class PHPMailer
public function html2text($html, $advanced = false) public function html2text($html, $advanced = false)
{ {
if (is_callable($advanced)) { if (is_callable($advanced)) {
return $advanced($html); return call_user_func($advanced, $html);
} }
return html_entity_decode( return html_entity_decode(
@ -4213,6 +4255,7 @@ class PHPMailer
'tiff' => 'image/tiff', 'tiff' => 'image/tiff',
'tif' => 'image/tiff', 'tif' => 'image/tiff',
'webp' => 'image/webp', 'webp' => 'image/webp',
'avif' => 'image/avif',
'heif' => 'image/heif', 'heif' => 'image/heif',
'heifs' => 'image/heif-sequence', 'heifs' => 'image/heif-sequence',
'heic' => 'image/heic', 'heic' => 'image/heic',
@ -4483,11 +4526,15 @@ class PHPMailer
$privKey = openssl_pkey_get_private($privKeyStr); $privKey = openssl_pkey_get_private($privKeyStr);
} }
if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) { if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
if (PHP_MAJOR_VERSION < 8) {
openssl_pkey_free($privKey); openssl_pkey_free($privKey);
}
return base64_encode($signature); return base64_encode($signature);
} }
if (PHP_MAJOR_VERSION < 8) {
openssl_pkey_free($privKey); openssl_pkey_free($privKey);
}
return ''; return '';
} }

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* PHPMailer POP-Before-SMTP Authentication Class. * PHPMailer POP-Before-SMTP Authentication Class.
* PHP Version 5.5. * PHP Version 5.5.
@ -9,7 +10,7 @@
* @author Jim Jagielski (jimjag) <jimjag@gmail.com> * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
* @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net> * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
* @author Brent R. Matzelle (original founder) * @author Brent R. Matzelle (original founder)
* @copyright 2012 - 2019 Marcus Bointon * @copyright 2012 - 2020 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski * @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost * @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
@ -45,7 +46,7 @@ class POP3
* *
* @var string * @var string
*/ */
const VERSION = '6.1.6'; const VERSION = '6.2.0';
/** /**
* Default POP3 port number. * Default POP3 port number.
@ -62,12 +63,16 @@ class POP3
const DEFAULT_TIMEOUT = 30; const DEFAULT_TIMEOUT = 30;
/** /**
* Debug display level. * POP3 class debug output mode.
* Options: 0 = no, 1+ = yes. * Debug output level.
* Options:
* @see POP3::DEBUG_OFF: No output
* @see POP3::DEBUG_SERVER: Server messages, connection/server errors
* @see POP3::DEBUG_CLIENT: Client and Server messages, connection/server errors
* *
* @var int * @var int
*/ */
public $do_debug = 0; public $do_debug = self::DEBUG_OFF;
/** /**
* POP3 mail server hostname. * POP3 mail server hostname.
@ -130,6 +135,28 @@ class POP3
*/ */
const LE = "\r\n"; const LE = "\r\n";
/**
* Debug level for no output.
*
* @var int
*/
const DEBUG_OFF = 0;
/**
* Debug level to show server -> client messages
* also shows clients connection errors or errors from server
*
* @var int
*/
const DEBUG_SERVER = 1;
/**
* Debug level to show client -> server and server -> client messages.
*
* @var int
*/
const DEBUG_CLIENT = 2;
/** /**
* Simple static wrapper for all-in-one POP before SMTP. * Simple static wrapper for all-in-one POP before SMTP.
* *
@ -329,7 +356,7 @@ class POP3
protected function getResponse($size = 128) protected function getResponse($size = 128)
{ {
$response = fgets($this->pop_conn, $size); $response = fgets($this->pop_conn, $size);
if ($this->do_debug >= 1) { if ($this->do_debug >= self::DEBUG_SERVER) {
echo 'Server -> Client: ', $response; echo 'Server -> Client: ', $response;
} }
@ -346,7 +373,7 @@ class POP3
protected function sendString($string) protected function sendString($string)
{ {
if ($this->pop_conn) { if ($this->pop_conn) {
if ($this->do_debug >= 2) { //Show client messages when debug >= 2 if ($this->do_debug >= self::DEBUG_CLIENT) { //Show client messages when debug >= 2
echo 'Client -> Server: ', $string; echo 'Client -> Server: ', $string;
} }
@ -384,7 +411,7 @@ class POP3
protected function setError($error) protected function setError($error)
{ {
$this->errors[] = $error; $this->errors[] = $error;
if ($this->do_debug >= 1) { if ($this->do_debug >= self::DEBUG_SERVER) {
echo '<pre>'; echo '<pre>';
foreach ($this->errors as $e) { foreach ($this->errors as $e) {
print_r($e); print_r($e);

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* PHPMailer RFC821 SMTP email transport class. * PHPMailer RFC821 SMTP email transport class.
* PHP Version 5.5. * PHP Version 5.5.
@ -9,7 +10,7 @@
* @author Jim Jagielski (jimjag) <jimjag@gmail.com> * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
* @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net> * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
* @author Brent R. Matzelle (original founder) * @author Brent R. Matzelle (original founder)
* @copyright 2012 - 2019 Marcus Bointon * @copyright 2012 - 2020 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski * @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost * @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
@ -34,7 +35,7 @@ class SMTP
* *
* @var string * @var string
*/ */
const VERSION = '6.1.6'; const VERSION = '6.2.0';
/** /**
* SMTP line break constant. * SMTP line break constant.
@ -311,12 +312,6 @@ class SMTP
*/ */
public function connect($host, $port = null, $timeout = 30, $options = []) public function connect($host, $port = null, $timeout = 30, $options = [])
{ {
static $streamok;
//This is enabled by default since 5.0.0 but some providers disable it
//Check this once and cache the result
if (null === $streamok) {
$streamok = function_exists('stream_socket_client');
}
// Clear errors to avoid confusion // Clear errors to avoid confusion
$this->setError(''); $this->setError('');
// Make sure we are __not__ connected // Make sure we are __not__ connected
@ -335,12 +330,48 @@ class SMTP
(count($options) > 0 ? var_export($options, true) : 'array()'), (count($options) > 0 ? var_export($options, true) : 'array()'),
self::DEBUG_CONNECTION self::DEBUG_CONNECTION
); );
$this->smtp_conn = $this->getSMTPConnection($host, $port, $timeout, $options);
if ($this->smtp_conn === false) {
//Error info already set inside `getSMTPConnection()`
return false;
}
$this->edebug('Connection: opened', self::DEBUG_CONNECTION);
// Get any announcement
$this->last_reply = $this->get_lines();
$this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);
return true;
}
/**
* Create connection to the SMTP server.
*
* @param string $host SMTP server IP or host name
* @param int $port The port number to connect to
* @param int $timeout How long to wait for the connection to open
* @param array $options An array of options for stream_context_create()
*
* @return false|resource
*/
protected function getSMTPConnection($host, $port = null, $timeout = 30, $options = [])
{
static $streamok;
//This is enabled by default since 5.0.0 but some providers disable it
//Check this once and cache the result
if (null === $streamok) {
$streamok = function_exists('stream_socket_client');
}
$errno = 0; $errno = 0;
$errstr = ''; $errstr = '';
if ($streamok) { if ($streamok) {
$socket_context = stream_context_create($options); $socket_context = stream_context_create($options);
set_error_handler([$this, 'errorHandler']); set_error_handler([$this, 'errorHandler']);
$this->smtp_conn = stream_socket_client( $connection = stream_socket_client(
$host . ':' . $port, $host . ':' . $port,
$errno, $errno,
$errstr, $errstr,
@ -356,7 +387,7 @@ class SMTP
self::DEBUG_CONNECTION self::DEBUG_CONNECTION
); );
set_error_handler([$this, 'errorHandler']); set_error_handler([$this, 'errorHandler']);
$this->smtp_conn = fsockopen( $connection = fsockopen(
$host, $host,
$port, $port,
$errno, $errno,
@ -365,8 +396,9 @@ class SMTP
); );
restore_error_handler(); restore_error_handler();
} }
// Verify we connected properly // Verify we connected properly
if (!is_resource($this->smtp_conn)) { if (!is_resource($connection)) {
$this->setError( $this->setError(
'Failed to connect to server', 'Failed to connect to server',
'', '',
@ -381,22 +413,19 @@ class SMTP
return false; return false;
} }
$this->edebug('Connection: opened', self::DEBUG_CONNECTION);
// SMTP server can take longer to respond, give longer timeout for first read // SMTP server can take longer to respond, give longer timeout for first read
// Windows does not have support for this timeout function // Windows does not have support for this timeout function
if (strpos(PHP_OS, 'WIN') !== 0) { if (strpos(PHP_OS, 'WIN') !== 0) {
$max = (int)ini_get('max_execution_time'); $max = (int)ini_get('max_execution_time');
// Don't bother if unlimited // Don't bother if unlimited, or if set_time_limit is disabled
if (0 !== $max && $timeout > $max) { if (0 !== $max && $timeout > $max && strpos(ini_get('disable_functions'), 'set_time_limit') === false) {
@set_time_limit($timeout); @set_time_limit($timeout);
} }
stream_set_timeout($this->smtp_conn, $timeout, 0); stream_set_timeout($connection, $timeout, 0);
} }
// Get any announcement
$announce = $this->get_lines();
$this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER);
return true; return $connection;
} }
/** /**
@ -511,7 +540,8 @@ class SMTP
return false; return false;
} }
// Send encoded username and password // Send encoded username and password
if (!$this->sendCommand( if (
!$this->sendCommand(
'User & Password', 'User & Password',
base64_encode("\0" . $username . "\0" . $password), base64_encode("\0" . $username . "\0" . $password),
235 235
@ -1058,8 +1088,10 @@ class SMTP
{ {
//If SMTP transcripts are left enabled, or debug output is posted online //If SMTP transcripts are left enabled, or debug output is posted online
//it can leak credentials, so hide credentials in all but lowest level //it can leak credentials, so hide credentials in all but lowest level
if (self::DEBUG_LOWLEVEL > $this->do_debug && if (
in_array($command, ['User & Password', 'Username', 'Password'], true)) { self::DEBUG_LOWLEVEL > $this->do_debug &&
in_array($command, ['User & Password', 'Username', 'Password'], true)
) {
$this->edebug('CLIENT -> SERVER: [credentials hidden]', self::DEBUG_CLIENT); $this->edebug('CLIENT -> SERVER: [credentials hidden]', self::DEBUG_CLIENT);
} else { } else {
$this->edebug('CLIENT -> SERVER: ' . $data, self::DEBUG_CLIENT); $this->edebug('CLIENT -> SERVER: ' . $data, self::DEBUG_CLIENT);
@ -1166,13 +1198,41 @@ class SMTP
$selW = null; $selW = null;
while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) { while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {
//Must pass vars in here as params are by reference //Must pass vars in here as params are by reference
if (!stream_select($selR, $selW, $selW, $this->Timelimit)) { //solution for signals inspired by https://github.com/symfony/symfony/pull/6540
set_error_handler([$this, 'errorHandler']);
$n = stream_select($selR, $selW, $selW, $this->Timelimit);
restore_error_handler();
if ($n === false) {
$message = $this->getError()['detail'];
$this->edebug(
'SMTP -> get_lines(): select failed (' . $message . ')',
self::DEBUG_LOWLEVEL
);
//stream_select returns false when the `select` system call is interrupted
//by an incoming signal, try the select again
if (stripos($message, 'interrupted system call') !== false) {
$this->edebug(
'SMTP -> get_lines(): retrying stream_select',
self::DEBUG_LOWLEVEL
);
$this->setError('');
continue;
}
break;
}
if (!$n) {
$this->edebug( $this->edebug(
'SMTP -> get_lines(): select timed-out in (' . $this->Timelimit . ' sec)', 'SMTP -> get_lines(): select timed-out in (' . $this->Timelimit . ' sec)',
self::DEBUG_LOWLEVEL self::DEBUG_LOWLEVEL
); );
break; break;
} }
//Deliberate noise suppression - errors are handled afterwards //Deliberate noise suppression - errors are handled afterwards
$str = @fgets($this->smtp_conn, self::MAX_REPLY_LENGTH); $str = @fgets($this->smtp_conn, self::MAX_REPLY_LENGTH);
$this->edebug('SMTP INBOUND: "' . trim($str) . '"', self::DEBUG_LOWLEVEL); $this->edebug('SMTP INBOUND: "' . trim($str) . '"', self::DEBUG_LOWLEVEL);