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 $configsContainerBuilder $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 $mailerContainerBuilder $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 $mailerContainerBuilder $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 $mailerContainerBuilder $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(0sprintf('%%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 $mailerContainerBuilder $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 $mailerContainerBuilder $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 $mailerContainerBuilder $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 $mailerContainerBuilder $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 $configContainerBuilder $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. }