Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Send email outside Controller Action in Symfony2

I am using Symfony2 and FOSUserBundle

I have to send email using SwiftMailer in my mailer class which is not a controller or its action. I am showing what I have coded

<?php

namespace Blogger\Util;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class FlockMailer {


    public function SendEmail(){
        $message = \Swift_Message::newInstance()
        ->setSubject('Hello Email')
        ->setFrom('[email protected]')
        ->setTo('[email protected]')
        ->setBody('testing email');

        $this->get('mailer')->send($message);
    }
}

But I am getting the following error

Fatal error: Call to undefined method Blogger\Util\FlockMailer::get() ....

How can I proceed?

like image 373
Muhammad Umair Avatar asked Apr 20 '12 12:04

Muhammad Umair


2 Answers

EDIT: as i din't tested the code you should also specify the transport layer if you don't use the service container for getting the instance of the mailer. Look at: http://swiftmailer.org/docs/sending.html

You're doing it wrong. You basically want a service, not a class that extends Controller. It's not working because service container is not available in SendMail() function.

You have to inject the service container into your own custom helper for sending email. A few examples:

namespace Blogger\Util;

class MailHelper
{
    protected $mailer;

    public function __construct(\Swift_Mailer $mailer)
    {
        $this->mailer = $mailer;
    }

    public function sendEmail($from, $to, $body, $subject = '')
    {
        $message = \Swift_Message::newInstance()
            ->setSubject($subject)
            ->setFrom($from)
            ->setTo($to)
            ->setBody($body);

        $this->mailer->send($message);
    }
}

To use it in a controller action:

services:
    mail_helper:
        class:     namespace Blogger\Util\MailHelper
        arguments: ['@mailer']

public function sendAction(/* params here */)
{
    $this->get('mail_helper')->sendEmail($from, $to, $body);
}

Or elsewhere without accessing the service container:

class WhateverClass
{

    public function whateverFunction()
    {
        $helper = new MailerHelper(new \Swift_Mailer);
        $helper->sendEmail($from, $to, $body);
    }

}

Or in a custom service accessing the container:

namespace Acme\HelloBundle\Service;

class MyService
{
    protected $container;

    public function setContainer($container) { $this->container = $container; }

    public function aFunction()
    {
        $helper = $this->container->get('mail_helper');
        // Send email
    }
}

services:
    my_service:
        class: namespace Acme\HelloBundle\Service\MyService
        calls:
            - [setContainer,   ['@service_container']]
like image 199
gremo Avatar answered Nov 15 '22 07:11

gremo


Just forget about the setter and the getter:

$transport = \Swift_MailTransport::newInstance();
$mailer = \Swift_Mailer::newInstance($transport);
$helper = new MailHelper($mailer);
$helper->sendEmail($from, $to, $body,$subject);

That worked for me with the MailHelper called from a listener method.

like image 36
Wiert Avatar answered Nov 15 '22 07:11

Wiert