<?php namespace Illuminate\Mail; use Swift_Mailer; use Illuminate\Support\Arr; use Illuminate\Support\Str; use Swift_DependencyContainer; use Illuminate\Support\ServiceProvider; use Illuminate\Contracts\Support\DeferrableProvider; class MailServiceProvider extends ServiceProvider implements DeferrableProvider { /** * Register the service provider. * * @return void */ public function register() { $this->registerSwiftMailer(); $this->registerIlluminateMailer(); $this->registerMarkdownRenderer(); } /** * Register the Illuminate mailer instance. * * @return void */ protected function registerIlluminateMailer() { $this->app->singleton('mailer', function () { $config = $this->app->make('config')->get('mail'); // Once we have create the mailer instance, we will set a container instance // on the mailer. This allows us to resolve mailer classes via containers // for maximum testability on said classes instead of passing Closures. $mailer = new Mailer( $this->app['view'], $this->app['swift.mailer'], $this->app['events'] ); if ($this->app->bound('queue')) { $mailer->setQueue($this->app['queue']); } // Next we will set all of the global addresses on this mailer, which allows // for easy unification of all "from" addresses as well as easy debugging // of sent messages since they get be sent into a single email address. foreach (['from', 'reply_to', 'to'] as $type) { $this->setGlobalAddress($mailer, $config, $type); } return $mailer; }); } /** * Set a global address on the mailer by type. * * @param \Illuminate\Mail\Mailer $mailer * @param array $config * @param string $type * @return void */ protected function setGlobalAddress($mailer, array $config, $type) { $address = Arr::get($config, $type); if (is_array($address) && isset($address['address'])) { $mailer->{'always'.Str::studly($type)}($address['address'], $address['name']); } } /** * Register the Swift Mailer instance. * * @return void */ public function registerSwiftMailer() { $this->registerSwiftTransport(); // Once we have the transporter registered, we will register the actual Swift // mailer instance, passing in the transport instances, which allows us to // override this transporter instances during app start-up if necessary. $this->app->singleton('swift.mailer', function () { if ($domain = $this->app->make('config')->get('mail.domain')) { Swift_DependencyContainer::getInstance() ->register('mime.idgenerator.idright') ->asValue($domain); } return new Swift_Mailer($this->app['swift.transport']->driver()); }); } /** * Register the Swift Transport instance. * * @return void */ protected function registerSwiftTransport() { $this->app->singleton('swift.transport', function () { return new TransportManager($this->app); }); } /** * Register the Markdown renderer instance. * * @return void */ protected function registerMarkdownRenderer() { if ($this->app->runningInConsole()) { $this->publishes([ __DIR__.'/resources/views' => $this->app->resourcePath('views/vendor/mail'), ], 'laravel-mail'); } $this->app->singleton(Markdown::class, function () { $config = $this->app->make('config'); return new Markdown($this->app->make('view'), [ 'theme' => $config->get('mail.markdown.theme', 'default'), 'paths' => $config->get('mail.markdown.paths', []), ]); }); } /** * Get the services provided by the provider. * * @return array */ public function provides() { return [ 'mailer', 'swift.mailer', 'swift.transport', Markdown::class, ]; } }