Skip to content
This repository was archived by the owner on Feb 6, 2022. It is now read-only.

Commit 6b7316b

Browse files
committed
feature #118 Allow to setup transports via URL (KingCrunch)
This PR was merged into the 2.3-dev branch. Discussion ---------- Allow to setup transports via URL | Q | A | ------------- | --- | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #101 | License | MIT | Doc PR | - For example as YML ```yml swiftmailer: default_mailer: smtp_mailer mailers: smtp_mailer: url: smtp://username:[email protected]:12345?encryption=tls&auth_mode=login ``` This is primary useful for SMTP-transports. There is no benefit, for "sendmail"-, or "mail"-transports. The intention is, that one only needs to set up one config option/parameter to define a working transport. For example see [`parameters.yml` of `symfony/symfony-standard`](https://github.com/symfony/symfony-standard/blob/2.8/app/config/parameters.yml.dist#L13-L16) ```yml mailer_transport: smtp mailer_host: 127.0.0.1 mailer_user: ~ mailer_password: ~ ``` For different stages one usually must set at least "user" and "password" and often "host" too for every stage. With this patch it would look like ``` mailer_url: 'smtp://127.0.0.1' ``` Commits ------- 49219dc Allow to setup transports via URL
2 parents b853130 + 49219dc commit 6b7316b

File tree

7 files changed

+75
-0
lines changed

7 files changed

+75
-0
lines changed

DependencyInjection/Configuration.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ private function getMailersNode()
8989
->useAttributeAsKey('name')
9090
->prototype('array')
9191
->children()
92+
->scalarNode('url')->defaultNull()->end()
9293
->scalarNode('transport')->defaultValue('smtp')->end()
9394
->scalarNode('username')->defaultNull()->end()
9495
->scalarNode('password')->defaultNull()->end()

DependencyInjection/SwiftmailerExtension.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,37 @@ protected function configureMailer($name, array $mailer, ContainerBuilder $conta
7575
$transport = $mailer['transport'];
7676
}
7777

78+
if (null !== $mailer['url']) {
79+
$parts = parse_url($mailer['url']);
80+
if (!empty($parts['scheme'])) {
81+
$transport = $parts['scheme'];
82+
}
83+
84+
if (!empty($parts['user'])) {
85+
$mailer['username'] = $parts['user'];
86+
}
87+
if (!empty($parts['pass'])) {
88+
$mailer['password']= $parts['pass'];
89+
}
90+
if (!empty($parts['host'])) {
91+
$mailer['host'] = $parts['host'];
92+
}
93+
if (!empty($parts['port'])) {
94+
$mailer['port'] = $parts['port'];
95+
}
96+
if (!empty($parts['query'])) {
97+
$query = array();
98+
parse_str($parts['query'], $query);
99+
if (!empty($query['encryption'])) {
100+
$mailer['encryption'] = $query['encryption'];
101+
}
102+
if (!empty($query['auth_mode'])) {
103+
$mailer['auth_mode'] = $query['auth_mode'];
104+
}
105+
}
106+
}
107+
unset($mailer['url']);
108+
78109
$container->setParameter(sprintf('swiftmailer.mailer.%s.transport.name', $name), $transport);
79110

80111
if (isset($mailer['disable_delivery']) && $mailer['disable_delivery']) {

Resources/config/schema/swiftmailer-1.0.xsd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
<xsd:attribute name="delivery-address" type="xsd:string" />
3737
<xsd:attribute name="disable-delivery" type="xsd:boolean" />
3838
<xsd:attribute name="sender-address" type="xsd:boolean" />
39+
<xsd:attribute name="url" type="xsd:string" />
3940
</xsd:attributeGroup>
4041

4142
<xsd:complexType name="mailer">
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
$container->loadFromExtension('swiftmailer', array(
3+
'default_mailer' => 'smtp_mailer',
4+
'mailers' => array(
5+
'smtp_mailer' => array(
6+
'url' => 'smtp://username:[email protected]:12345?encryption=tls&auth_mode=login',
7+
),
8+
),
9+
));
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<container xmlns="http://symfony.com/schema/dic/services"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xmlns:swiftmailer="http://symfony.com/schema/dic/swiftmailer"
5+
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
6+
http://symfony.com/schema/dic/swiftmailer http://symfony.com/schema/dic/swiftmailer/swiftmailer-1.0.xsd">
7+
8+
<swiftmailer:config default-mailer="smtp_mailer">
9+
<swiftmailer:mailer name="smtp_mailer"
10+
url="smtp://username:[email protected]:12345?encryption=tls&amp;auth_mode=login">
11+
</swiftmailer:mailer>
12+
</swiftmailer:config>
13+
</container>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
swiftmailer:
2+
default_mailer: smtp_mailer
3+
mailers:
4+
smtp_mailer:
5+
url: smtp://username:[email protected]:12345?encryption=tls&auth_mode=login

Tests/DependencyInjection/SwiftmailerExtensionTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,21 @@ public function testManyMailers($type)
135135
$this->assertEquals('1000', $container->getParameter('swiftmailer.mailer.third_mailer.transport.smtp.timeout'));
136136
$this->assertEquals('127.0.0.1', $container->getParameter('swiftmailer.mailer.third_mailer.transport.smtp.source_ip'));
137137
}
138+
/**
139+
* @dataProvider getConfigTypes
140+
*/
141+
public function testUrls($type)
142+
{
143+
$container = $this->loadContainerFromFile('urls', $type);
144+
145+
146+
$this->assertEquals('example.com', $container->getParameter('swiftmailer.mailer.smtp_mailer.transport.smtp.host'));
147+
$this->assertEquals('12345', $container->getParameter('swiftmailer.mailer.smtp_mailer.transport.smtp.port'));
148+
$this->assertEquals('tls', $container->getParameter('swiftmailer.mailer.smtp_mailer.transport.smtp.encryption'));
149+
$this->assertEquals('username', $container->getParameter('swiftmailer.mailer.smtp_mailer.transport.smtp.username'));
150+
$this->assertEquals('password', $container->getParameter('swiftmailer.mailer.smtp_mailer.transport.smtp.password'));
151+
$this->assertEquals('login', $container->getParameter('swiftmailer.mailer.smtp_mailer.transport.smtp.auth_mode'));
152+
}
138153

139154
/**
140155
* @dataProvider getConfigTypes

0 commit comments

Comments
 (0)