Skip to content

Commit b1dc9e3

Browse files
committed
refactor: prevent EventListener to break page on errors and log them
1 parent c214372 commit b1dc9e3

3 files changed

Lines changed: 49 additions & 52 deletions

File tree

Classes/EventListener/AfterMailSentEventListener.php

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
namespace StudioMitte\SentMails\EventListener;
55

6+
use StudioMitte\SentMails\Repository\MailRepository;
67
use Symfony\Component\Mime\RawMessage;
78
use TYPO3\CMS\Core\Database\Connection;
89
use TYPO3\CMS\Core\Database\ConnectionPool;
@@ -12,54 +13,42 @@
1213

1314
class AfterMailSentEventListener
1415
{
16+
public function __construct(private MailRepository $mailRepository)
17+
{
18+
}
1519

1620
public function __invoke(AfterMailerSentMessageEvent $event): void
1721
{
1822
/** @var Mailer $mailer */
1923
$mailer = $event->getMailer();
20-
$transport = $mailer->getTransport();
2124
$sentMessage = $mailer->getSentMessage();
2225
if (!$sentMessage) {
2326
return;
2427
}
2528
$originalMessage = $sentMessage->getOriginalMessage();
26-
$sentMailLogCustomId = $originalMessage->getHeaders()->getHeaderBody('X-SentMail_Custom');
2729
$sentMailLogId = $originalMessage->getHeaders()->getHeaderBody('X-SentMail_ID');
2830

31+
if (null === $sentMailLogId) {
32+
return;
33+
}
34+
2935
$isReply = get_class($originalMessage) === RawMessage::class;
30-
$logRow = $this->getLogRecord((int)$sentMailLogId, $sentMailLogCustomId);
36+
$logRow = $this->mailRepository->getMailRow((int) $sentMailLogId);
3137

32-
$connection = $this->getConnection();
3338
if ($logRow) {
34-
$connection->update('tx_sentmail_mail',
39+
$this->getConnection()->update('tx_sentmail_mail',
3540
[
3641
'message_id' => $isReply ? '' : $sentMessage->getMessageId(),
3742
'debug' => $sentMessage->getDebug(),
38-
# 'envelope_original' => serialize($sentMessage->getEnvelope()),
3943
'is_sent' => 1,
4044
],
4145
[
4246
'uid' => $logRow['uid'],
4347
]
4448
);
4549
}
46-
return;
4750
}
4851

49-
protected function getLogRecord(int $id, string $customId): array
50-
{
51-
$queryBuilder = $this->getConnection()->createQueryBuilder();
52-
53-
return (array)$queryBuilder
54-
->select('*')
55-
->from('tx_sentmail_mail')
56-
->where(
57-
$queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($id, Connection::PARAM_INT)),
58-
)
59-
->setMaxResults(1)
60-
->executeQuery()
61-
->fetchAssociative();
62-
}
6352

6453
private function getConnection(): Connection
6554
{

Classes/EventListener/BeforeMailSentEventListener.php

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
namespace StudioMitte\SentMails\EventListener;
55

6+
use Psr\Log\LoggerAwareInterface;
7+
use Psr\Log\LoggerAwareTrait;
68
use Symfony\Component\Mailer\Envelope;
79
use Symfony\Component\Mime\Address;
810
use Symfony\Component\Mime\Email;
@@ -13,8 +15,9 @@
1315
use TYPO3\CMS\Core\Utility\GeneralUtility;
1416
use TYPO3\CMS\Core\Utility\StringUtility;
1517

16-
class BeforeMailSentEventListener
18+
class BeforeMailSentEventListener implements LoggerAwareInterface
1719
{
20+
use LoggerAwareTrait;
1821

1922
private array $blindedConfiguration = [
2023
'dsn' => '******',
@@ -26,36 +29,43 @@ class BeforeMailSentEventListener
2629

2730
public function __invoke(BeforeMailerSentMessageEvent $event): void
2831
{
29-
/** @var Email $sentMessage */
30-
$sentMessage = $event->getMessage();
31-
/** @var Email $originalMessage */
32-
$originalMessage = $event->getMessage();
32+
try {
33+
/** @var Email $sentMessage */
34+
$sentMessage = $event->getMessage();
35+
/** @var Email $originalMessage */
36+
$originalMessage = $event->getMessage();
3337

34-
$customId = StringUtility::getUniqueId('mail_');
38+
$customId = StringUtility::getUniqueId('mail_');
3539

36-
$sentMessage->getHeaders()->addTextHeader('X-SentMail_Custom', $customId);
40+
$sentMessage->getHeaders()->addTextHeader('X-SentMail_Custom', $customId);
3741

38-
$isReply = get_class($originalMessage) === RawMessage::class;
42+
$isReply = get_class($originalMessage) === RawMessage::class;
3943

40-
$connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_sentmail_mail');
41-
$connection->insert('tx_sentmail_mail', [
42-
'crdate' => time(),
43-
'subject' => (string)($isReply ? '' : $originalMessage->getHeaders()->getHeaderBody('Subject')),
44-
'sender' => $this->convertAddresses($originalMessage->getFrom()),
45-
'receiver' => $this->convertAddresses( $originalMessage->getTo()),
46-
'bcc' => $this->convertAddresses($originalMessage->getBcc()),
47-
'cc' => $this->convertAddresses($originalMessage->getCc()),
48-
'debug' => '',
49-
'message_id' => $customId,
50-
'message' => $sentMessage->toString(),
51-
'original_message' => $originalMessage->toString(),
52-
'envelope_original' => serialize($event->getEnvelope() ?: Envelope::create($originalMessage)),
53-
'internal_id' => $customId,
54-
'email_serialized' => $originalMessage instanceof Email ? serialize($originalMessage) : '',
55-
'settings' => json_encode($this->getSettings()),
56-
]);
57-
$sentMessage->getHeaders()->remove('X-SentMail_ID');
58-
$sentMessage->getHeaders()->addTextHeader('X-SentMail_ID', $connection->lastInsertId('tx_sentmail_mail'));
44+
$connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_sentmail_mail');
45+
$connection->insert('tx_sentmail_mail', [
46+
'crdate' => time(),
47+
'subject' => (string)($isReply ? '' : $originalMessage->getHeaders()->getHeaderBody('Subject')),
48+
'sender' => $this->convertAddresses($originalMessage->getFrom()),
49+
'receiver' => $this->convertAddresses( $originalMessage->getTo()),
50+
'bcc' => $this->convertAddresses($originalMessage->getBcc()),
51+
'cc' => $this->convertAddresses($originalMessage->getCc()),
52+
'debug' => '',
53+
'message_id' => $customId,
54+
'message' => $sentMessage->toString(),
55+
'original_message' => $originalMessage->toString(),
56+
'envelope_original' => serialize($event->getEnvelope() ?: Envelope::create($originalMessage)),
57+
'internal_id' => $customId,
58+
'email_serialized' => $originalMessage instanceof Email ? serialize($originalMessage) : '',
59+
'settings' => json_encode($this->getSettings()),
60+
]);
61+
$sentMessage->getHeaders()->remove('X-SentMail_ID');
62+
$sentMessage->getHeaders()->addTextHeader('X-SentMail_ID', $connection->lastInsertId('tx_sentmail_mail'));
63+
64+
} catch (\Throwable $e) {
65+
$this->logger->warning('[SentMails] Error during BeforeMailSentEventListener: ', [
66+
$e->getMessage(),
67+
]);
68+
}
5969
}
6070

6171
/**

Classes/Repository/MailRepository.php

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,9 @@ public function getMails(): array
2828
->executeQuery()->fetchAllAssociative();
2929
}
3030

31-
public function getMailRow(int $id): array
31+
public function getMailRow(int $id): ?array
3232
{
33-
$row = BackendUtility::getRecord(self::TABLE_NAME, $id);
34-
35-
return (array) $row;
33+
return BackendUtility::getRecord(self::TABLE_NAME, $id);
3634
}
3735

3836
public function getMailsBySearch(string $searchTerm): array

0 commit comments

Comments
 (0)