2012-04-20 19 views
5

estoy usando Symfony2 y FOSUserBundleEnviar correo electrónico fuera de Action Controller Symfony2

tengo que enviar correo electrónico utilizando SwiftMailer en mi clase de gestor de correo que no es un controlador o su acción estoy mostrando lo que he codificado

<?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); 
    } 
} 

Pero estoy consiguiendo el error siguiente

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

cualquier organismo puede ayudar a esto es realmente me fustrating .....

+0

No lo entiendo. ¿Ese fragmento de código es su solución actual pero le gustaría mover el correo a otro lugar? Si eso es correcto, probablemente debas leer acerca de cómo inyectar servicios en tus clases personalizadas: http://stackoverflow.com/questions/6124444/how-can-i-access-a-service-outside-of-a-controller-with- symfony2 – geca

+0

He utilizado FOSUserBundle y FOSFacebookbundle lo que quiero cuando el usuario inicia sesión con éxito con la cuenta de Facebook Quiero enviar un correo electrónico al usuario con su contraseña para que pueda iniciar sesión con esa contraseña de correo electrónico. Tengo que escribir la función en la clase de proveedor para enviar correos electrónicos .... –

Respuesta

1

olvidarse de la incubadora y el captador:

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

que trabajó para mí con el MailHelper llamada de un método detector.

8

EDIT: como no probé el código, también debe especificar la capa de transporte si no utiliza el contenedor de servicio para obtener la instancia del programa de correo. Mira: http://swiftmailer.org/docs/sending.html

Lo estás haciendo mal. Básicamente, desea un servicio , no una clase que se extiende Controller. No funciona porque el contenedor de servicio no está disponible en la función SendMail().

Tiene que inyectar el contenedor de servicio en su propio asistente personalizado para enviar correos electrónicos. Unos pocos ejemplos:

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); 
    } 
} 

para usarlo en una acción controlador:

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

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

o en otro lugar sin acceder al contenedor de servicios:

class WhateverClass 
{ 

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

} 

O en un servicio de encargo accediendo al contenedor:

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']] 
+0

He implementado sin acceder al contenedor de servicio siguiente error come ====== Catchable Fatal Error: Argumento 1 pasado a Swift_Mailer :: __ construct() debe ser una instancia de Swift_Transport, none given, –

+0

@MuhammadUmair yes , debes especificar la capa de transporte. No probé el código. Debería seguir http://symfony.com/doc/current/cookbook/email/email.html – gremo

+0

@MuhammadUmair, también eche un vistazo a http://swiftmailer.org/docs/sending.html – gremo

Cuestiones relacionadas