From 4670c06b7eabe74f8af47c387f5de7d93ca8cc4b Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 14 Feb 2023 10:03:54 +1100 Subject: [PATCH] Refactor for emails --- app/Services/Email/BaseMailer.php | 157 ++++++++++++++++++++++++++++++ app/Services/Email/MailBuild.php | 22 +++++ app/Services/Email/MailEntity.php | 38 ++++---- app/Services/Email/MailObject.php | 7 ++ 4 files changed, 204 insertions(+), 20 deletions(-) create mode 100644 app/Services/Email/BaseMailer.php create mode 100644 app/Services/Email/MailBuild.php diff --git a/app/Services/Email/BaseMailer.php b/app/Services/Email/BaseMailer.php new file mode 100644 index 000000000000..38b41c261bed --- /dev/null +++ b/app/Services/Email/BaseMailer.php @@ -0,0 +1,157 @@ +company) + $this->fail(); + + /* Handle deactivated company */ + if($this->company->is_disabled && !$this->override) + $this->fail(); + + /* To handle spam users we drop all emails from flagged accounts */ + if(Ninja::isHosted() && $this->company->account && $this->company->account->is_flagged) + $this->fail(); + + } + + public function configureMailer(): self + { + + return $this; + } + + public function trySending() + { + try { + + $mailer + ->to($this->nmo->to_user->email) + ->send($this->nmo->mailable); + + /* Count the amount of emails sent across all the users accounts */ + Cache::increment($this->company->account->key); + + LightLogs::create(new EmailSuccess($this->company->company_key)) + ->send(); + + } + catch(\Symfony\Component\Mime\Exception\RfcComplianceException $e) { + nlog("Mailer failed with a Logic Exception {$e->getMessage()}"); + $this->fail(); + $this->cleanUpMailers(); + $this->logMailError($e->getMessage(), $this->company->clients()->first()); + return; + } + catch(\Symfony\Component\Mime\Exception\LogicException $e){ + nlog("Mailer failed with a Logic Exception {$e->getMessage()}"); + $this->fail(); + $this->cleanUpMailers(); + $this->logMailError($e->getMessage(), $this->company->clients()->first()); + return; + } + catch (\Exception | \Google\Service\Exception $e) { + + nlog("Mailer failed with {$e->getMessage()}"); + $message = $e->getMessage(); + + /** + * Post mark buries the proper message in a a guzzle response + * this merges a text string with a json object + * need to harvest the ->Message property using the following + */ + if(stripos($e->getMessage(), 'code 406') || stripos($e->getMessage(), 'code 300') || stripos($e->getMessage(), 'code 413')) + { + + $message = "Either Attachment too large, or recipient has been suppressed."; + + $this->fail(); + $this->logMailError($e->getMessage(), $this->company->clients()->first()); + $this->cleanUpMailers(); + + return; + + } + + //only report once, not on all tries + if($this->attempts() == $this->tries) + { + + /* If the is an entity attached to the message send a failure mailer */ + if($this->nmo->entity) + $this->entityEmailFailed($message); + + /* Don't send postmark failures to Sentry */ + if(Ninja::isHosted() && (!$e instanceof ClientException)) + app('sentry')->captureException($e); + + } + + /* Releasing immediately does not add in the backoff */ + $this->release($this->backoff()[$this->attempts()-1]); + + } + } + + public function backoff() + { + return [5, 10, 30, 240]; + } + + public function failed($exception = null) + { + + config(['queue.failed.driver' => null]); + + } +} +` \ No newline at end of file diff --git a/app/Services/Email/MailBuild.php b/app/Services/Email/MailBuild.php new file mode 100644 index 000000000000..2da48294db7a --- /dev/null +++ b/app/Services/Email/MailBuild.php @@ -0,0 +1,22 @@ +invitation = $invitation; + $this->company = $invitation->company; + $this->db = $db; - $this->reminder_template = $reminder_template; + $this->mail_object = $mail_object; - $this->template_data = $template_data; - - $this->override = $override; - - // $this->entity_string = $this->resolveEntityString(); - - // $this->entity = $invitation->{$this->entity_string}; - - // $this->settings = $invitation->contact->client->getMergedSettings(); - - // $this->reminder_template = $reminder_template ?: $this->entity->calculateTemplate($this->entity_string); - - // $this->html_engine = new HtmlEngine($invitation); - - // $this->template_data = $template_data; + $this->override = $mail_object->override; } - public function handle(): void + public function handle(MailBuild $builder): void { MultiDB::setDb($this->db); + $this->companyCheck(); + //construct mailable - //construct mailer + //spam checks + //what do we pass into a generaic builder? + + //construct mailer + $mailer = $this->configureMailer() + ->trySending(); + + } } diff --git a/app/Services/Email/MailObject.php b/app/Services/Email/MailObject.php index 08a540342e02..f9467866d60c 100644 --- a/app/Services/Email/MailObject.php +++ b/app/Services/Email/MailObject.php @@ -77,4 +77,11 @@ class MailObject public array $variables = []; + public ?string $reminder_template = null; + + public ?string $template_data = null; + + public bool $override = false; + + } \ No newline at end of file