mailService = new UserMailService(); } /** * Send the given e-mail. * * @param Email $email */ public function send(Email $email) { if ($email->isSent()) { \Log::channel('single')->info('[Sender] Email #' . $email->id . ' already sent, skipping.'); return; } $email->markAsSending(); \Log::channel('single')->info('[Sender] Processing email #' . $email->id, [ 'subject' => $email->getSubject(), 'recipient' => $email->getRecipient(), 'company_id' => $email->getCompanyId(), 'email_campaign_id'=> $email->getEmailCampaignId(), 'composed_by_id' => $email->getComposedById(), ]); if (!empty($email->getCompanyId())) { \Log::channel('single')->info('[Sender] Using companyMailConfigurator for company #' . $email->getCompanyId()); $this->mailService->companyMailConfigurator($email->getCompanyId()); } else if (!empty($email->getEmailCampaignId())) { \Log::channel('single')->info('[Sender] Using emailCampaignMailerConfigurator for campaign #' . $email->getEmailCampaignId()); $this->mailService->emailCampaignMailerConfigurator($email->getEmailCampaignId()); } else if (!empty($email->getComposedById())) { \Log::channel('single')->info('[Sender] Using userMailerConfigurator for user #' . $email->getComposedById()); $this->mailService->userMailerConfigurator($email->getComposedById()); } else { \Log::channel('single')->warning('[Sender] No mailer configurator matched for email #' . $email->id . ' — using default app mail config.'); } \Log::channel('single')->info('[Sender] Dispatching via mailer', [ 'smtp_host' => config('mail.mailers.smtp.host'), 'smtp_port' => config('mail.mailers.smtp.port'), 'from' => $email->getFromAddress(), 'to' => $email->getRecipient(), ]); $this->getMailerInstance()->send([], [], function (Message $message) use ($email) { $this->buildMessage($message, $email); }); $email->markAsSent(); \Log::channel('single')->info('[Sender] Email #' . $email->id . ' marked as sent.'); } /** * Get the instance of the Laravel mailer. * * @return Mailer */ private function getMailerInstance() { return app('mailer'); } /** * Build the e-mail message. * * @param Message $message * @param Email $email */ private function buildMessage(Message $message, Email $email) { $message->to($email->getRecipient()) ->cc($email->hasCc() ? $email->getCc() : []) ->bcc($email->hasBcc() ? $email->getBcc() : []) ->subject($email->getSubject()) ->from($email->getFromAddress(), $email->getFromName()) ->setBody($email->getBody(), 'text/html'); $attachmentMap = [ 'attachment' => 'attach', 'rawAttachment' => 'attachData', ]; foreach ((array)$email->getAttachments() as $attachment) { call_user_func_array([$message, $attachmentMap[$attachment['type']]], $attachment['attachment']); } } }