diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 5343ca55..2123ce61 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -89,6 +89,7 @@ private function getMailersNode() ->useAttributeAsKey('name') ->prototype('array') ->children() + ->scalarNode('url')->defaultNull()->end() ->scalarNode('transport')->defaultValue('smtp')->end() ->scalarNode('username')->defaultNull()->end() ->scalarNode('password')->defaultNull()->end() diff --git a/DependencyInjection/SwiftmailerExtension.php b/DependencyInjection/SwiftmailerExtension.php index 02aa1d8e..5681728f 100644 --- a/DependencyInjection/SwiftmailerExtension.php +++ b/DependencyInjection/SwiftmailerExtension.php @@ -75,6 +75,37 @@ protected function configureMailer($name, array $mailer, ContainerBuilder $conta $transport = $mailer['transport']; } + if (null !== $mailer['url']) { + $parts = parse_url($mailer['url']); + if (!empty($parts['scheme'])) { + $transport = $parts['scheme']; + } + + if (!empty($parts['user'])) { + $mailer['username'] = $parts['user']; + } + if (!empty($parts['pass'])) { + $mailer['password']= $parts['pass']; + } + if (!empty($parts['host'])) { + $mailer['host'] = $parts['host']; + } + if (!empty($parts['port'])) { + $mailer['port'] = $parts['port']; + } + if (!empty($parts['query'])) { + $query = array(); + parse_str($parts['query'], $query); + if (!empty($query['encryption'])) { + $mailer['encryption'] = $query['encryption']; + } + if (!empty($query['auth_mode'])) { + $mailer['auth_mode'] = $query['auth_mode']; + } + } + } + unset($mailer['url']); + $container->setParameter(sprintf('swiftmailer.mailer.%s.transport.name', $name), $transport); if (isset($mailer['disable_delivery']) && $mailer['disable_delivery']) { diff --git a/Resources/config/schema/swiftmailer-1.0.xsd b/Resources/config/schema/swiftmailer-1.0.xsd index 86eae694..a12701c1 100644 --- a/Resources/config/schema/swiftmailer-1.0.xsd +++ b/Resources/config/schema/swiftmailer-1.0.xsd @@ -35,6 +35,7 @@ + diff --git a/Tests/DependencyInjection/Fixtures/config/php/urls.php b/Tests/DependencyInjection/Fixtures/config/php/urls.php new file mode 100644 index 00000000..82f7806e --- /dev/null +++ b/Tests/DependencyInjection/Fixtures/config/php/urls.php @@ -0,0 +1,9 @@ +loadFromExtension('swiftmailer', array( + 'default_mailer' => 'smtp_mailer', + 'mailers' => array( + 'smtp_mailer' => array( + 'url' => 'smtp://username:password@example.com:12345?encryption=tls&auth_mode=login', + ), + ), +)); diff --git a/Tests/DependencyInjection/Fixtures/config/xml/urls.xml b/Tests/DependencyInjection/Fixtures/config/xml/urls.xml new file mode 100644 index 00000000..ce0c429c --- /dev/null +++ b/Tests/DependencyInjection/Fixtures/config/xml/urls.xml @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/Tests/DependencyInjection/Fixtures/config/yml/urls.yml b/Tests/DependencyInjection/Fixtures/config/yml/urls.yml new file mode 100644 index 00000000..6eb1af6c --- /dev/null +++ b/Tests/DependencyInjection/Fixtures/config/yml/urls.yml @@ -0,0 +1,5 @@ +swiftmailer: + default_mailer: smtp_mailer + mailers: + smtp_mailer: + url: smtp://username:password@example.com:12345?encryption=tls&auth_mode=login diff --git a/Tests/DependencyInjection/SwiftmailerExtensionTest.php b/Tests/DependencyInjection/SwiftmailerExtensionTest.php index 4a777a33..77ce45e2 100644 --- a/Tests/DependencyInjection/SwiftmailerExtensionTest.php +++ b/Tests/DependencyInjection/SwiftmailerExtensionTest.php @@ -135,6 +135,21 @@ public function testManyMailers($type) $this->assertEquals('1000', $container->getParameter('swiftmailer.mailer.third_mailer.transport.smtp.timeout')); $this->assertEquals('127.0.0.1', $container->getParameter('swiftmailer.mailer.third_mailer.transport.smtp.source_ip')); } + /** + * @dataProvider getConfigTypes + */ + public function testUrls($type) + { + $container = $this->loadContainerFromFile('urls', $type); + + + $this->assertEquals('example.com', $container->getParameter('swiftmailer.mailer.smtp_mailer.transport.smtp.host')); + $this->assertEquals('12345', $container->getParameter('swiftmailer.mailer.smtp_mailer.transport.smtp.port')); + $this->assertEquals('tls', $container->getParameter('swiftmailer.mailer.smtp_mailer.transport.smtp.encryption')); + $this->assertEquals('username', $container->getParameter('swiftmailer.mailer.smtp_mailer.transport.smtp.username')); + $this->assertEquals('password', $container->getParameter('swiftmailer.mailer.smtp_mailer.transport.smtp.password')); + $this->assertEquals('login', $container->getParameter('swiftmailer.mailer.smtp_mailer.transport.smtp.auth_mode')); + } /** * @dataProvider getConfigTypes