vendor/symfony/swiftmailer-bundle/DependencyInjection/SwiftmailerExtension.php line 62

Open in your IDE?
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Bundle\SwiftmailerBundle\DependencyInjection;
  11. use Symfony\Component\Config\FileLocator;
  12. use Symfony\Component\Console\Application;
  13. use Symfony\Component\DependencyInjection\Alias;
  14. use Symfony\Component\DependencyInjection\ChildDefinition;
  15. use Symfony\Component\DependencyInjection\ContainerBuilder;
  16. use Symfony\Component\DependencyInjection\ContainerInterface;
  17. use Symfony\Component\DependencyInjection\Definition;
  18. use Symfony\Component\DependencyInjection\DefinitionDecorator;
  19. use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
  20. use Symfony\Component\DependencyInjection\Reference;
  21. use Symfony\Component\HttpKernel\DependencyInjection\Extension;
  22. /**
  23. * SwiftmailerExtension is an extension for the SwiftMailer library.
  24. *
  25. * @author Fabien Potencier <fabien@symfony.com>
  26. */
  27. class SwiftmailerExtension extends Extension
  28. {
  29. /**
  30. * Loads the Swift Mailer configuration.
  31. *
  32. * Usage example:
  33. *
  34. * <swiftmailer:config transport="gmail">
  35. * <swiftmailer:username>fabien</swift:username>
  36. * <swiftmailer:password>xxxxx</swift:password>
  37. * <swiftmailer:spool path="/path/to/spool/" />
  38. * </swiftmailer:config>
  39. *
  40. * @param array $configs An array of configuration settings
  41. * @param ContainerBuilder $container A ContainerBuilder instance
  42. */
  43. public function load(array $configs, ContainerBuilder $container)
  44. {
  45. $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
  46. $loader->load('swiftmailer.xml');
  47. if (class_exists(Application::class)) {
  48. $loader->load('console.xml');
  49. }
  50. $configuration = $this->getConfiguration($configs, $container);
  51. $config = $this->processConfiguration($configuration, $configs);
  52. $mailers = [];
  53. foreach ($config['mailers'] as $name => $mailer) {
  54. $isDefaultMailer = $config['default_mailer'] === $name;
  55. $this->configureMailer($name, $mailer, $container, $isDefaultMailer);
  56. $mailers[$name] = sprintf('swiftmailer.mailer.%s', $name);
  57. }
  58. ksort($mailers);
  59. $container->setParameter('swiftmailer.mailers', $mailers);
  60. $container->setParameter('swiftmailer.default_mailer', $config['default_mailer']);
  61. $container->findDefinition('swiftmailer.data_collector')->addTag('data_collector', ['template' => '@Swiftmailer/Collector/swiftmailer.html.twig', 'id' => 'swiftmailer', 'priority' => 245]);
  62. $container->setAlias('mailer', 'swiftmailer.mailer');
  63. $container->getAlias('mailer')->setPublic(true);
  64. }
  65. protected function configureMailer($name, array $mailer, ContainerBuilder $container, $isDefaultMailer = false)
  66. {
  67. $definitionDecorator = $this->createChildDefinition('swiftmailer.transport.eventdispatcher.abstract');
  68. $container
  69. ->setDefinition(sprintf('swiftmailer.mailer.%s.transport.eventdispatcher', $name), $definitionDecorator)
  70. ;
  71. $usedEnvs = null;
  72. $disableDelivery = isset($mailer['disable_delivery']) && $mailer['disable_delivery'];
  73. if (method_exists($container, 'resolveEnvPlaceholders')) {
  74. $options = [];
  75. $envVariablesAllowed = ['transport', 'url', 'username', 'password', 'host', 'port', 'timeout', 'source_ip', 'local_domain', 'encryption', 'auth_mode', 'command', 'stream_options'];
  76. foreach ($envVariablesAllowed as $key) {
  77. $container->resolveEnvPlaceholders($mailer[$key], null, $usedEnvs);
  78. $options[$key] = $mailer[$key];
  79. }
  80. }
  81. if (!$usedEnvs) {
  82. SwiftmailerTransportFactory::validateConfig($mailer);
  83. }
  84. if ($usedEnvs && !$disableDelivery) {
  85. $transportId = sprintf('swiftmailer.mailer.%s.transport.dynamic', $name);
  86. $definitionDecorator = new Definition('\Swift_Transport');
  87. $definitionDecorator->setFactory(['Symfony\Bundle\SwiftmailerBundle\DependencyInjection\SwiftmailerTransportFactory', 'createTransport']);
  88. $definitionDecorator->setArguments([
  89. $options,
  90. new Reference('router.request_context', ContainerInterface::NULL_ON_INVALID_REFERENCE),
  91. new Reference(sprintf('swiftmailer.mailer.%s.transport.eventdispatcher', $name)),
  92. ]);
  93. $container->setDefinition(sprintf('swiftmailer.mailer.%s.transport.dynamic', $name), $definitionDecorator);
  94. $container->setAlias(sprintf('swiftmailer.mailer.%s.transport', $name), $transportId);
  95. $definitionDecorator = $this->createChildDefinition('swiftmailer.mailer.abstract');
  96. $container
  97. ->setDefinition(sprintf('swiftmailer.mailer.%s', $name), $definitionDecorator)
  98. ->replaceArgument(0, new Reference(sprintf('swiftmailer.mailer.%s.transport', $name)))
  99. ;
  100. $container->setParameter(sprintf('swiftmailer.mailer.%s.transport.name', $name), 'dynamic');
  101. } else {
  102. $mailer = SwiftmailerTransportFactory::resolveOptions($mailer);
  103. $transport = $disableDelivery ? 'null' : $mailer['transport'];
  104. $container->setParameter(sprintf('swiftmailer.mailer.%s.transport.name', $name), $transport);
  105. $transportId = \in_array($transport, ['smtp', 'sendmail', 'null'])
  106. ? sprintf('swiftmailer.mailer.%s.transport.%s', $name, $transport)
  107. : $transport;
  108. $this->configureMailerTransport($name, $mailer, $container, $transport, $isDefaultMailer);
  109. }
  110. $this->configureMailerSpool($name, $mailer, $container, $transportId, $isDefaultMailer);
  111. $this->configureMailerSenderAddress($name, $mailer, $container, $isDefaultMailer);
  112. $this->configureMailerAntiFlood($name, $mailer, $container, $isDefaultMailer);
  113. $this->configureMailerDeliveryAddress($name, $mailer, $container, $isDefaultMailer);
  114. $this->configureMailerLogging($name, $mailer, $container, $isDefaultMailer);
  115. $container->setParameter(sprintf('swiftmailer.mailer.%s.delivery.enabled', $name), !$disableDelivery);
  116. // alias
  117. if ($isDefaultMailer) {
  118. $container->setAlias('swiftmailer.mailer', sprintf('swiftmailer.mailer.%s', $name));
  119. $container->setAlias('swiftmailer.transport', new Alias(sprintf('swiftmailer.mailer.%s.transport', $name), true));
  120. $container->setParameter('swiftmailer.spool.enabled', $container->getParameter(sprintf('swiftmailer.mailer.%s.spool.enabled', $name)));
  121. $container->setParameter('swiftmailer.delivery.enabled', $container->getParameter(sprintf('swiftmailer.mailer.%s.delivery.enabled', $name)));
  122. $container->setParameter('swiftmailer.single_address', $container->getParameter(sprintf('swiftmailer.mailer.%s.single_address', $name)));
  123. $container->setAlias('Swift_Mailer', new Alias('swiftmailer.mailer', false));
  124. $container->setAlias('Swift_Transport', new Alias('swiftmailer.transport', false));
  125. }
  126. }
  127. protected function configureMailerTransport($name, array $mailer, ContainerBuilder $container, $transport, $isDefaultMailer = false)
  128. {
  129. foreach (['encryption', 'port', 'host', 'username', 'password', 'auth_mode', 'timeout', 'source_ip', 'local_domain', 'stream_options'] as $key) {
  130. $container->setParameter(sprintf('swiftmailer.mailer.%s.transport.smtp.%s', $name, $key), $mailer[$key]);
  131. }
  132. if ('smtp' === $transport) {
  133. $authDecorator = $this->createChildDefinition('swiftmailer.transport.authhandler.abstract');
  134. $container
  135. ->setDefinition(sprintf('swiftmailer.mailer.%s.transport.authhandler', $name), $authDecorator)
  136. ->addMethodCall('setUsername', [sprintf('%%swiftmailer.mailer.%s.transport.smtp.username%%', $name)])
  137. ->addMethodCall('setPassword', [sprintf('%%swiftmailer.mailer.%s.transport.smtp.password%%', $name)])
  138. ->addMethodCall('setAuthMode', [sprintf('%%swiftmailer.mailer.%s.transport.smtp.auth_mode%%', $name)]);
  139. $bufferDecorator = $this->createChildDefinition('swiftmailer.transport.buffer.abstract');
  140. $container
  141. ->setDefinition(sprintf('swiftmailer.mailer.%s.transport.buffer', $name), $bufferDecorator);
  142. $configuratorDecorator = $this->createChildDefinition('swiftmailer.transport.smtp.configurator.abstract');
  143. $container
  144. ->setDefinition(sprintf('swiftmailer.transport.configurator.%s', $name), $configuratorDecorator)
  145. ->setArguments([
  146. sprintf('%%swiftmailer.mailer.%s.transport.smtp.local_domain%%', $name),
  147. new Reference('router.request_context', ContainerInterface::NULL_ON_INVALID_REFERENCE),
  148. ])
  149. ;
  150. $definitionDecorator = $this->createChildDefinition('swiftmailer.transport.smtp.abstract');
  151. $container
  152. ->setDefinition(sprintf('swiftmailer.mailer.%s.transport.smtp', $name), $definitionDecorator)
  153. ->setArguments([
  154. new Reference(sprintf('swiftmailer.mailer.%s.transport.buffer', $name)),
  155. [new Reference(sprintf('swiftmailer.mailer.%s.transport.authhandler', $name))],
  156. new Reference(sprintf('swiftmailer.mailer.%s.transport.eventdispatcher', $name)),
  157. ])
  158. ->addMethodCall('setHost', [sprintf('%%swiftmailer.mailer.%s.transport.smtp.host%%', $name)])
  159. ->addMethodCall('setPort', [sprintf('%%swiftmailer.mailer.%s.transport.smtp.port%%', $name)])
  160. ->addMethodCall('setEncryption', [sprintf('%%swiftmailer.mailer.%s.transport.smtp.encryption%%', $name)])
  161. ->addMethodCall('setTimeout', [sprintf('%%swiftmailer.mailer.%s.transport.smtp.timeout%%', $name)])
  162. ->addMethodCall('setSourceIp', [sprintf('%%swiftmailer.mailer.%s.transport.smtp.source_ip%%', $name)])
  163. ->setConfigurator([new Reference(sprintf('swiftmailer.transport.configurator.%s', $name)), 'configure'])
  164. ;
  165. if ($mailer['stream_options']) {
  166. $container->setParameter(sprintf('swiftmailer.mailer.%s.transport.smtp.stream_options', $name), $mailer['stream_options']);
  167. $definitionDecorator->addMethodCall('setStreamOptions', [sprintf('%%swiftmailer.mailer.%s.transport.smtp.stream_options%%', $name)]);
  168. }
  169. $container->setAlias(sprintf('swiftmailer.mailer.%s.transport', $name), sprintf('swiftmailer.mailer.%s.transport.%s', $name, $transport));
  170. } elseif ('sendmail' === $transport) {
  171. $bufferDecorator = $this->createChildDefinition('swiftmailer.transport.buffer.abstract');
  172. $container
  173. ->setDefinition(sprintf('swiftmailer.mailer.%s.transport.buffer', $name), $bufferDecorator);
  174. $configuratorDecorator = $this->createChildDefinition('swiftmailer.transport.smtp.configurator.abstract');
  175. $container
  176. ->setDefinition(sprintf('swiftmailer.transport.configurator.%s', $name), $configuratorDecorator)
  177. ->setArguments([
  178. sprintf('%%swiftmailer.mailer.%s.transport.smtp.local_domain%%', $name),
  179. new Reference('router.request_context', ContainerInterface::NULL_ON_INVALID_REFERENCE),
  180. ])
  181. ;
  182. $definitionDecorator = $this->createChildDefinition(sprintf('swiftmailer.transport.%s.abstract', $transport));
  183. $container
  184. ->setDefinition(sprintf('swiftmailer.mailer.%s.transport.%s', $name, $transport), $definitionDecorator)
  185. ->setArguments([
  186. new Reference(sprintf('swiftmailer.mailer.%s.transport.buffer', $name)),
  187. new Reference(sprintf('swiftmailer.mailer.%s.transport.eventdispatcher', $name)),
  188. ])
  189. ->addMethodCall('setCommand', [$mailer['command']])
  190. ->setConfigurator([new Reference(sprintf('swiftmailer.transport.configurator.%s', $name)), 'configure'])
  191. ;
  192. $container->setAlias(sprintf('swiftmailer.mailer.%s.transport', $name), sprintf('swiftmailer.mailer.%s.transport.%s', $name, $transport));
  193. } elseif ('null' === $transport) {
  194. $definitionDecorator = $this->createChildDefinition('swiftmailer.transport.null.abstract');
  195. $container
  196. ->setDefinition(sprintf('swiftmailer.mailer.%s.transport.null', $name), $definitionDecorator)
  197. ->setArguments([
  198. new Reference(sprintf('swiftmailer.mailer.%s.transport.eventdispatcher', $name)),
  199. ])
  200. ;
  201. $container->setAlias(sprintf('swiftmailer.mailer.%s.transport', $name), sprintf('swiftmailer.mailer.%s.transport.%s', $name, $transport));
  202. } else {
  203. $container->setAlias(sprintf('swiftmailer.mailer.%s.transport', $name), sprintf('swiftmailer.mailer.transport.%s', $transport));
  204. }
  205. $container->getAlias(sprintf('swiftmailer.mailer.%s.transport', $name))->setPublic(true);
  206. $definitionDecorator = $this->createChildDefinition('swiftmailer.mailer.abstract');
  207. $container
  208. ->setDefinition(sprintf('swiftmailer.mailer.%s', $name), $definitionDecorator)
  209. ->replaceArgument(0, new Reference(sprintf('swiftmailer.mailer.%s.transport', $name)))
  210. ;
  211. }
  212. protected function configureMailerSpool($name, array $mailer, ContainerBuilder $container, $transport, $isDefaultMailer = false)
  213. {
  214. if (isset($mailer['spool'])) {
  215. $type = $mailer['spool']['type'];
  216. if ('service' === $type) {
  217. $container->setAlias(sprintf('swiftmailer.mailer.%s.spool.service', $name), $mailer['spool']['id']);
  218. } else {
  219. foreach (['path'] as $key) {
  220. $container->setParameter(sprintf('swiftmailer.spool.%s.%s.%s', $name, $type, $key), $mailer['spool'][$key].'/'.$name);
  221. }
  222. }
  223. $definitionDecorator = $this->createChildDefinition(sprintf('swiftmailer.spool.%s.abstract', $type));
  224. if ('file' === $type) {
  225. $container
  226. ->setDefinition(sprintf('swiftmailer.mailer.%s.spool.file', $name), $definitionDecorator)
  227. ->replaceArgument(0, sprintf('%%swiftmailer.spool.%s.file.path%%', $name))
  228. ;
  229. } elseif ('memory' === $type) {
  230. $container
  231. ->setDefinition(sprintf('swiftmailer.mailer.%s.spool.memory', $name), $definitionDecorator)
  232. ;
  233. }
  234. $container->setAlias(sprintf('swiftmailer.mailer.%s.spool', $name), sprintf('swiftmailer.mailer.%s.spool.%s', $name, $type));
  235. $definitionDecorator = $this->createChildDefinition('swiftmailer.transport.spool.abstract');
  236. $container
  237. ->setDefinition(sprintf('swiftmailer.mailer.%s.transport.spool', $name), $definitionDecorator)
  238. ->setArguments([
  239. new Reference(sprintf('swiftmailer.mailer.%s.transport.eventdispatcher', $name)),
  240. new Reference(sprintf('swiftmailer.mailer.%s.spool', $name)),
  241. ])
  242. ;
  243. $container->setAlias(sprintf('swiftmailer.mailer.%s.transport.real', $name), $transport);
  244. $container->getAlias(sprintf('swiftmailer.mailer.%s.transport.real', $name))->setPublic(true);
  245. $container->setAlias(sprintf('swiftmailer.mailer.%s.transport', $name), sprintf('swiftmailer.mailer.%s.transport.spool', $name));
  246. $container->setParameter(sprintf('swiftmailer.mailer.%s.spool.enabled', $name), true);
  247. if (true === $isDefaultMailer) {
  248. $container->setAlias('swiftmailer.spool', sprintf('swiftmailer.mailer.%s.spool', $name));
  249. $container->setAlias('swiftmailer.transport.real', sprintf('swiftmailer.mailer.%s.transport.real', $name));
  250. $container->setAlias('Swift_Spool', new Alias('swiftmailer.spool', false));
  251. }
  252. } else {
  253. $container->setParameter(sprintf('swiftmailer.mailer.%s.spool.enabled', $name), false);
  254. }
  255. }
  256. protected function configureMailerSenderAddress($name, array $mailer, ContainerBuilder $container, $isDefaultMailer = false)
  257. {
  258. if (isset($mailer['sender_address']) && $mailer['sender_address']) {
  259. $container->setParameter(sprintf('swiftmailer.mailer.%s.sender_address', $name), $mailer['sender_address']);
  260. $definitionDecorator = $this->createChildDefinition('swiftmailer.plugin.impersonate.abstract');
  261. $container
  262. ->setDefinition(sprintf('swiftmailer.mailer.%s.plugin.impersonate', $name), $definitionDecorator)
  263. ->setArguments([
  264. sprintf('%%swiftmailer.mailer.%s.sender_address%%', $name),
  265. ])
  266. ;
  267. $container->getDefinition(sprintf('swiftmailer.mailer.%s.plugin.impersonate', $name))->addTag(sprintf('swiftmailer.%s.plugin', $name));
  268. if (true === $isDefaultMailer) {
  269. $container->setAlias('swiftmailer.plugin.impersonate', sprintf('swiftmailer.mailer.%s.plugin.impersonate', $name));
  270. $container->setParameter('swiftmailer.sender_address', $container->getParameter(sprintf('swiftmailer.mailer.%s.sender_address', $name)));
  271. }
  272. } else {
  273. $container->setParameter(sprintf('swiftmailer.mailer.%s.plugin.impersonate', $name), null);
  274. }
  275. }
  276. protected function configureMailerAntiFlood($name, array $mailer, ContainerBuilder $container, $isDefaultMailer = false)
  277. {
  278. if (isset($mailer['antiflood'])) {
  279. $container->setParameter(sprintf('swiftmailer.mailer.%s.antiflood.threshold', $name), $mailer['antiflood']['threshold']);
  280. $container->setParameter(sprintf('swiftmailer.mailer.%s.antiflood.sleep', $name), $mailer['antiflood']['sleep']);
  281. $definitionDecorator = $this->createChildDefinition('swiftmailer.plugin.antiflood.abstract');
  282. $container
  283. ->setDefinition(sprintf('swiftmailer.mailer.%s.plugin.antiflood', $name), $definitionDecorator)
  284. ->setArguments([
  285. sprintf('%%swiftmailer.mailer.%s.antiflood.threshold%%', $name),
  286. sprintf('%%swiftmailer.mailer.%s.antiflood.sleep%%', $name),
  287. ])
  288. ;
  289. $container->getDefinition(sprintf('swiftmailer.mailer.%s.plugin.antiflood', $name))->addTag(sprintf('swiftmailer.%s.plugin', $name));
  290. if (true === $isDefaultMailer) {
  291. $container->setAlias('swiftmailer.mailer.plugin.antiflood', sprintf('swiftmailer.mailer.%s.plugin.antiflood', $name));
  292. }
  293. }
  294. }
  295. protected function configureMailerDeliveryAddress($name, array $mailer, ContainerBuilder $container, $isDefaultMailer = false)
  296. {
  297. if (\count($mailer['delivery_addresses']) > 0) {
  298. $container->setParameter(sprintf('swiftmailer.mailer.%s.single_address', $name), $mailer['delivery_addresses'][0]);
  299. $container->setParameter(sprintf('swiftmailer.mailer.%s.delivery_addresses', $name), $mailer['delivery_addresses']);
  300. $container->setParameter(sprintf('swiftmailer.mailer.%s.delivery_whitelist', $name), $mailer['delivery_whitelist']);
  301. $definitionDecorator = $this->createChildDefinition('swiftmailer.plugin.redirecting.abstract');
  302. $container
  303. ->setDefinition(sprintf('swiftmailer.mailer.%s.plugin.redirecting', $name), $definitionDecorator)
  304. ->setArguments([
  305. sprintf('%%swiftmailer.mailer.%s.delivery_addresses%%', $name),
  306. sprintf('%%swiftmailer.mailer.%s.delivery_whitelist%%', $name),
  307. ])
  308. ;
  309. $container->getDefinition(sprintf('swiftmailer.mailer.%s.plugin.redirecting', $name))->addTag(sprintf('swiftmailer.%s.plugin', $name));
  310. if (true === $isDefaultMailer) {
  311. $container->setAlias('swiftmailer.plugin.redirecting', sprintf('swiftmailer.mailer.%s.plugin.redirecting', $name));
  312. }
  313. } else {
  314. $container->setParameter(sprintf('swiftmailer.mailer.%s.single_address', $name), null);
  315. }
  316. }
  317. protected function configureMailerLogging($name, array $mailer, ContainerBuilder $container, $isDefaultMailer = false)
  318. {
  319. if ($mailer['logging']) {
  320. $container->getDefinition('swiftmailer.plugin.messagelogger.abstract');
  321. $definitionDecorator = $this->createChildDefinition('swiftmailer.plugin.messagelogger.abstract');
  322. $container
  323. ->setDefinition(sprintf('swiftmailer.mailer.%s.plugin.messagelogger', $name), $definitionDecorator)
  324. ;
  325. $container->getDefinition(sprintf('swiftmailer.mailer.%s.plugin.messagelogger', $name))
  326. ->setPublic(true)
  327. ->addTag(sprintf('swiftmailer.%s.plugin', $name));
  328. if (true === $isDefaultMailer) {
  329. $container->setAlias('swiftmailer.plugin.messagelogger', sprintf('swiftmailer.mailer.%s.plugin.messagelogger', $name));
  330. }
  331. }
  332. }
  333. /**
  334. * Returns the base path for the XSD files.
  335. *
  336. * @return string The XSD base path
  337. */
  338. public function getXsdValidationBasePath()
  339. {
  340. return __DIR__.'/../Resources/config/schema';
  341. }
  342. /**
  343. * Returns the namespace to be used for this extension (XML namespace).
  344. *
  345. * @return string The XML namespace
  346. */
  347. public function getNamespace()
  348. {
  349. return 'http://symfony.com/schema/dic/swiftmailer';
  350. }
  351. public function getConfiguration(array $config, ContainerBuilder $container)
  352. {
  353. return new Configuration($container->getParameter('kernel.debug'));
  354. }
  355. private function createChildDefinition($id)
  356. {
  357. if (class_exists('Symfony\Component\DependencyInjection\ChildDefinition')) {
  358. return new ChildDefinition($id);
  359. }
  360. return new DefinitionDecorator($id);
  361. }
  362. }