Skip to content

Commit

Permalink
Use a custom service provider for email configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
franzliedke committed Dec 20, 2018
1 parent 9794a08 commit ac5e26a
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 13 deletions.
13 changes: 0 additions & 13 deletions src/Foundation/InstalledSite.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@
use Illuminate\Filesystem\Filesystem;
use Illuminate\Filesystem\FilesystemServiceProvider;
use Illuminate\Hashing\HashServiceProvider;
use Illuminate\Mail\MailServiceProvider;
use Illuminate\Validation\ValidationServiceProvider;
use Illuminate\View\ViewServiceProvider;
use Monolog\Formatter\LineFormatter;
Expand Down Expand Up @@ -118,18 +117,6 @@ private function bootLaravel(): Application
$laravel->register(MailServiceProvider::class);
$laravel->register(ViewServiceProvider::class);
$laravel->register(ValidationServiceProvider::class);

$settings = $laravel->make(SettingsRepositoryInterface::class);

$config->set('mail.driver', $settings->get('mail_driver'));
$config->set('mail.host', $settings->get('mail_host'));
$config->set('mail.port', $settings->get('mail_port'));
$config->set('mail.from.address', $settings->get('mail_from'));
$config->set('mail.from.name', $settings->get('forum_title'));
$config->set('mail.encryption', $settings->get('mail_encryption'));
$config->set('mail.username', $settings->get('mail_username'));
$config->set('mail.password', $settings->get('mail_password'));

$laravel->register(DiscussionServiceProvider::class);
$laravel->register(FormatterServiceProvider::class);
$laravel->register(FrontendServiceProvider::class);
Expand Down
79 changes: 79 additions & 0 deletions src/Foundation/MailServiceProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
<?php

/*
* This file is part of Flarum.
*
* (c) Toby Zerner <toby.zerner@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Flarum\Foundation;

use Flarum\Settings\SettingsRepositoryInterface;
use Illuminate\Mail\Mailer;
use Illuminate\Mail\Transport\LogTransport;
use InvalidArgumentException;
use Psr\Log\LoggerInterface;
use Swift_Mailer;
use Swift_SendmailTransport;
use Swift_SmtpTransport;
use Swift_Transport;

class MailServiceProvider extends AbstractServiceProvider
{
public function register()
{
$this->app->singleton('swift.mailer', function ($app) {
$settings = $app->make(SettingsRepositoryInterface::class);

return new Swift_Mailer(
$this->buildTransport($settings)
);
});

$this->app->singleton('mailer', function ($app) {
$mailer = new Mailer(
$app['view'], $app['swift.mailer'], $app['events']
);

if ($app->bound('queue')) {
$mailer->setQueue($app->make('queue'));
}

$settings = $app->make(SettingsRepositoryInterface::class);
$mailer->alwaysFrom($settings->get('mail_from'), $settings->get('forum_title'));

return $mailer;
});
}

private function buildTransport(SettingsRepositoryInterface $settings): Swift_Transport
{
switch ($settings->get('mail_driver')) {
case 'smtp':
return $this->buildSmtpTransport($settings);
case 'mail':
return new Swift_SendmailTransport;
case 'log':
return new LogTransport($this->app->make(LoggerInterface::class));
default:
throw new InvalidArgumentException('Invalid mail driver configuration');
}
}

private function buildSmtpTransport(SettingsRepositoryInterface $settings): Swift_Transport
{
$transport = new Swift_SmtpTransport(
$settings->get('mail_host'),
$settings->get('mail_port'),
$settings->get('mail_encryption')
);

$transport->setUsername($settings->get('mail_username'));
$transport->setPassword($settings->get('mail_password'));

return $transport;
}
}

2 comments on commit ac5e26a

@luceos
Copy link
Member

@luceos luceos commented on ac5e26a Feb 15, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@franzliedke I noticed an issue with this commit. As an extension you are able to add another driver (eg mailgun) using the resolving callback. But whenever the transport is being instantiated the Exception further down in this service provider is always triggered. Because there's no way to hook into it, I'm not sure this is the best solution.

What do you propose is a better solution? Would it make sense to have an event dispatched, listeners created per transport and when this returns nothing throw an exception?

@franzliedke
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As a stopgap, something like this in the default case might work:

if ($this->app->bound('flarum.mail_driver.'.$driver) {
    return $this->app->make('flarum.mail_driver.'.$driver);
}
throw new InvalidArgumentException('Invalid mail driver configuration');

In the short-term, I'd rather see a more thorough abstraction for drivers that can handle the use-cases outlined here.

Please sign in to comment.