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