N°7920 - Replace Symfony sendmail transport with PHP mail() transport

This commit is contained in:
Stephen Abello
2025-09-22 16:24:58 +02:00
parent 1f4a2f0f56
commit 4ed21dc21a
4 changed files with 102 additions and 1 deletions

View File

@@ -419,6 +419,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',

View File

@@ -784,6 +784,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',

View File

@@ -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);
}

View File

@@ -0,0 +1,98 @@
<?php
namespace Combodo\iTop\Core\Email\Transport;
use Symfony\Component\Mailer\SentMessage;
use Symfony\Component\Mailer\Transport\AbstractTransport;
use Symfony\Component\Mime\Email;
/**
* Transport that uses PHP's mail() function to send emails
*/
class SymfonyPHPMailTransport extends AbstractTransport
{
/**
* @param Email $oRawEmail
*
* @return string
*/
public function prepareTo(Email $oRawEmail): string
{
$oHeaders = $oRawEmail->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';
}
}