<?php /* 1. Add the dependency to your composer.json. // I'm using https://packagist.org/packages/tijsverkoyen/css-to-inline-styles */ /* 2. Extend \Illuminate\Mail\Mailer to override the getView() method // app/libraries/MyApp/Mailer.php */ namespace MyApp\Mail; class Mailer extends \Illuminate\Mail\Mailer { /** * Render the given view. * * @param string $view * @param array $data * @return \Illuminate\View\View */ protected function getView($view, $data) { $cssInline = new \TijsVerkoyen\CssToInlineStyles\CssToInlineStyles(); $view = $this->views->make($view, $data)->render(); $cssInline->setUseInlineStylesBlock(); $cssInline->setStripOriginalStyleTags(); $cssInline->setCleanup(); $cssInline->setHTML($view); return $cssInline->convert(); } } /* 3. Extend the \Illuminate\Mail\MailServiceProvider to override the register() method // app/libraries/MyApp/MailServiceProvider.php */ namespace MyApp\Mail; class MailServiceProvider extends \Illuminate\Mail\MailServiceProvider { public function register() { $this->registerSwiftMailer(); $this->app['mailer'] = $this->app->share(function($app) { // 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 \MyApp\Mail\Mailer($app['view'], $app['swift.mailer']); $mailer->setLogger($app['log'])->setQueue($app['queue']); $mailer->setContainer($app); // If a "from" address is set, we will set it on the mailer so that all mail // messages sent by the applications will utilize the same "from" address // on each one, which makes the developer's life a lot more convenient. $from = $app['config']['mail.from']; if (is_array($from) and isset($from['address'])) { $mailer->alwaysFrom($from['address'], $from['name']); } // Here we will determine if the mailer should be in "pretend" mode for this // environment, which will simply write out e-mail to the logs instead of // sending it over the web, which is useful for local dev enviornments. $pretend = $app['config']->get('mail.pretend', false); $mailer->pretend($pretend); return $mailer; }); } } /* 4. Comment the default service in app/config/app.php and add the new one you have just created // app/config/app.php */ // ommited some parts for brevity return { 'providers' => array( //'Illuminate\Mail\MailServiceProvider', // Mail Hack 'MyApp\Mail\MailServiceProvider', ) } // 5. I'm storing this classes in app/libraries and Laravel should know of this path to works its autoloading magic // app/start/global.php ClassLoader::addDirectories(array( app_path().'/commands', app_path().'/controllers', app_path().'/libraries', // ADD THIS LINE app_path().'/mailers', app_path().'/models', app_path().'/database/seeds', ));