diff --git a/src/Illuminate/Mail/MailManager.php b/src/Illuminate/Mail/MailManager.php index ad25ff5d7668..05d6d8e3c842 100644 --- a/src/Illuminate/Mail/MailManager.php +++ b/src/Illuminate/Mail/MailManager.php @@ -18,6 +18,7 @@ use Postmark\Transport as PostmarkTransport; use Psr\Log\LoggerInterface; use Swift_DependencyContainer; +use Swift_FailoverTransport as FailoverTransport; use Swift_Mailer; use Swift_SendmailTransport as SendmailTransport; use Swift_SmtpTransport as SmtpTransport; @@ -341,6 +342,34 @@ protected function createPostmarkTransport(array $config) }); } + /** + * Create an instance of the Failover Swift Transport driver. + * + * @param array $config + * @return \Swift_FailoverTransport + */ + protected function createFailoverTransport(array $config) + { + $transports = []; + + foreach ($config['mailers'] as $name) { + $config = $this->getConfig($name); + + if (is_null($config)) { + throw new InvalidArgumentException("Mailer [{$name}] is not defined."); + } + + // Now, we will check if the "driver" key exists and if it does we will set + // the transport configuration parameter in order to offer compatibility + // with any Laravel <= 6.x application style mail configuration files. + $transports[] = $this->app['config']['mail.driver'] + ? $this->createTransport(array_merge($config, ['transport' => $name])) + : $this->createTransport($config); + } + + return new FailoverTransport($transports); + } + /** * Create an instance of the Log Swift Transport driver. * diff --git a/tests/Mail/MailFailoverTransportTest.php b/tests/Mail/MailFailoverTransportTest.php new file mode 100644 index 000000000000..6d8c8fec8bd9 --- /dev/null +++ b/tests/Mail/MailFailoverTransportTest.php @@ -0,0 +1,63 @@ +app['config']->set('mail.default', 'failover'); + + $this->app['config']->set('mail.mailers', [ + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'sendmail', + 'array', + ], + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => '/usr/sbin/sendmail -bs', + ], + + 'array' => [ + 'transport' => 'array', + ], + ]); + + $transport = app('mailer')->getSwiftMailer()->getTransport(); + $this->assertInstanceOf(\Swift_FailoverTransport::class, $transport); + + $transports = $transport->getTransports(); + $this->assertCount(2, $transports); + $this->assertInstanceOf(\Swift_SendmailTransport::class, $transports[0]); + $this->assertEquals('/usr/sbin/sendmail -bs', $transports[0]->getCommand()); + $this->assertInstanceOf(ArrayTransport::class, $transports[1]); + } + + public function testGetFailoverTransportWithLaravel6StyleMailConfiguration() + { + $this->app['config']->set('mail.driver', 'failover'); + + $this->app['config']->set('mail.mailers', [ + 'sendmail', + 'array', + ]); + + $this->app['config']->set('mail.sendmail', '/usr/sbin/sendmail -bs'); + + $transport = app('mailer')->getSwiftMailer()->getTransport(); + $this->assertInstanceOf(\Swift_FailoverTransport::class, $transport); + + $transports = $transport->getTransports(); + $this->assertCount(2, $transports); + $this->assertInstanceOf(\Swift_SendmailTransport::class, $transports[0]); + $this->assertEquals('/usr/sbin/sendmail -bs', $transports[0]->getCommand()); + $this->assertInstanceOf(ArrayTransport::class, $transports[1]); + } +}