1515use PhpList \Core \Domain \Messaging \Repository \MessageRepository ;
1616use PhpList \Core \Domain \Messaging \Repository \UserMessageRepository ;
1717use PhpList \Core \Domain \Messaging \Service \Handler \RequeueHandler ;
18+ use PhpList \Core \Domain \Messaging \Service \Manager \MessageDataManager ;
1819use PhpList \Core \Domain \Messaging \Service \MaxProcessTimeLimiter ;
1920use PhpList \Core \Domain \Messaging \Service \MessageProcessingPreparator ;
2021use PhpList \Core \Domain \Messaging \Service \RateLimitedCampaignMailer ;
2324use PhpList \Core \Domain \Subscription \Service \Manager \SubscriberHistoryManager ;
2425use PhpList \Core \Domain \Subscription \Service \Provider \SubscriberProvider ;
2526use Psr \Log \LoggerInterface ;
27+ use Psr \SimpleCache \CacheInterface ;
2628use Symfony \Component \Messenger \Attribute \AsMessageHandler ;
2729use Symfony \Component \Mime \Email ;
2830use Symfony \Contracts \Translation \TranslatorInterface ;
3537#[AsMessageHandler]
3638class CampaignProcessorMessageHandler
3739{
38- private RateLimitedCampaignMailer $ mailer ;
39- private EntityManagerInterface $ entityManager ;
40- private SubscriberProvider $ subscriberProvider ;
41- private MessageProcessingPreparator $ messagePreparator ;
42- private LoggerInterface $ logger ;
43- private UserMessageRepository $ userMessageRepository ;
44- private MaxProcessTimeLimiter $ timeLimiter ;
45- private RequeueHandler $ requeueHandler ;
46- private TranslatorInterface $ translator ;
47- private SubscriberHistoryManager $ subscriberHistoryManager ;
48- private MessageRepository $ messageRepository ;
49- private EventLogManager $ eventLogManager ;
5040 private ?int $ maxMailSize ;
5141
5242 public function __construct (
53- RateLimitedCampaignMailer $ mailer ,
54- EntityManagerInterface $ entityManager ,
55- SubscriberProvider $ subscriberProvider ,
56- MessageProcessingPreparator $ messagePreparator ,
57- LoggerInterface $ logger ,
58- UserMessageRepository $ userMessageRepository ,
59- MaxProcessTimeLimiter $ timeLimiter ,
60- RequeueHandler $ requeueHandler ,
61- TranslatorInterface $ translator ,
62- SubscriberHistoryManager $ subscriberHistoryManager ,
63- MessageRepository $ messageRepository ,
64- EventLogManager $ eventLogManager ,
43+ private readonly RateLimitedCampaignMailer $ mailer ,
44+ private readonly EntityManagerInterface $ entityManager ,
45+ private readonly SubscriberProvider $ subscriberProvider ,
46+ private readonly MessageProcessingPreparator $ messagePreparator ,
47+ private readonly LoggerInterface $ logger ,
48+ private readonly CacheInterface $ cache ,
49+ private readonly UserMessageRepository $ userMessageRepository ,
50+ private readonly MaxProcessTimeLimiter $ timeLimiter ,
51+ private readonly RequeueHandler $ requeueHandler ,
52+ private readonly TranslatorInterface $ translator ,
53+ private readonly SubscriberHistoryManager $ subscriberHistoryManager ,
54+ private readonly MessageRepository $ messageRepository ,
55+ private readonly EventLogManager $ eventLogManager ,
56+ private readonly MessageDataManager $ messageDataManager ,
6557 ?int $ maxMailSize = null ,
6658 ) {
67- $ this ->mailer = $ mailer ;
68- $ this ->entityManager = $ entityManager ;
69- $ this ->subscriberProvider = $ subscriberProvider ;
70- $ this ->messagePreparator = $ messagePreparator ;
71- $ this ->logger = $ logger ;
72- $ this ->userMessageRepository = $ userMessageRepository ;
73- $ this ->timeLimiter = $ timeLimiter ;
74- $ this ->requeueHandler = $ requeueHandler ;
75- $ this ->translator = $ translator ;
76- $ this ->subscriberHistoryManager = $ subscriberHistoryManager ;
77- $ this ->messageRepository = $ messageRepository ;
78- $ this ->eventLogManager = $ eventLogManager ;
7959 $ this ->maxMailSize = $ maxMailSize ?? 0 ;
8060 }
8161
@@ -170,12 +150,13 @@ private function handleInvalidEmail(UserMessage $userMessage, Subscriber $subscr
170150
171151 private function handleEmailSending (mixed $ campaign , Subscriber $ subscriber , UserMessage $ userMessage ): void
172152 {
173- $ processed = $ this ->messagePreparator ->processMessageLinks ($ campaign , $ subscriber ->getId ());
153+ $ processed = $ this ->messagePreparator ->processMessageLinks ($ campaign , $ subscriber );
154+ // todo: precacheMessage
174155
175156 try {
176157 $ email = $ this ->mailer ->composeEmail ($ processed , $ subscriber );
177158 $ this ->mailer ->send ($ email );
178- $ this ->checkMessageSizeOrSuspendCampaign ($ campaign , $ email );
159+ $ this ->checkMessageSizeOrSuspendCampaign ($ campaign , $ email, $ subscriber -> hasHtmlEmail () );
179160 $ this ->updateUserMessageStatus ($ userMessage , UserMessageStatus::Sent);
180161 } catch (MessageSizeLimitExceededException $ e ) {
181162 $ this ->updateMessageStatus ($ campaign , MessageStatus::Suspended);
@@ -194,12 +175,20 @@ private function handleEmailSending(mixed $campaign, Subscriber $subscriber, Use
194175 private function checkMessageSizeOrSuspendCampaign (
195176 Message $ campaign ,
196177 Email $ email ,
178+ bool $ hasHtmlEmail
197179 ): void {
198180 if ($ this ->maxMailSize <= 0 ) {
199181 return ;
200182 }
183+ $ sizeName = $ hasHtmlEmail ? 'htmlsize ' : 'textsize ' ;
184+ $ cacheKey = sprintf ('messaging.size.%d.%s ' , $ campaign ->getId (), $ sizeName );
185+ if (!$ this ->cache ->has ($ cacheKey )) {
186+ $ size = $ this ->calculateEmailSize ($ email );
187+ $ this ->messageDataManager ->setMessageData ($ campaign , $ sizeName , $ size );
188+ $ this ->cache ->set ($ cacheKey , $ size );
189+ }
201190
202- $ size = $ this ->calculateEmailSize ( $ email );
191+ $ size = $ this ->cache -> get ( $ cacheKey );
203192 if ($ size <= $ this ->maxMailSize ) {
204193 return ;
205194 }
0 commit comments