From 01e9c22695a3e495f07ab445750221af72e09fe4 Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Wed, 5 Sep 2018 13:40:03 +0200 Subject: Implemented mailing abstraction Closes #434 --- src/Mail/EngelsystemMailer.php | 35 ++++++++++++ src/Mail/Mailer.php | 79 +++++++++++++++++++++++++++ src/Mail/MailerServiceProvider.php | 86 ++++++++++++++++++++++++++++++ src/Mail/Transport/LogTransport.php | 44 +++++++++++++++ src/Mail/Transport/Transport.php | 103 ++++++++++++++++++++++++++++++++++++ 5 files changed, 347 insertions(+) create mode 100644 src/Mail/EngelsystemMailer.php create mode 100644 src/Mail/Mailer.php create mode 100644 src/Mail/MailerServiceProvider.php create mode 100644 src/Mail/Transport/LogTransport.php create mode 100644 src/Mail/Transport/Transport.php (limited to 'src/Mail') diff --git a/src/Mail/EngelsystemMailer.php b/src/Mail/EngelsystemMailer.php new file mode 100644 index 00000000..17047cc8 --- /dev/null +++ b/src/Mail/EngelsystemMailer.php @@ -0,0 +1,35 @@ +view = $view; + } + + /** + * Send a template + * + * @param string $to + * @param string $subject + * @param string $template + * @param array $data + * @return int + */ + public function sendView($to, $subject, $template, $data = []): int + { + $body = $this->view->render($template, $data); + + return $this->send($to, $subject, $body); + } +} diff --git a/src/Mail/Mailer.php b/src/Mail/Mailer.php new file mode 100644 index 00000000..ed800986 --- /dev/null +++ b/src/Mail/Mailer.php @@ -0,0 +1,79 @@ +mailer = $mailer; + } + + /** + * Send the mail + * + * @param string|string[] $to + * @param string $subject + * @param string $body + * @return int + */ + public function send($to, string $subject, string $body): int + { + /** @var SwiftMessage $message */ + $message = $this->mailer->createMessage(); + $message->setTo((array)$to) + ->setFrom($this->fromAddress, $this->fromName) + ->setSubject($subject) + ->setBody($body); + + return $this->mailer->send($message); + } + + /** + * @return string + */ + public function getFromAddress(): string + { + return $this->fromAddress; + } + + /** + * @param string $fromAddress + */ + public function setFromAddress(string $fromAddress) + { + $this->fromAddress = $fromAddress; + } + + /** + * @return string + */ + public function getFromName(): string + { + return $this->fromName; + } + + /** + * @param string $fromName + */ + public function setFromName(string $fromName) + { + $this->fromName = $fromName; + } +} diff --git a/src/Mail/MailerServiceProvider.php b/src/Mail/MailerServiceProvider.php new file mode 100644 index 00000000..70cb0d30 --- /dev/null +++ b/src/Mail/MailerServiceProvider.php @@ -0,0 +1,86 @@ +app->get('config'); + $mailConfig = $config->get('email'); + + $transport = $this->getTransport($mailConfig['driver'], $mailConfig); + $this->app->instance(Transport::class, $transport); + $this->app->instance('mailer.transport', $transport); + + /** @var SwiftMailer $swiftMailer */ + $swiftMailer = $this->app->make(SwiftMailer::class); + $this->app->instance(SwiftMailer::class, $swiftMailer); + $this->app->instance('mailer.swift', $swiftMailer); + + /** @var Mailer $mailer */ + $mailer = $this->app->make(EngelsystemMailer::class); + $mailer->setFromAddress($mailConfig['from']['address']); + if (!empty($mailConfig['from']['name'])) { + $mailer->setFromName($mailConfig['from']['name']); + } + + $this->app->instance(EngelsystemMailer::class, $mailer); + $this->app->instance(Mailer::class, $mailer); + $this->app->instance('mailer', $mailer); + } + + /** + * @param string $transport + * @param array $config + * @return Transport + */ + protected function getTransport($transport, $config) + { + switch ($transport) { + case 'log': + return $this->app->make(LogTransport::class); + case 'mail': + case 'sendmail': + return $this->app->make(SendmailTransport::class, ['command' => $config['sendmail']]); + case 'smtp': + return $this->getSmtpTransport($config); + } + + throw new InvalidArgumentException(sprintf('Mail driver "%s" not found', $transport)); + } + + /** + * @param array $config + * @return SmtpTransport + */ + protected function getSmtpTransport(array $config) + { + /** @var SmtpTransport $transport */ + $transport = $this->app->make(SmtpTransport::class, [ + 'host' => $config['host'], + 'port' => $config['port'], + 'security' => $config['encryption'], + ]); + + if ($config['username']) { + $transport->setUsername($config['username']); + } + + if ($config['password']) { + $transport->setPassword($config['password']); + } + + return $transport; + } +} diff --git a/src/Mail/Transport/LogTransport.php b/src/Mail/Transport/LogTransport.php new file mode 100644 index 00000000..6e351302 --- /dev/null +++ b/src/Mail/Transport/LogTransport.php @@ -0,0 +1,44 @@ +logger = $logger; + } + + /** + * Send the given Message. + * + * Recipient/sender data will be retrieved from the Message API. + * The return value is the number of recipients + * + * @param SimpleMessage $message + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int + */ + public function send( + SimpleMessage $message, + &$failedRecipients = null + ): int { + $this->logger->debug( + 'Mail: Send mail "{title}" to "{recipients}":' . PHP_EOL . '{content}', + [ + 'title' => $message->getSubject(), + 'recipients' => $this->getTo($message), + 'content' => (string)$message->getHeaders() . PHP_EOL . PHP_EOL . $message->toString(), + ] + ); + + return count($this->allRecipients($message)); + } +} diff --git a/src/Mail/Transport/Transport.php b/src/Mail/Transport/Transport.php new file mode 100644 index 00000000..691faf60 --- /dev/null +++ b/src/Mail/Transport/Transport.php @@ -0,0 +1,103 @@ +ping()) { + * $transport->stop(); + * $transport->start(); + * } + * + * The Transport mechanism will be started, if it is not already. + * + * It is undefined if the Transport mechanism attempts to restart as long as + * the return value reflects whether the mechanism is now functional. + * + * @return bool TRUE if the transport is alive + */ + public function ping(): bool + { + return true; + } + + /** + * Register a plugin in the Transport. + * + * @param Swift_Events_EventListener $plugin + */ + public function registerPlugin(Swift_Events_EventListener $plugin) { } + + /** + * Returns a unified list of all recipients + * + * @param SimpleMessage $message + * @return array + */ + protected function allRecipients(SimpleMessage $message): array + { + return array_merge( + (array)$message->getTo(), + (array)$message->getCc(), + (array)$message->getBcc() + ); + } + + /** + * Returns a concatenated list of mail recipients + * + * @param SimpleMessage $message + * @return string + */ + protected function getTo(SimpleMessage $message): string + { + return $this->formatTo($this->allRecipients($message)); + } + + /** + * @param array $recipients + * @return string + */ + protected function formatTo(array $recipients) + { + $list = []; + foreach ($recipients as $address => $name) { + $list[] = $name ? sprintf('%s <%s>', $name, $address) : $address; + } + + return implode(',', $list); + } +} -- cgit v1.2.3-54-g00ecf From d36de2d26f5af76d5d4f34f8620694c6d0368983 Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Tue, 11 Sep 2018 16:35:28 +0200 Subject: Quickfix for problems with the SmtpTransport --- src/Mail/MailerServiceProvider.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'src/Mail') diff --git a/src/Mail/MailerServiceProvider.php b/src/Mail/MailerServiceProvider.php index 70cb0d30..989fee8f 100644 --- a/src/Mail/MailerServiceProvider.php +++ b/src/Mail/MailerServiceProvider.php @@ -68,9 +68,12 @@ class MailerServiceProvider extends ServiceProvider { /** @var SmtpTransport $transport */ $transport = $this->app->make(SmtpTransport::class, [ - 'host' => $config['host'], - 'port' => $config['port'], - 'security' => $config['encryption'], + 'host' => $config['host'], + 'port' => $config['port'], + 'encryption' => $config['encryption'], + // TODO: The security variable should be removed in the future + // https://github.com/swiftmailer/swiftmailer/commit/d3d6a98ab7dc155a04eb08273db7cd34606e7b5e#commitcomment-30462876 + 'security' => $config['encryption'], ]); if ($config['username']) { -- cgit v1.2.3-54-g00ecf