Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 10 additions & 21 deletions Classes/EventListener/AfterMailSentEventListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

namespace StudioMitte\SentMails\EventListener;

use StudioMitte\SentMails\Repository\MailRepository;
use Symfony\Component\Mime\RawMessage;
use TYPO3\CMS\Core\Database\Connection;
use TYPO3\CMS\Core\Database\ConnectionPool;
Expand All @@ -12,54 +13,42 @@

class AfterMailSentEventListener
{
public function __construct(private MailRepository $mailRepository)
{
}

public function __invoke(AfterMailerSentMessageEvent $event): void
{
/** @var Mailer $mailer */
$mailer = $event->getMailer();
$transport = $mailer->getTransport();
$sentMessage = $mailer->getSentMessage();
if (!$sentMessage) {
return;
}
$originalMessage = $sentMessage->getOriginalMessage();
$sentMailLogCustomId = $originalMessage->getHeaders()->getHeaderBody('X-SentMail_Custom');
$sentMailLogId = $originalMessage->getHeaders()->getHeaderBody('X-SentMail_ID');

if (null === $sentMailLogId) {
return;
}

$isReply = get_class($originalMessage) === RawMessage::class;
$logRow = $this->getLogRecord((int)$sentMailLogId, $sentMailLogCustomId);
$logRow = $this->mailRepository->getMailRow((int) $sentMailLogId);

$connection = $this->getConnection();
if ($logRow) {
$connection->update('tx_sentmail_mail',
$this->getConnection()->update('tx_sentmail_mail',
[
'message_id' => $isReply ? '' : $sentMessage->getMessageId(),
'debug' => $sentMessage->getDebug(),
# 'envelope_original' => serialize($sentMessage->getEnvelope()),
'is_sent' => 1,
],
[
'uid' => $logRow['uid'],
]
);
}
return;
}

protected function getLogRecord(int $id, string $customId): array
{
$queryBuilder = $this->getConnection()->createQueryBuilder();

return (array)$queryBuilder
->select('*')
->from('tx_sentmail_mail')
->where(
$queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($id, Connection::PARAM_INT)),
)
->setMaxResults(1)
->executeQuery()
->fetchAssociative();
}

private function getConnection(): Connection
{
Expand Down
64 changes: 37 additions & 27 deletions Classes/EventListener/BeforeMailSentEventListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

namespace StudioMitte\SentMails\EventListener;

use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerAwareTrait;
use Symfony\Component\Mailer\Envelope;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
Expand All @@ -13,8 +15,9 @@
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\StringUtility;

class BeforeMailSentEventListener
class BeforeMailSentEventListener implements LoggerAwareInterface
{
use LoggerAwareTrait;

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

public function __invoke(BeforeMailerSentMessageEvent $event): void
{
/** @var Email $sentMessage */
$sentMessage = $event->getMessage();
/** @var Email $originalMessage */
$originalMessage = $event->getMessage();
try {
/** @var Email $sentMessage */
$sentMessage = $event->getMessage();
/** @var Email $originalMessage */
$originalMessage = $event->getMessage();

$customId = StringUtility::getUniqueId('mail_');
$customId = StringUtility::getUniqueId('mail_');

$sentMessage->getHeaders()->addTextHeader('X-SentMail_Custom', $customId);
$sentMessage->getHeaders()->addTextHeader('X-SentMail_Custom', $customId);

$isReply = get_class($originalMessage) === RawMessage::class;
$isReply = get_class($originalMessage) === RawMessage::class;

$connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_sentmail_mail');
$connection->insert('tx_sentmail_mail', [
'crdate' => time(),
'subject' => (string)($isReply ? '' : $originalMessage->getHeaders()->getHeaderBody('Subject')),
'sender' => $this->convertAddresses($originalMessage->getFrom()),
'receiver' => $this->convertAddresses( $originalMessage->getTo()),
'bcc' => $this->convertAddresses($originalMessage->getBcc()),
'cc' => $this->convertAddresses($originalMessage->getCc()),
'debug' => '',
'message_id' => $customId,
'message' => $sentMessage->toString(),
'original_message' => $originalMessage->toString(),
'envelope_original' => serialize($event->getEnvelope() ?: Envelope::create($originalMessage)),
'internal_id' => $customId,
'email_serialized' => $originalMessage instanceof Email ? serialize($originalMessage) : '',
'settings' => json_encode($this->getSettings()),
]);
$sentMessage->getHeaders()->remove('X-SentMail_ID');
$sentMessage->getHeaders()->addTextHeader('X-SentMail_ID', $connection->lastInsertId('tx_sentmail_mail'));
$connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_sentmail_mail');
$connection->insert('tx_sentmail_mail', [
'crdate' => time(),
'subject' => (string)($isReply ? '' : $originalMessage->getHeaders()->getHeaderBody('Subject')),
'sender' => $this->convertAddresses($originalMessage->getFrom()),
'receiver' => $this->convertAddresses( $originalMessage->getTo()),
'bcc' => $this->convertAddresses($originalMessage->getBcc()),
'cc' => $this->convertAddresses($originalMessage->getCc()),
'debug' => '',
'message_id' => $customId,
'message' => $sentMessage->toString(),
'original_message' => $originalMessage->toString(),
'envelope_original' => serialize($event->getEnvelope() ?: Envelope::create($originalMessage)),
'internal_id' => $customId,
'email_serialized' => $originalMessage instanceof Email ? serialize($originalMessage) : '',
'settings' => json_encode($this->getSettings()),
]);
$sentMessage->getHeaders()->remove('X-SentMail_ID');
$sentMessage->getHeaders()->addTextHeader('X-SentMail_ID', $connection->lastInsertId('tx_sentmail_mail'));

} catch (\Throwable $e) {
$this->logger->warning('[SentMails] Error during BeforeMailSentEventListener: ', [
$e->getMessage(),
]);
}
}

/**
Expand Down
6 changes: 2 additions & 4 deletions Classes/Repository/MailRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,9 @@ public function getMails(): array
->executeQuery()->fetchAllAssociative();
}

public function getMailRow(int $id): array
public function getMailRow(int $id): ?array
{
$row = BackendUtility::getRecord(self::TABLE_NAME, $id);

return (array) $row;
return BackendUtility::getRecord(self::TABLE_NAME, $id);
}

public function getMailsBySearch(string $searchTerm): array
Expand Down
16 changes: 8 additions & 8 deletions ext_tables.sql
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ CREATE TABLE tx_sentmail_mail (
message_id varchar(255) DEFAULT '' NOT NULL,
internal_id varchar(255) DEFAULT '' NOT NULL,
is_sent tinyint(1) DEFAULT '0' NOT NULL,
debug text DEFAULT '' NOT NULL,
message text DEFAULT '' NOT NULL,
message_original text DEFAULT '' NOT NULL,
original_message text DEFAULT '' NOT NULL,
envelope_original text DEFAULT '' NOT NULL,
email_serialized text DEFAULT '' NOT NULL,
settings text DEFAULT '' NOT NULL
);
debug longtext DEFAULT '' NOT NULL,
message longtext DEFAULT '' NOT NULL,
message_original longtext DEFAULT '' NOT NULL,
original_message longtext DEFAULT '' NOT NULL,
envelope_original longblob DEFAULT '' NOT NULL,
email_serialized longblob DEFAULT '' NOT NULL,
settings longtext DEFAULT '' NOT NULL
);