From 50596a358e5225a1389809502d51a33bf447e29e Mon Sep 17 00:00:00 2001 From: Roland Gruber Date: Tue, 10 Mar 2020 21:08:20 +0100 Subject: [PATCH] new mail server options --- lam/help/help.inc | 2 - lam/lib/account.inc | 93 ++++++++++++++++------------- lam/lib/config.inc | 8 +-- lam/templates/config/mainmanage.php | 8 --- lam/tests/lib/LAMCfgMainTest.php | 4 +- 5 files changed, 55 insertions(+), 60 deletions(-) diff --git a/lam/help/help.inc b/lam/help/help.inc index fee47b77..c3faaa3c 100644 --- a/lam/help/help.inc +++ b/lam/help/help.inc @@ -161,8 +161,6 @@ $helpArray = array ( "Text" => _("This is a list of IP addresses from hosts who may access LAM. You can use \"*\" as wildcard (e.g. 192.168.0.*).")), "242" => array ("Headline" => _("Password policy"), "Text" => _("Here you can specify minimum requirements for passwords. The character classes are: lowercase, uppercase, numeric and symbols.")), - "243" => array ("Headline" => _('Email format'), - "Text" => _('Please change this setting only if you experience problems in receiving emails from LAM. This defines the line ending of emails.')), "244" => array ("Headline" => _('PHP error reporting'), "Text" => _('Defines if the PHP error reporting setting from php.ini is used or the setting preferred by LAM ("E_ALL & ~E_NOTICE"). If you do not develop LAM modules please use the default. This will prevent displaying messages that are useful only for developers.')), "245" => array ("Headline" => _('Encrypt session'), diff --git a/lam/lib/account.inc b/lam/lib/account.inc index 91098b0e..786ada2d 100644 --- a/lam/lib/account.inc +++ b/lam/lib/account.inc @@ -1282,9 +1282,7 @@ function sendPasswordMail($pwd, $user, $recipient = null) { $body = str_replace('@@' . $attr . '@@', $value, $body); $found = preg_match('/\@\@[^\@]+\@\@/', $body, $results); } - $headerLines = createEMailHeaders($mailFrom, ($mailIsHTML == 'true'), $mailReplyTo); - $returnPath = empty($mailReplyTo) ? $mailFrom : $mailReplyTo; - $success = sendEMail($mailTo, $subject, $body, $headerLines, $returnPath); + $success = sendEMail($mailTo, $subject, $body, $mailFrom, ($mailIsHTML == 'true'), $mailReplyTo); if ($success) { logNewMessage(LOG_DEBUG, 'Sent password mail to ' . $mailTo); return array( @@ -1310,7 +1308,7 @@ function sendPasswordMail($pwd, $user, $recipient = null) { * @return String header lines */ function createEMailHeaders($from, $isHTML, $replyTo = null, $cc = null, $bcc = null) { - $headerLines = "X-Mailer: LDAP Account Manager\r\n"; + $headerLines = ""; if (!empty($from)) { $headerLines .= 'From: ' . encodeMailAddress($from) . "\r\n"; } @@ -1333,51 +1331,66 @@ function createEMailHeaders($from, $isHTML, $replyTo = null, $cc = null, $bcc = return $headerLines; } -/** - * Encodes the email address for the header part of an email. - * - * @param String $address email address - * @return String encoded mail address - */ -function encodeMailAddress($address) { - $matches = array(); - // if the email contains a name part then base64 encode it - if (preg_match('/^(.*)<(.*)>$/', $address, $matches)) { - return base64EncodeForEMail($matches[1]) . ' <' . $matches[2] . '>'; - } - return $address; -} - -/** - * Returns a base64 encoded string of the given values in a format that is used in emails. - * - * @param String $value value to encode - * @return String base64 encoded value - */ -function base64EncodeForEMail($value) { - return '=?UTF-8?B?' . base64_encode($value) . '?='; -} - /** * Sends out an email. * * @param String $to TO address * @param String $subject email subject * @param String $text mail body (with \r\n EOL) - * @param String $headers header lines (with \r\n EOL) - * @param string $returnPath email to be used for return path + * @param String $from FROM address + * @param bool $isHTML HTML format + * @param String $replyTo REPLY-TO address (optional) + * @param String $cc CC address (optional) + * @param String $bcc BCC address (optional) */ -function sendEMail($to, $subject, $text, $headers, $returnPath) { - if (!empty($_SESSION['cfgMain']->mailEOL) && ($_SESSION['cfgMain']->mailEOL === 'unix')) { - $text = str_replace("\r\n", "\n", $text); - $headers = str_replace("\r\n", "\n", $headers); - } +function sendEMail($to, $subject, $text, $from, $isHTML, $replyTo = null, $cc = null, $bcc = null) { + include_once __DIR__ . '/3rdParty/composer/autoload.php'; + $returnPath = ($replyTo === null) ? $from : $replyTo; + $returnPathParsed = PHPMailer\PHPMailer\PHPMailer::parseAddresses($returnPath); logNewMessage(LOG_DEBUG, "Send mail to $to\n" . $text); - $additionalParams = null; - if (!empty($returnPath) && isCommandlineSafeEmailAddress($returnPath)) { - $additionalParams = '-f' . $returnPath; + $mailer = new PHPMailer\PHPMailer\PHPMailer(true); + try { + $cfgMain = $_SESSION['cfgMain']; + if (!empty($cfgMain->mailServer)) { + $mailer->isSMTP(); + $serverParts = explode(':', $cfgMain->mailServer); + $mailer->Host = $serverParts[0]; + $mailer->Port = $serverParts[1]; + if (!empty($cfgMain->mailUser)) { + $mailer->SMTPAuth = true; + $mailer->Username = $cfgMain->mailUser; + $mailer->Password = $cfgMain->mailPassword; + $mailer->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS; + } + } + $mailer->CharSet = PHPMailer\PHPMailer\PHPMailer::CHARSET_UTF8; + $mailer->addAddress($to); + $mailer->Subject = $subject; + $mailer->Body = $text; + $mailer->Sender = $returnPathParsed[0]['address']; + $fromParsed = PHPMailer\PHPMailer\PHPMailer::parseAddresses($from); + $mailer->setFrom($fromParsed[0]['address'], $fromParsed[0]['name']); + $mailer->isHTML($isHTML); + if (!empty($replyTo)) { + $replyToParsed = PHPMailer\PHPMailer\PHPMailer::parseAddresses($replyTo); + $mailer->addReplyTo($replyToParsed[0]['address'], $replyToParsed[0]['name']); + } + if (!empty($cc)) { + $ccParsed = PHPMailer\PHPMailer\PHPMailer::parseAddresses($cc); + $mailer->addCC($ccParsed[0]['address'], $ccParsed[0]['name']); + } + if (!empty($bcc)) { + $bccParsed = PHPMailer\PHPMailer\PHPMailer::parseAddresses($bcc); + $mailer->addBCC($bccParsed[0]['address'], $bccParsed[0]['name']); + } + $mailer->XMailer = 'LDAP Account Manager'; + $mailer->send(); + return true; + } + catch (Exception $e) { + logNewMessage(LOG_ERR, 'Mail sending failed: ' . $e->getMessage()); + return false; } - return mail($to, base64EncodeForEMail($subject), $text, $headers, $additionalParams); } /** diff --git a/lam/lib/config.inc b/lam/lib/config.inc index 409553bf..8637d8e0 100644 --- a/lam/lib/config.inc +++ b/lam/lib/config.inc @@ -2611,9 +2611,6 @@ class LAMCfgMain { /** SSL certificate should be deleted on save() */ private $delSSLCaCert = false; - /** EOL for emails (default/unix) */ - public $mailEOL = 'default'; - /** error reporting */ public $errorReporting = self::ERROR_REPORTING_DEFAULT; @@ -2636,7 +2633,7 @@ class LAMCfgMain { "passwordMinClasses", "passwordMinSymbol", 'checkedRulesCount', 'passwordMustNotContainUser', 'passwordMustNotContain3Chars', 'externalPwdCheckUrl', - "mailEOL", 'errorReporting', 'encryptSession', 'allowedHostsSelfService', + 'errorReporting', 'encryptSession', 'allowedHostsSelfService', 'license', 'mailServer', 'mailUser', 'mailPassword' ); @@ -2780,9 +2777,6 @@ class LAMCfgMain { if (!in_array("externalPwdCheckUrl", $saved)) { array_push($file_array, "\n\n" . "externalPwdCheckUrl: " . $this->externalPwdCheckUrl); } - if (!in_array("mailEOL", $saved)) { - array_push($file_array, "\n\n# Email format (default/unix)\n" . "mailEOL: " . $this->mailEOL); - } if (!in_array("errorReporting", $saved)) { array_push($file_array, "\n\n# PHP error reporting (default/system)\n" . "errorReporting: " . $this->errorReporting); } diff --git a/lam/templates/config/mainmanage.php b/lam/templates/config/mainmanage.php index 633e4daf..dc669aa7 100644 --- a/lam/templates/config/mainmanage.php +++ b/lam/templates/config/mainmanage.php @@ -245,7 +245,6 @@ if (isset($_POST['submitFormData'])) { } // mail EOL if (isLAMProVersion()) { - $cfg->mailEOL = $_POST['mailEOL']; $cfg->mailUser = $_POST['mailUser']; $cfg->mailPassword = $_POST['mailPassword']; $cfg->mailServer = $_POST['mailServer']; @@ -468,13 +467,6 @@ printHeaderContents(_("Edit general settings"), '../..'); $mailPassword = new htmlResponsiveInputField(_("Password"), 'mailPassword', $cfg->mailPassword, '255'); $mailPassword->setIsPassword(true); $row->add($mailPassword, 12); - $mailEOLOptions = array( - _('Default (\r\n)') => 'default', - _('Non-standard (\n)') => 'unix' - ); - $mailEOLSelect = new htmlResponsiveSelect('mailEOL', $mailEOLOptions, array($cfg->mailEOL), _('Email format'), '243'); - $mailEOLSelect->setHasDescriptiveElements(true); - $row->add($mailEOLSelect, 12); } $row->addVerticalSpacer('3rem'); diff --git a/lam/tests/lib/LAMCfgMainTest.php b/lam/tests/lib/LAMCfgMainTest.php index 207759d4..827c3213 100644 --- a/lam/tests/lib/LAMCfgMainTest.php +++ b/lam/tests/lib/LAMCfgMainTest.php @@ -28,7 +28,7 @@ include_once __DIR__ . '/../../lib/config.inc'; * * @author Roland Gruber */ -class LAMConfigTest extends TestCase { +class LAMCfgMainTest extends TestCase { private $conf; private $file; @@ -59,7 +59,6 @@ class LAMConfigTest extends TestCase { * Mail related settings */ public function testMail() { - $this->conf->mailEOL = 'unix123'; $this->conf->mailServer = 'server:123'; $this->conf->mailPassword = 'pwd123'; $this->conf->mailUser = 'user123'; @@ -67,7 +66,6 @@ class LAMConfigTest extends TestCase { $this->conf->save(); $this->conf = new LAMCfgMain($this->file); - $this->assertEquals('unix123', $this->conf->mailEOL); $this->assertEquals('server:123', $this->conf->mailServer); $this->assertEquals('pwd123', $this->conf->mailPassword); $this->assertEquals('user123', $this->conf->mailUser);