Files
mrbs-equbao-2026/web/lib/MRBS/Mailer.php
T
人事系统开发 48092cab42
Docker image / push (push) Canceled after 0s
MRBS 1.12.2 等保2.0二级整改完整提交
包含:登录失败锁定、90天密码有效期、30分钟会话超时、
强制改密、登录审计日志、屏幕水印、企业背景图、
备案信息固定底部、favicon、登录页JS修复等全部改动
2026-09-08 21:19:47 +08:00

157 lines
4.2 KiB
PHP

<?php
declare(strict_types=1);
namespace MRBS;
use Email\Parse;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\PHPMailer;
/**
* A wrapper for PHPMailer
*/
class Mailer extends PHPMailer
{
/**
* @throws Exception
*/
public function __construct(array $mail_settings, array $sendmail_settings, array $smtp_settings, ?bool $exceptions = null)
{
parent::__construct($exceptions);
// Set the Auto-Submitted header as this mailer will only be used for automatically
// generated emails (e.g. booking notifications and error logging).
$this->addCustomHeader('Auto-Submitted', 'auto-generated');
switch ($mail_settings['admin_backend'])
{
case 'mail':
$this->isMail();
break;
case 'qmail':
$this->isQmail();
if (isset($mail_settings['qmail']['qmail-inject-path']))
{
$this->Sendmail = $mail_settings['qmail']['qmail-inject-path'];
}
break;
case 'sendmail':
$this->isSendmail();
$this->Sendmail = $sendmail_settings['path'];
if (isset($sendmail_settings['args']) && ($sendmail_settings['args'] !== ''))
{
$this->Sendmail .= ' ' . $sendmail_settings['args'];
}
break;
case 'smtp':
$this->isSMTP();
$this->Host = $smtp_settings['host'];
$this->Port = $smtp_settings['port'];
$this->SMTPAuth = $smtp_settings['auth'];
$this->SMTPSecure = $smtp_settings['secure'];
$this->Username = $smtp_settings['username'];
$this->Password = $smtp_settings['password'];
$this->Hostname = $smtp_settings['hostname'];
$this->Helo = $smtp_settings['helo'];
if ($smtp_settings['disable_opportunistic_tls'])
{
$this->SMTPAutoTLS = false;
}
$this->SMTPOptions = array
(
'ssl' => array
(
'verify_peer' => $smtp_settings['ssl_verify_peer'],
'verify_peer_name' => $smtp_settings['ssl_verify_peer_name'],
'allow_self_signed' => $smtp_settings['ssl_allow_self_signed']
)
);
break;
default:
$this->isMail();
trigger_error("Unknown mail backend '" . $mail_settings['admin_backend'] . "'." .
" Defaulting to 'mail'.",
E_USER_WARNING);
break;
}
}
/**
* Sets a series of To addresses
* @param string $address_string an RFC822 address string
* @throws Exception
*/
public function addAddressesRFC822(string $address_string) : bool
{
$parser = new Parse(new Logger());
$parsed_addresses = $parser->parse($address_string);
foreach ($parsed_addresses['email_addresses'] as $parsed_address)
{
if (false === ($name_and_address = $this->getNameAndAddress($parsed_address)))
{
return false;
}
if (false === $this->addAddress($name_and_address['address'], $name_and_address['name']))
{
return false;
}
}
return true;
}
/**
* Sets a From address
* @param string $address an RFC822 address
* @throws Exception
*/
public function setFromRFC822(string $address, bool $auto=true) : bool
{
$parser = new Parse(new Logger());
$parsed_address = $parser->parse($address, false);
if (false === ($name_and_address = $this->getNameAndAddress($parsed_address)))
{
return false;
}
return $this->setFrom($name_and_address['address'], $name_and_address['name'], $auto);
}
/**
* Form a name and address from the output of the address parser
*
* @param array $parsed_address the output of MRBS\Email\Parse->parse()
* @return array|false
* @throws Exception
*/
private function getNameAndAddress(array $parsed_address)
{
if ($parsed_address['invalid'])
{
$error_message = "Invalid email address '" . $parsed_address['original_address'] . "': " . $parsed_address['invalid_reason'];
$this->setError($error_message);
$this->edebug($error_message);
if ($this->exceptions) {
throw new Exception($error_message);
}
return false;
}
return [
'name' => $parsed_address['name_parsed'],
'address' => $parsed_address['local_part_parsed'] . '@' . $parsed_address['domain_part']
];
}
}