diff --git a/core/class/phpmailer/PHPMailer.class.php b/core/class/phpmailer/PHPMailer.class.php
index 718216b5..e14cdbf5 100644
--- a/core/class/phpmailer/PHPMailer.class.php
+++ b/core/class/phpmailer/PHPMailer.class.php
@@ -350,8 +350,8 @@ class PHPMailer
public $Password = '';
/**
- * SMTP auth type.
- * Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2, attempted in that order if not specified.
+ * SMTP authentication type. Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2.
+ * If not specified, the first one from that list that the server supports will be selected.
*
* @var string
*/
@@ -750,7 +750,7 @@ class PHPMailer
*
* @var string
*/
- const VERSION = '6.6.0';
+ const VERSION = '6.7.1';
/**
* Error severity: message only, continue processing.
@@ -858,7 +858,7 @@ class PHPMailer
private function mailPassthru($to, $subject, $body, $header, $params)
{
//Check overloading of mail function to avoid double-encoding
- if (ini_get('mbstring.func_overload') & 1) {
+ if ((int)ini_get('mbstring.func_overload') & 1) {
$subject = $this->secureHeader($subject);
} else {
$subject = $this->encodeHeader($this->secureHeader($subject));
@@ -1066,8 +1066,8 @@ class PHPMailer
* Addresses that have been added already return false, but do not throw exceptions.
*
* @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
- * @param string $address The email address to send, resp. to reply to
- * @param string $name
+ * @param string $address The email address
+ * @param string $name An optional username associated with the address
*
* @throws Exception
*
@@ -1075,9 +1075,11 @@ class PHPMailer
*/
protected function addOrEnqueueAnAddress($kind, $address, $name)
{
- $address = trim($address);
- $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
- $pos = strrpos($address, '@');
+ $pos = false;
+ if ($address !== null) {
+ $address = trim($address);
+ $pos = strrpos($address, '@');
+ }
if (false === $pos) {
//At-sign is missing.
$error_message = sprintf(
@@ -1094,8 +1096,14 @@ class PHPMailer
return false;
}
+ if ($name !== null && is_string($name)) {
+ $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
+ } else {
+ $name = '';
+ }
$params = [$kind, $address, $name];
//Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
+ //Domain is assumed to be whatever is after the last @ symbol in the address
if (static::idnSupported() && $this->has8bitChars(substr($address, ++$pos))) {
if ('Reply-To' !== $kind) {
if (!array_key_exists($address, $this->RecipientsQueue)) {
@@ -1116,6 +1124,22 @@ class PHPMailer
return call_user_func_array([$this, 'addAnAddress'], $params);
}
+ /**
+ * Set the boundaries to use for delimiting MIME parts.
+ * If you override this, ensure you set all 3 boundaries to unique values.
+ * The default boundaries include a "=_" sequence which cannot occur in quoted-printable bodies,
+ * as suggested by https://www.rfc-editor.org/rfc/rfc2045#section-6.7
+ *
+ * @return void
+ */
+ public function setBoundaries()
+ {
+ $this->uniqueid = $this->generateId();
+ $this->boundary[1] = 'b1=_' . $this->uniqueid;
+ $this->boundary[2] = 'b2=_' . $this->uniqueid;
+ $this->boundary[3] = 'b3=_' . $this->uniqueid;
+ }
+
/**
* Add an address to one of the recipient arrays or to the ReplyTo array.
* Addresses that have been added already return false, but do not throw exceptions.
@@ -1280,7 +1304,7 @@ class PHPMailer
*/
public function setFrom($address, $name = '', $auto = true)
{
- $address = trim($address);
+ $address = trim((string)$address);
$name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
//Don't validate now addresses with IDN. Will be done in send().
$pos = strrpos($address, '@');
@@ -1547,17 +1571,17 @@ class PHPMailer
//Validate From, Sender, and ConfirmReadingTo addresses
foreach (['From', 'Sender', 'ConfirmReadingTo'] as $address_kind) {
- $this->$address_kind = trim($this->$address_kind);
- if (empty($this->$address_kind)) {
+ $this->{$address_kind} = trim($this->{$address_kind});
+ if (empty($this->{$address_kind})) {
continue;
}
- $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
- if (!static::validateAddress($this->$address_kind)) {
+ $this->{$address_kind} = $this->punyencodeAddress($this->{$address_kind});
+ if (!static::validateAddress($this->{$address_kind})) {
$error_message = sprintf(
'%s (%s): %s',
$this->lang('invalid_address'),
$address_kind,
- $this->$address_kind
+ $this->{$address_kind}
);
$this->setError($error_message);
$this->edebug($error_message);
@@ -1657,17 +1681,17 @@ class PHPMailer
default:
$sendMethod = $this->Mailer . 'Send';
if (method_exists($this, $sendMethod)) {
- return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
+ return $this->{$sendMethod}($this->MIMEHeader, $this->MIMEBody);
}
return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
}
} catch (Exception $exc) {
- if ($this->Mailer === 'smtp' && $this->SMTPKeepAlive == true) {
- $this->smtp->reset();
- }
$this->setError($exc->getMessage());
$this->edebug($exc->getMessage());
+ if ($this->Mailer === 'smtp' && $this->SMTPKeepAlive == true && $this->smtp->connected()) {
+ $this->smtp->reset();
+ }
if ($this->exceptions) {
throw $exc;
}
@@ -1855,7 +1879,7 @@ class PHPMailer
if (!static::isPermittedPath($path)) {
return false;
}
- $readable = file_exists($path);
+ $readable = is_file($path);
//If not a UNC path (expected to start with \\), check read permission, see #2069
if (strpos($path, '\\\\') !== 0) {
$readable = $readable && is_readable($path);
@@ -1883,7 +1907,14 @@ class PHPMailer
foreach ($this->to as $toaddr) {
$toArr[] = $this->addrFormat($toaddr);
}
- $to = implode(', ', $toArr);
+ $to = trim(implode(', ', $toArr));
+
+ //If there are no To-addresses (e.g. when sending only to BCC-addresses)
+ //the following should be added to get a correct DKIM-signature.
+ //Compare with $this->preSend()
+ if ($to === '') {
+ $to = 'undisclosed-recipients:;';
+ }
$params = null;
//This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
@@ -2086,6 +2117,9 @@ class PHPMailer
$this->smtp->setDebugLevel($this->SMTPDebug);
$this->smtp->setDebugOutput($this->Debugoutput);
$this->smtp->setVerp($this->do_verp);
+ if ($this->Host === null) {
+ $this->Host = 'localhost';
+ }
$hosts = explode(';', $this->Host);
$lastexception = null;
@@ -2192,7 +2226,8 @@ class PHPMailer
//As we've caught all exceptions, just report whatever the last one was
if ($this->exceptions && null !== $lastexception) {
throw $lastexception;
- } elseif ($this->exceptions) {
+ }
+ if ($this->exceptions) {
// no exception was thrown, likely $this->smtp->connect() failed
$message = $this->getSmtpErrorMessage('connect_host');
throw new Exception($message);
@@ -2775,10 +2810,7 @@ class PHPMailer
{
$body = '';
//Create unique IDs and preset boundaries
- $this->uniqueid = $this->generateId();
- $this->boundary[1] = 'b1_' . $this->uniqueid;
- $this->boundary[2] = 'b2_' . $this->uniqueid;
- $this->boundary[3] = 'b3_' . $this->uniqueid;
+ $this->setBoundaries();
if ($this->sign_key_file) {
$body .= $this->getMailMIME() . static::$LE;
@@ -2814,7 +2846,7 @@ class PHPMailer
$altBodyEncoding = static::ENCODING_QUOTED_PRINTABLE;
}
//Use this as a preamble in all multipart message types
- $mimepre = 'This is a multi-part message in MIME format.' . static::$LE . static::$LE;
+ $mimepre = '';
switch ($this->message_type) {
case 'inline':
$body .= $mimepre;
@@ -3050,6 +3082,18 @@ class PHPMailer
return $body;
}
+ /**
+ * Get the boundaries that this message will use
+ * @return array
+ */
+ public function getBoundaries()
+ {
+ if (empty($this->boundary)) {
+ $this->setBoundaries();
+ }
+ return $this->boundary;
+ }
+
/**
* Return the start of a message boundary.
*
@@ -3705,20 +3749,21 @@ class PHPMailer
* These differ from 'regular' attachments in that they are intended to be
* displayed inline with the message, not just attached for download.
* This is used in HTML messages that embed the images
- * the HTML refers to using the $cid value.
+ * the HTML refers to using the `$cid` value in `img` tags, for example ``.
* Never use a user-supplied path to a file!
*
* @param string $path Path to the attachment
* @param string $cid Content ID of the attachment; Use this to reference
* the content when using an embedded image in HTML
- * @param string $name Overrides the attachment name
- * @param string $encoding File encoding (see $Encoding)
- * @param string $type File MIME type
- * @param string $disposition Disposition to use
- *
- * @throws Exception
+ * @param string $name Overrides the attachment filename
+ * @param string $encoding File encoding (see $Encoding) defaults to `base64`
+ * @param string $type File MIME type (by default mapped from the `$path` filename's extension)
+ * @param string $disposition Disposition to use: `inline` (default) or `attachment`
+ * (unlikely you want this – {@see `addAttachment()`} instead)
*
* @return bool True on successfully adding an attachment
+ * @throws Exception
+ *
*/
public function addEmbeddedImage(
$path,
@@ -4096,12 +4141,8 @@ class PHPMailer
//Is it a valid IPv4 address?
return filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false;
}
- if (filter_var('http://' . $host, FILTER_VALIDATE_URL) !== false) {
- //Is it a syntactically valid hostname?
- return true;
- }
-
- return false;
+ //Is it a syntactically valid hostname (when embeded in a URL)?
+ return filter_var('http://' . $host, FILTER_VALIDATE_URL) !== false;
}
/**
@@ -4170,6 +4211,7 @@ class PHPMailer
* @param string $name Custom header name
* @param string|null $value Header value
*
+ * @return bool True if a header was set successfully
* @throws Exception
*/
public function addCustomHeader($name, $value = null)
@@ -4464,6 +4506,7 @@ class PHPMailer
'ics' => 'text/calendar',
'xml' => 'text/xml',
'xsl' => 'text/xml',
+ 'csv' => 'text/csv',
'wmv' => 'video/x-ms-wmv',
'mpeg' => 'video/mpeg',
'mpe' => 'video/mpeg',
@@ -4571,7 +4614,7 @@ class PHPMailer
public function set($name, $value = '')
{
if (property_exists($this, $name)) {
- $this->$name = $value;
+ $this->{$name} = $value;
return true;
}
@@ -4618,15 +4661,27 @@ class PHPMailer
}
/**
- * Remove trailing breaks from a string.
+ * Remove trailing whitespace from a string.
+ *
+ * @param string $text
+ *
+ * @return string The text to remove whitespace from
+ */
+ public static function stripTrailingWSP($text)
+ {
+ return rtrim($text, " \r\n\t");
+ }
+
+ /**
+ * Strip trailing line breaks from a string.
*
* @param string $text
*
* @return string The text to remove breaks from
*/
- public static function stripTrailingWSP($text)
+ public static function stripTrailingBreaks($text)
{
- return rtrim($text, " \r\n\t");
+ return rtrim($text, "\r\n");
}
/**
@@ -4792,7 +4847,7 @@ class PHPMailer
$body = static::normalizeBreaks($body, self::CRLF);
//Reduce multiple trailing line breaks to a single one
- return static::stripTrailingWSP($body) . self::CRLF;
+ return static::stripTrailingBreaks($body) . self::CRLF;
}
/**
diff --git a/core/class/phpmailer/SMTP.class.php b/core/class/phpmailer/SMTP.class.php
index 5ecad21d..95b0d0bb 100644
--- a/core/class/phpmailer/SMTP.class.php
+++ b/core/class/phpmailer/SMTP.class.php
@@ -35,7 +35,7 @@ class SMTP
*
* @var string
*/
- const VERSION = '6.6.0';
+ const VERSION = '6.7.1';
/**
* SMTP line break constant.
@@ -682,7 +682,6 @@ class SMTP
*/
public function close()
{
- $this->setError('');
$this->server_caps = null;
$this->helo_rply = null;
if (is_resource($this->smtp_conn)) {
@@ -1037,7 +1036,10 @@ class SMTP
return false;
}
- $this->setError('');
+ //Don't clear the error store when using keepalive
+ if ($command !== 'RSET') {
+ $this->setError('');
+ }
return true;
}
diff --git a/core/class/phpmailer/i18n/phpmailer.lang-de.php b/core/class/phpmailer/i18n/phpmailer.lang-de.php
new file mode 100644
index 00000000..e7e59d2b
--- /dev/null
+++ b/core/class/phpmailer/i18n/phpmailer.lang-de.php
@@ -0,0 +1,28 @@
+
+ * @author Crystopher Glodzienski Cardoso
+ */
+
+$PHPMAILER_LANG['authenticate'] = 'Error SMTP: Imposible autentificar.';
+$PHPMAILER_LANG['connect_host'] = 'Error SMTP: Imposible conectar al servidor SMTP.';
+$PHPMAILER_LANG['data_not_accepted'] = 'Error SMTP: Datos no aceptados.';
+$PHPMAILER_LANG['empty_message'] = 'El cuerpo del mensaje está vacío.';
+$PHPMAILER_LANG['encoding'] = 'Codificación desconocida: ';
+$PHPMAILER_LANG['execute'] = 'Imposible ejecutar: ';
+$PHPMAILER_LANG['file_access'] = 'Imposible acceder al archivo: ';
+$PHPMAILER_LANG['file_open'] = 'Error de Archivo: Imposible abrir el archivo: ';
+$PHPMAILER_LANG['from_failed'] = 'La(s) siguiente(s) direcciones de remitente fallaron: ';
+$PHPMAILER_LANG['instantiate'] = 'Imposible crear una instancia de la función Mail.';
+$PHPMAILER_LANG['invalid_address'] = 'Imposible enviar: dirección de email inválido: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mailer no está soportado.';
+$PHPMAILER_LANG['provide_address'] = 'Debe proporcionar al menos una dirección de email de destino.';
+$PHPMAILER_LANG['recipients_failed'] = 'Error SMTP: Los siguientes destinos fallaron: ';
+$PHPMAILER_LANG['signing'] = 'Error al firmar: ';
+$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() falló.';
+$PHPMAILER_LANG['smtp_error'] = 'Error del servidor SMTP: ';
+$PHPMAILER_LANG['variable_set'] = 'No se pudo configurar la variable: ';
+$PHPMAILER_LANG['extension_missing'] = 'Extensión faltante: ';
+$PHPMAILER_LANG['smtp_code'] = 'Código del servidor SMTP: ';
+$PHPMAILER_LANG['smtp_code_ex'] = 'Información adicional del servidor SMTP: ';
+$PHPMAILER_LANG['invalid_header'] = 'Nombre o valor de encabezado no válido';
diff --git a/core/class/phpmailer/phpmailer.lang-fr.php b/core/class/phpmailer/i18n/phpmailer.lang-fr.php
similarity index 100%
rename from core/class/phpmailer/phpmailer.lang-fr.php
rename to core/class/phpmailer/i18n/phpmailer.lang-fr.php
diff --git a/core/class/phpmailer/i18n/phpmailer.lang-it.php b/core/class/phpmailer/i18n/phpmailer.lang-it.php
new file mode 100644
index 00000000..08a6b733
--- /dev/null
+++ b/core/class/phpmailer/i18n/phpmailer.lang-it.php
@@ -0,0 +1,28 @@
+
+ * @author Stefano Sabatini
+ */
+
+$PHPMAILER_LANG['authenticate'] = 'SMTP Error: Impossibile autenticarsi.';
+$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Impossibile connettersi all\'host SMTP.';
+$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: Dati non accettati dal server.';
+$PHPMAILER_LANG['empty_message'] = 'Il corpo del messaggio è vuoto';
+$PHPMAILER_LANG['encoding'] = 'Codifica dei caratteri sconosciuta: ';
+$PHPMAILER_LANG['execute'] = 'Impossibile eseguire l\'operazione: ';
+$PHPMAILER_LANG['file_access'] = 'Impossibile accedere al file: ';
+$PHPMAILER_LANG['file_open'] = 'File Error: Impossibile aprire il file: ';
+$PHPMAILER_LANG['from_failed'] = 'I seguenti indirizzi mittenti hanno generato errore: ';
+$PHPMAILER_LANG['instantiate'] = 'Impossibile istanziare la funzione mail';
+$PHPMAILER_LANG['invalid_address'] = 'Impossibile inviare, l\'indirizzo email non è valido: ';
+$PHPMAILER_LANG['provide_address'] = 'Deve essere fornito almeno un indirizzo ricevente';
+$PHPMAILER_LANG['mailer_not_supported'] = 'Mailer non supportato';
+$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: I seguenti indirizzi destinatari hanno generato un errore: ';
+$PHPMAILER_LANG['signing'] = 'Errore nella firma: ';
+$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() fallita.';
+$PHPMAILER_LANG['smtp_error'] = 'Errore del server SMTP: ';
+$PHPMAILER_LANG['variable_set'] = 'Impossibile impostare o resettare la variabile: ';
+$PHPMAILER_LANG['extension_missing'] = 'Estensione mancante: ';
diff --git a/core/class/phpmailer/i18n/phpmailer.lang-pt.php b/core/class/phpmailer/i18n/phpmailer.lang-pt.php
new file mode 100644
index 00000000..f1ce946e
--- /dev/null
+++ b/core/class/phpmailer/i18n/phpmailer.lang-pt.php
@@ -0,0 +1,27 @@
+
+ */
+
+$PHPMAILER_LANG['authenticate'] = 'Erro do SMTP: Não foi possível realizar a autenticação.';
+$PHPMAILER_LANG['connect_host'] = 'Erro do SMTP: Não foi possível realizar ligação com o servidor SMTP.';
+$PHPMAILER_LANG['data_not_accepted'] = 'Erro do SMTP: Os dados foram rejeitados.';
+$PHPMAILER_LANG['empty_message'] = 'A mensagem no e-mail está vazia.';
+$PHPMAILER_LANG['encoding'] = 'Codificação desconhecida: ';
+$PHPMAILER_LANG['execute'] = 'Não foi possível executar: ';
+$PHPMAILER_LANG['file_access'] = 'Não foi possível aceder o ficheiro: ';
+$PHPMAILER_LANG['file_open'] = 'Abertura do ficheiro: Não foi possível abrir o ficheiro: ';
+$PHPMAILER_LANG['from_failed'] = 'Ocorreram falhas nos endereços dos seguintes remententes: ';
+$PHPMAILER_LANG['instantiate'] = 'Não foi possível iniciar uma instância da função mail.';
+$PHPMAILER_LANG['invalid_address'] = 'Não foi enviado nenhum e-mail para o endereço de e-mail inválido: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mailer não é suportado.';
+$PHPMAILER_LANG['provide_address'] = 'Tem de fornecer pelo menos um endereço como destinatário do e-mail.';
+$PHPMAILER_LANG['recipients_failed'] = 'Erro do SMTP: O endereço do seguinte destinatário falhou: ';
+$PHPMAILER_LANG['signing'] = 'Erro ao assinar: ';
+$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() falhou.';
+$PHPMAILER_LANG['smtp_error'] = 'Erro de servidor SMTP: ';
+$PHPMAILER_LANG['variable_set'] = 'Não foi possível definir ou redefinir a variável: ';
+$PHPMAILER_LANG['extension_missing'] = 'Extensão em falta: ';
diff --git a/core/class/phpmailer/i18n/phpmailer.lang-tr.php b/core/class/phpmailer/i18n/phpmailer.lang-tr.php
new file mode 100644
index 00000000..f938f802
--- /dev/null
+++ b/core/class/phpmailer/i18n/phpmailer.lang-tr.php
@@ -0,0 +1,31 @@
+
+ * @fixed by Boris Yurchenko
+ */
+
+$PHPMAILER_LANG['authenticate'] = 'Помилка SMTP: помилка авторизації.';
+$PHPMAILER_LANG['connect_host'] = 'Помилка SMTP: не вдається під\'єднатися до SMTP-серверу.';
+$PHPMAILER_LANG['data_not_accepted'] = 'Помилка SMTP: дані не прийнято.';
+$PHPMAILER_LANG['encoding'] = 'Невідоме кодування: ';
+$PHPMAILER_LANG['execute'] = 'Неможливо виконати команду: ';
+$PHPMAILER_LANG['file_access'] = 'Немає доступу до файлу: ';
+$PHPMAILER_LANG['file_open'] = 'Помилка файлової системи: не вдається відкрити файл: ';
+$PHPMAILER_LANG['from_failed'] = 'Невірна адреса відправника: ';
+$PHPMAILER_LANG['instantiate'] = 'Неможливо запустити функцію mail().';
+$PHPMAILER_LANG['provide_address'] = 'Будь ласка, введіть хоча б одну email-адресу отримувача.';
+$PHPMAILER_LANG['mailer_not_supported'] = ' - поштовий сервер не підтримується.';
+$PHPMAILER_LANG['recipients_failed'] = 'Помилка SMTP: не вдалося відправлення для таких отримувачів: ';
+$PHPMAILER_LANG['empty_message'] = 'Пусте повідомлення';
+$PHPMAILER_LANG['invalid_address'] = 'Не відправлено через неправильний формат email-адреси: ';
+$PHPMAILER_LANG['signing'] = 'Помилка підпису: ';
+$PHPMAILER_LANG['smtp_connect_failed'] = 'Помилка з\'єднання з SMTP-сервером';
+$PHPMAILER_LANG['smtp_error'] = 'Помилка SMTP-сервера: ';
+$PHPMAILER_LANG['variable_set'] = 'Неможливо встановити або скинути змінну: ';
+$PHPMAILER_LANG['extension_missing'] = 'Розширення відсутнє: ';
diff --git a/core/core.php b/core/core.php
index 7d141e6e..c76e4ffa 100644
--- a/core/core.php
+++ b/core/core.php
@@ -1106,6 +1106,7 @@ class common
$layout = ob_get_clean();
$mail = new PHPMailer\PHPMailer\PHPMailer;
$mail->CharSet = 'UTF-8';
+ $mail->setLanguage(substr(self::$i18nUI, 0, 2), 'core/class/phpmailer/i18n/');
// Mail
try {
// Paramètres SMTP perso