desc('Mails worker') ->inject('message') ->inject('register') ->inject('log') ->callback(fn (Message $message, Registry $register, Log $log) => $this->action($message, $register, $log)); } /** * @param Message $message * @param Registry $register * @param Log $log * @throws \PHPMailer\PHPMailer\Exception * @return void * @throws Exception */ public function action(Message $message, Registry $register, Log $log): void { Runtime::setHookFlags(SWOOLE_HOOK_ALL ^ SWOOLE_HOOK_TCP); $payload = $message->getPayload() ?? []; if (empty($payload)) { throw new Exception('Missing payload'); } $smtp = $payload['smtp']; if (empty($smtp) && empty(App::getEnv('_APP_SMTP_HOST'))) { throw new Exception('Skipped mail processing. No SMTP configuration has been set.'); } $log->addTag('type', empty($smtp) ? 'cloud' : 'smtp'); $protocol = App::getEnv('_APP_OPTIONS_FORCE_HTTPS') == 'disabled' ? 'http' : 'https'; $hostname = App::getEnv('_APP_DOMAIN'); $recipient = $payload['recipient']; $subject = $payload['subject']; $variables = $payload['variables']; $variables['host'] = $protocol . '://' . $hostname; $name = $payload['name']; $body = $payload['body']; $variables['subject'] = $subject; $variables['year'] = date("Y"); $attachment = $payload['attachment'] ?? []; $bodyTemplate = $payload['bodyTemplate']; if (empty($bodyTemplate)) { $bodyTemplate = __DIR__ . '/../../../../app/config/locale/templates/email-base.tpl'; } $bodyTemplate = Template::fromFile($bodyTemplate); $bodyTemplate->setParam('{{body}}', $body, escapeHtml: false); foreach ($variables as $key => $value) { // TODO: hotfix for redirect param $bodyTemplate->setParam('{{' . $key . '}}', $value, escapeHtml: $key !== 'redirect'); } $body = $bodyTemplate->render(); $subjectTemplate = Template::fromString($subject); foreach ($variables as $key => $value) { $subjectTemplate->setParam('{{' . $key . '}}', $value); } // render() will return the subject in
tags, so use strip_tags() to remove them $subject = \strip_tags($subjectTemplate->render()); /** @var PHPMailer $mail */ $mail = empty($smtp) ? $register->get('smtp') : $this->getMailer($smtp); $mail->clearAddresses(); $mail->clearAllRecipients(); $mail->clearReplyTos(); $mail->clearAttachments(); $mail->clearBCCs(); $mail->clearCCs(); $mail->addAddress($recipient, $name); $mail->Subject = $subject; $mail->Body = $body; $mail->AltBody = $body; $mail->AltBody = preg_replace('/