diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index 58579266c..fc24d5ccc 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -418,6 +418,7 @@ return array( 'Combodo\\iTop\\Core\\Email\\EmailFactory' => $baseDir . '/sources/Core/Email/EmailFactory.php', 'Combodo\\iTop\\Core\\Email\\Transport\\SymfonyFileTransport' => $baseDir . '/sources/Core/Email/Transport/SymfonyFileTransport.php', 'Combodo\\iTop\\Core\\Email\\Transport\\SymfonyOAuthTransport' => $baseDir . '/sources/Core/Email/Transport/SymfonyOAuthTransport.php', + 'Combodo\\iTop\\Core\\Email\\Transport\\SymfonyPHPMailTransport' => $baseDir . '/sources/Core/Email/Transport/SymfonyPHPMailTransport.php', 'Combodo\\iTop\\Core\\Email\\iEMail' => $baseDir . '/sources/Core/Email/iEMail.php', 'Combodo\\iTop\\Core\\EventListener\\AttributeBlobEventListener' => $baseDir . '/sources/Core/EventListener/AttributeBlobEventListener.php', 'Combodo\\iTop\\Core\\Kpi\\KpiLogData' => $baseDir . '/sources/Core/Kpi/KpiLogData.php', diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php index 0a5b6a267..533c6d415 100644 --- a/lib/composer/autoload_static.php +++ b/lib/composer/autoload_static.php @@ -773,6 +773,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'Combodo\\iTop\\Core\\Email\\EmailFactory' => __DIR__ . '/../..' . '/sources/Core/Email/EmailFactory.php', 'Combodo\\iTop\\Core\\Email\\Transport\\SymfonyFileTransport' => __DIR__ . '/../..' . '/sources/Core/Email/Transport/SymfonyFileTransport.php', 'Combodo\\iTop\\Core\\Email\\Transport\\SymfonyOAuthTransport' => __DIR__ . '/../..' . '/sources/Core/Email/Transport/SymfonyOAuthTransport.php', + 'Combodo\\iTop\\Core\\Email\\Transport\\SymfonyPHPMailTransport' => __DIR__ . '/../..' . '/sources/Core/Email/Transport/SymfonyPHPMailTransport.php', 'Combodo\\iTop\\Core\\Email\\iEMail' => __DIR__ . '/../..' . '/sources/Core/Email/iEMail.php', 'Combodo\\iTop\\Core\\EventListener\\AttributeBlobEventListener' => __DIR__ . '/../..' . '/sources/Core/EventListener/AttributeBlobEventListener.php', 'Combodo\\iTop\\Core\\Kpi\\KpiLogData' => __DIR__ . '/../..' . '/sources/Core/Kpi/KpiLogData.php', diff --git a/sources/Core/Email/EmailSymfony.php b/sources/Core/Email/EmailSymfony.php index 21c961125..1e648cf10 100644 --- a/sources/Core/Email/EmailSymfony.php +++ b/sources/Core/Email/EmailSymfony.php @@ -12,6 +12,7 @@ use AsyncSendEmail; use Combodo\iTop\Core\Authentication\Client\OAuth\OAuthClientProviderFactory; use Combodo\iTop\Core\Email\Transport\SymfonyFileTransport; use Combodo\iTop\Core\Email\Transport\SymfonyOAuthTransport; +use Combodo\iTop\Core\Email\Transport\SymfonyPHPMailTransport; use DOMDocument; use DOMXPath; use EMail; @@ -232,7 +233,7 @@ class EMailSymfony extends Email case 'PHPMail': default: // Use sendmail transport - $oTransport = Transport::fromDsn('sendmail://default'); + $oTransport = new SymfonyPHPMailTransport(); $oMailer = new Mailer($oTransport); } diff --git a/sources/Core/Email/Transport/SymfonyPHPMailTransport.php b/sources/Core/Email/Transport/SymfonyPHPMailTransport.php new file mode 100644 index 000000000..6c969c598 --- /dev/null +++ b/sources/Core/Email/Transport/SymfonyPHPMailTransport.php @@ -0,0 +1,98 @@ +getHeaders(); + + return $oHeaders->get('To')->getBodyAsString(); + } + + /** + * @param Email $oRawEmail + * + * @return string + */ + private function prepareSubject(Email $oRawEmail): string + { + $oHeaders = $oRawEmail->getHeaders(); + return $oHeaders->get('Subject')->getBodyAsString(); + } + + + /** + * @param Email $oRawEmail + * + * @return string + */ + public function prepareBody(Email $oRawEmail): string + { + return $oRawEmail->getBody() ? $oRawEmail->getBody()->bodyToString() : ''; + } + + /** + * @param Email $oRawEmail + * + * @return string + */ + public function prepareHeaders(Email $oRawEmail): string + { + $oHeaders = $oRawEmail->getPreparedHeaders(); + // Render all headers except "To" (mail() has a dedicated argument for that), including body headers + $sHeaders = ''; + foreach ($oHeaders->all() as $header) { + if (strtolower($header->getName()) !== 'to' && strtolower($header->getName()) !== 'subject') { + $sHeaders .= $header->toString() . "\r\n"; + } + } + + $oBodyHeader = $oRawEmail->getBody()->getPreparedHeaders(); + foreach ($oBodyHeader->all() as $header) { + $sHeaders .= $header->toString() . "\r\n"; + } + + // Remove trailing line break + $sHeaders = rtrim($sHeaders, "\r\n"); + return $sHeaders; + } + + protected function doSend(SentMessage $message): void + { + $oRawEmail = $message->getOriginalMessage(); + + if (!$oRawEmail instanceof Email) { + throw new \LogicException('SymfonyPHPMailTransport only supports Email instances.'); + } + + $sTo = $this->prepareTo($oRawEmail); + $sSubject = $this->prepareSubject($oRawEmail); + $sBody = $this->prepareBody($oRawEmail); + $sHeaders = $this->prepareHeaders($oRawEmail); + + $success = mail($sTo, $sSubject, $sBody, $sHeaders); + + + if (!$success) { + throw new \RuntimeException('The mail() function failed to send the message. Check server mail configuration.'); + } + } + + public function __toString(): string + { + return 'phpmail://default'; + } +} \ No newline at end of file