Skip to content

Commit de8f4a8

Browse files
committed
MailConstructor
1 parent 9d07526 commit de8f4a8

4 files changed

Lines changed: 61 additions & 19 deletions

File tree

config/services/builders.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ services:
4242
Core.EmailBuilder.campaign:
4343
class: PhpList\Core\Domain\Messaging\Service\Builder\EmailBuilder
4444
arguments:
45-
$mailConstructor: '@PhpList\Core\Domain\Messaging\Service\Constructor\CampaignMailConstructor'
45+
$mailConstructor: '@MailConstructor'
4646
$googleSenderId: '%messaging.google_sender_id%'
4747
$useAmazonSes: '%messaging.use_amazon_ses%'
4848
$usePrecedenceHeader: '%messaging.use_precedence_header%'

src/Domain/Configuration/Model/ConfigOption.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,5 @@ enum ConfigOption: string
3737
case PageRoot = 'pageroot';
3838
case OrganisationName = 'organisation_name';
3939
case VCardUrl = 'vcardurl';
40+
case HtmlEmailStyle = 'html_email_style';
4041
}

src/Domain/Messaging/MessageHandler/CampaignProcessorMessageHandler.php

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
use DateTimeImmutable;
99
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
1010
use Doctrine\ORM\EntityManagerInterface;
11-
use PhpList\Core\Domain\Configuration\Model\OutputFormat;
12-
use PhpList\Core\Domain\Configuration\Service\UserPersonalizer;
1311
use PhpList\Core\Domain\Messaging\Exception\MessageCacheMissingException;
1412
use PhpList\Core\Domain\Messaging\Exception\MessageSizeLimitExceededException;
1513
use PhpList\Core\Domain\Messaging\Message\CampaignProcessorMessage;
@@ -23,6 +21,7 @@
2321
use PhpList\Core\Domain\Messaging\Repository\MessageRepository;
2422
use PhpList\Core\Domain\Messaging\Repository\UserMessageRepository;
2523
use PhpList\Core\Domain\Messaging\Service\Builder\EmailBuilder;
24+
use PhpList\Core\Domain\Messaging\Service\Constructor\MailConstructor;
2625
use PhpList\Core\Domain\Messaging\Service\Handler\RequeueHandler;
2726
use PhpList\Core\Domain\Messaging\Service\MailSizeChecker;
2827
use PhpList\Core\Domain\Messaging\Service\MaxProcessTimeLimiter;
@@ -64,10 +63,10 @@ public function __construct(
6463
private readonly SubscriberHistoryManager $subscriberHistoryManager,
6564
private readonly MessageRepository $messageRepository,
6665
private readonly MessagePrecacheService $precacheService,
67-
private readonly UserPersonalizer $userPersonalizer,
6866
private readonly MessageDataLoader $messageDataLoader,
6967
private readonly EmailBuilder $emailBuilder,
7068
private readonly MailSizeChecker $mailSizeChecker,
69+
private readonly MailConstructor $mailConstructor,
7170
private readonly string $messageEnvelope,
7271
) {
7372
}
@@ -200,22 +199,10 @@ private function handleEmailSending(
200199
cachedMessageDto: $precachedContent,
201200
subscriber: $subscriber
202201
);
203-
$processed->textContent = $this->userPersonalizer->personalize(
204-
value: $processed->textContent,
205-
email: $subscriber->getEmail(),
206-
format:OutputFormat::Text,
207-
messageId: $campaign->getId(),
208-
);
209-
$processed->footer = $this->userPersonalizer->personalize(
210-
value: $processed->footer,
211-
email: $subscriber->getEmail(),
212-
format: OutputFormat::Text,
213-
messageId: $campaign->getId(),
214-
);
215202

216203
try {
217204
// todo: use correct service
218-
$email = $this->rateLimitedCampaignMailer->composeEmail(
205+
$email = $this->mailConstructor->build(
219206
message: $campaign,
220207
subscriber: $subscriber,
221208
messagePrecacheDto: $processed

src/Domain/Messaging/Service/Constructor/PersonalizedContentConstructor.php renamed to src/Domain/Messaging/Service/Constructor/MailConstructor.php

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@
44

55
namespace PhpList\Core\Domain\Messaging\Service\Constructor;
66

7+
use PhpList\Core\Domain\Common\Html2Text;
78
use PhpList\Core\Domain\Common\RemotePageFetcher;
9+
use PhpList\Core\Domain\Common\TextParser;
10+
use PhpList\Core\Domain\Configuration\Model\ConfigOption;
811
use PhpList\Core\Domain\Configuration\Service\Manager\EventLogManager;
12+
use PhpList\Core\Domain\Configuration\Service\Provider\ConfigProvider;
913
use PhpList\Core\Domain\Configuration\Service\UserPersonalizer;
1014
use PhpList\Core\Domain\Messaging\Exception\RemotePageFetchException;
1115
use PhpList\Core\Domain\Messaging\Model\Dto\MessagePrecacheDto;
@@ -14,28 +18,78 @@
1418
use PhpList\Core\Domain\Subscription\Repository\SubscriberRepository;
1519
use Symfony\Component\Mime\Email;
1620
// todo: check this class
17-
class PersonalizedContentConstructor
21+
class MailConstructor
1822
{
1923
public function __construct(
2024
private readonly SubscriberRepository $subscriberRepository,
2125
private readonly RemotePageFetcher $remotePageFetcher,
2226
private readonly EventLogManager $eventLogManager,
27+
private readonly ConfigProvider $configProvider,
28+
private readonly Html2Text $html2Text,
29+
private readonly TextParser $textParser,
2330
private readonly UserPersonalizer $userPersonalizer,
31+
private readonly bool $forwardAlternativeContent,
2432
) {
2533
}
2634

2735
public function build(
2836
Message $message,
2937
Subscriber $subscriber,
3038
MessagePrecacheDto $messagePrecacheDto,
39+
?string $hash = null
3140
): Email {
32-
$content = $messagePrecacheDto->content;
41+
$defaultstyle = $this->configProvider->getValue(ConfigOption::HtmlEmailStyle);
42+
$adddefaultstyle = 0;
3343

44+
$content = $messagePrecacheDto->content;
45+
$text = [];
46+
$html = [];
3447
if ($messagePrecacheDto->userSpecificUrl) {
3548
$userData = $this->subscriberRepository->getDataById($subscriber->getId());
3649
$this->replaceUserSpecificRemoteContent($messagePrecacheDto, $subscriber, $userData);
3750
}
3851

52+
if ($hash !== 'forwarded') {
53+
$text['footer'] = $messagePrecacheDto->textFooter;
54+
$html['footer'] = $messagePrecacheDto->htmlFooter;
55+
} else {
56+
//0013076: different content when forwarding 'to a friend'
57+
if ($this->forwardAlternativeContent) {
58+
$text['footer'] = stripslashes($messagePrecacheDto->footer);
59+
} else {
60+
$text['footer'] = $this->configProvider->getValue(ConfigOption::ForwardFooter);
61+
}
62+
$html['footer'] = $text['footer'];
63+
}
64+
65+
$hasText = !empty($messagePrecacheDto->textContent);
66+
if ($messagePrecacheDto->htmlFormatted) {
67+
$textcontent = $hasText ? $messagePrecacheDto->textContent : ($this->html2Text)($content);
68+
$htmlcontent = $content;
69+
} else {
70+
$textcontent = $hasText ? $content : $messagePrecacheDto->textContent;
71+
$htmlcontent = ($this->textParser)($content);
72+
}
73+
74+
if ($messagePrecacheDto->template) {
75+
// template used
76+
// use only the content of the body element if it is present
77+
if (preg_match('|<body.*?>(.+)</body>|is', $htmlcontent, $matches)) {
78+
$htmlcontent = $matches[1];
79+
}
80+
$htmlmessage = str_replace('[CONTENT]', $htmlcontent, $messagePrecacheDto->template);
81+
} else {
82+
// no template used
83+
$htmlmessage = $htmlcontent;
84+
$adddefaultstyle = 1;
85+
}
86+
if ($messagePrecacheDto->templateText) {
87+
// text template used
88+
$textmessage = str_replace('[CONTENT]', $textcontent, $messagePrecacheDto->templateText);
89+
} else {
90+
// no text template used
91+
$textmessage = $textcontent;
92+
}
3993

4094

4195
$mail = new Email();

0 commit comments

Comments
 (0)