From e5c942cab437830acea1a35f1ba18ba5f3e76222 Mon Sep 17 00:00:00 2001 From: Pedro Amorim Date: Tue, 11 Jun 2024 15:58:39 +0000 Subject: [PATCH] feat: preferredMailSender 2/2 - preferredMailSender system variable This new preferredMailSender system variable defaults to 'SMTP|AmazonSES|SendGrid" which means it will first look for an SMTP setting when sending email directly from Aspen. If that fails or doesn't exist, it'll then query Amazon SES, and finally SendGrid. This order may be configured through the system variables UI. Test the UI: Drag and drop the options, reorder them, save. Refresh. Verify all is working as intended. Test the functionality: Create a new SMTP setting and attempt sending an email (i.e. through the 'Submit a ticket' feature). Then, create a new Amazon SES setting and reorder the preferredMailSender. Notice it should use the first one selected in priority. --- .../version_updates/24.07.00.php | 9 ++++ code/web/sys/Email/Mailer.php | 42 +++++++++++++------ code/web/sys/SystemVariables.php | 12 ++++++ install/aspen.sql | 1 + 4 files changed, 52 insertions(+), 12 deletions(-) diff --git a/code/web/sys/DBMaintenance/version_updates/24.07.00.php b/code/web/sys/DBMaintenance/version_updates/24.07.00.php index ad9bbd9cbb..050d4100d3 100644 --- a/code/web/sys/DBMaintenance/version_updates/24.07.00.php +++ b/code/web/sys/DBMaintenance/version_updates/24.07.00.php @@ -50,6 +50,15 @@ function getUpdates24_07_00(): array { ], ], //permissions_create_administer_smtp + 'systemVariables_preferredMailSender' => [ + 'title' => 'System Variables - Preferred Mail Sender', + 'description' => 'Allow sortable configuration of which mail sender to use by order of priority.', + 'sql' => [ + "alter table system_variables ADD COLUMN preferredMailSender varchar(128) DEFAULT 'SMTP|AmazonSES|SendGrid'", + ], + ], + //systemVariables_preferredMailSender + //other diff --git a/code/web/sys/Email/Mailer.php b/code/web/sys/Email/Mailer.php index e4fbd2e53b..fe2c12cfa9 100644 --- a/code/web/sys/Email/Mailer.php +++ b/code/web/sys/Email/Mailer.php @@ -22,20 +22,17 @@ public function send($to, $subject, $body, $replyTo = null, $htmlBody = null, $a require_once ROOT_DIR . '/sys/Email/AmazonSesSetting.php'; require_once ROOT_DIR . '/sys/Email/SMTPSetting.php'; require_once ROOT_DIR . '/sys/CurlWrapper.php'; + require_once ROOT_DIR . '/sys/SystemVariables.php'; //TODO: Do validation of the address - $amazonSesSettings = new AmazonSesSetting(); - $smtpServerSettings = new SMTPSetting(); - if($smtpServerSettings->find(true)) { - $result = $this->sendViaSMTP($smtpServerSettings, $to, $replyTo, $subject, $body, $htmlBody, $attachments); - }elseif ($amazonSesSettings->find(true)) { - $result = $this->sendViaAmazonSes($amazonSesSettings, $to, $replyTo, $subject, $body, $htmlBody, $attachments); - } else { - $sendGridSettings = new SendGridSetting(); - if ($sendGridSettings->find(true)) { - $result = $this->sendViaSendGrid($sendGridSettings, $to, $replyTo, $subject, $body, $htmlBody); - } else { - $result = false; + $systemVariables = new SystemVariables(); + if ($systemVariables->find(true) && !empty($systemVariables->preferredMailSender)) { + $mailSenders = explode("|", $systemVariables->preferredMailSender); + foreach ($mailSenders as $mailSender){ + $result = $this->sendViaAbstractSender($mailSender, $to, $replyTo, $subject, $body, $htmlBody, $attachments); + if ($result) { + break; + } } } @@ -145,4 +142,25 @@ private function sendViaAmazonSes(AmazonSesSetting $amazonSesSettings, string $t private function sendViaSMTP(SMTPSetting $smtpSettings, string $to, ?string $replyTo, string $subject, ?string $body, ?string $htmlBody, ?array $attachments): bool { return $smtpSettings->sendEmail($to, $replyTo, $subject, $body, $htmlBody, $attachments); } + + private function sendViaAbstractSender($mailSender, $to, $replyTo, $subject, $body, $htmlBody, $attachments) { + $result = false; + if($mailSender == 'AmazonSES') { + $amazonSesSettings = new AmazonSesSetting(); + if($amazonSesSettings->find(true)){ + $result = $this->sendViaAmazonSes($amazonSesSettings, $to, $replyTo, $subject, $body, $htmlBody, $attachments); + } + } else if($mailSender == 'SendGrid') { + $sendGridSettings = new SendGridSetting(); + if($sendGridSettings->find(true)){ + $result = $this->sendViaSendGrid($sendGridSettings, $to, $replyTo, $subject, $body, $htmlBody); + } + } else if($mailSender == 'SMTP') { + $smtpSettings = new SMTPSetting(); + if($smtpSettings->find(true)){ + $result = $this->sendViaSMTP($smtpSettings, $to, $replyTo, $subject, $body, $htmlBody, $attachments); + } + } + return $result; + } } \ No newline at end of file diff --git a/code/web/sys/SystemVariables.php b/code/web/sys/SystemVariables.php index 50447b24b0..82ab838db9 100644 --- a/code/web/sys/SystemVariables.php +++ b/code/web/sys/SystemVariables.php @@ -7,6 +7,7 @@ class SystemVariables extends DataObject { public $errorEmail; public $ticketEmail; public $searchErrorEmail; + public $preferredMailSender; public $loadCoversFrom020z; public $currencyCode; public $runNightlyFullIndex; @@ -87,6 +88,17 @@ static function getObjectStructure($context = ''): array { 'description' => 'Email Address to send errors to', 'maxLength' => 128, ], + 'preferredMailSender' => [ + 'property' => 'preferredMailSender', + 'type' => 'sortableList', + 'values' => [ + 'AmazonSES' => 'AmazonSES', + 'SendGrid' => 'SendGrid', + 'SMTP' => 'SMTP', + ], + 'label' => 'Preferred Mail Sender Order', + 'description' => 'Sort order of preferred mail sender', + ], ] ], 'googleBucket' => [ diff --git a/install/aspen.sql b/install/aspen.sql index b96acb6881..98f86fd97f 100644 --- a/install/aspen.sql +++ b/install/aspen.sql @@ -4949,6 +4949,7 @@ CREATE TABLE `system_variables` ( `errorEmail` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `ticketEmail` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `searchErrorEmail` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `preferredMailSender` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'SMTP|AmazonSES|SendGrid', `loadCoversFrom020z` tinyint(1) DEFAULT '0', `runNightlyFullIndex` tinyint(1) DEFAULT '0', `currencyCode` char(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'USD',