Symfony2 – Envoie d’emails par la ligne de commande

Logo du Framework Symfony2Lorsque l’on essaye d’envoyer un email en utilisant la ligne de commande (cmd) offerte par Symfony2, on se heurte à un petit problème.

Dans le fichier de configuration « config.yml » est défini pour swiftmailer ce paramètre : spool: { type: memory }

Cela signifie que tout les mails envoyé sont mis dans un spool mémoire. Dans le cas d’un envoie depuis un controller, l’email est placé dans le spool et envoyé une fois que le controller à terminé (par le biais des event), cela évite que la page mette trop de temps à ce charger.

Dans le cas d’un déclenchement par la cmd, il n’y a pas d’événement qui déclenche l’envoie d’email. Il faut donc le faire à la main !

namespace waldoUnBundleCommand;

use SymfonyBundleFrameworkBundleCommandContainerAwareCommand;
use SymfonyComponentConsoleInputInputInterface;
use SymfonyComponentConsoleOutputOutputInterface;

class CronCommand extends ContainerAwareCommand
{
    protected function configure()
    {
        $this
                ->setname('uranie:cron')
                ->setDescription('Exécute les crons');
    }

    public function execute(InputInterface $input, OutputInterface $output)
    {
        $message = Swift_Message::newInstance()
            ->setSubject('Coucou Email')
            ->setFrom('send@example.com')
            ->setTo('recipient@example.com')
            ->setBody("un super message");
        $this->getContainer()->get('mailer')->send($message);

	 // Du fait qu'il y est un spool de mail en mémoire définit dans le fichier de config et que ce spool est uber pratique dans le cadre des controller
        // On force l'envoie des mails du spool avec le code-ci dessous
        /* @var $mailer Swift_Mailer */
        $mailer = $this->getContainer()->get('mailer');

        $transport = $mailer->getTransport();
        if ($transport instanceof Swift_Transport_SpoolTransport) {
            $spool = $transport->getSpool();
            $sent = $spool->flushQueue($this->getContainer()->get('swiftmailer.transport.real'));
        }
    }

Rien de bien compliqué en somme.

Publié dans PHP, Symfony2, Symfony2 v2.1
2 commentaires pour “Symfony2 – Envoie d’emails par la ligne de commande
  1. Matthieu Auger dit :

    Merci pour le partage.
    Il y a une petite typo ligne 23 : Il faut $this->getContainer()->get(‘mailer’); au lieu de $this->get(‘mailer’)

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*