Отправить письмо с логином и пропустить после регистрации

В настоящее время я работаю над проектом Symfony2 для управления пользователями. Я установил пакет FosUserBundle, который работает, но я не могу найти способ отправки электронного письма, содержащего имя пользователя и пароль, сразу после создания пользователя, поскольку я сказал, что у меня есть два пользователя: администратор и пользователь Тип, и это администратор, который будет создавать пользователей с формой создания, которая является формой регистрации FOS, переключение между двумя добрыми пользователями только роли.

4 ответа

Вы могли бы подключиться к EventDispatcher и отправьте свою собственную электронную почту, а не ту, которая была сгенерирована FOSUserBundle, используя свою собственную Listener,

class EmailConfirmationListener implements EventSubscriberInterface
{
    private $mailer;
    private $router;
    private $session;

    public function __construct(MailerInterface $mailer,
            UrlGeneratorInterface $router)
    {
        $this->mailer = $mailer;
        $this->router = $router;
    }

    public static function getSubscribedEvents()
    {
        return array(
            FOSUserEvents::REGISTRATION_SUCCESS => array(
                array('onRegistrationSuccess',  -10),
            ),
        );
    }

    public function onRegistrationSuccess(FormEvent $event)
    {
        /** @var $user \FOS\UserBundle\Model\UserInterface */
        $user = $event->getForm()->getData();

        // send details out to the user
        $this->mailer->sendCreatedUserEmail($user);

        // Your route to show the admin that the user has been created
        $url = $this->router->generate('blah_blah_user_created');
        $event->setResponse(new RedirectResponse($url));

        // Stop the later events propagting
        $event->stopPropagation();
    }
}

Почтовый сервис

use FOS\UserBundle\Model\UserInterface;
use FOS\UserBundle\Mailer\Mailer as BaseMailer;

class Mailer extends BaseMailer
{
    /**
     * @param UserInterface $user
     */
    public function sendAdminConfirmationEmailMessage(UserInterface $user)
    {
        /**
         * Custom template using same positioning as
         * FOSUSerBundle:Registration:email.txt.twig so that the sendEmailMessage
         * method will break it up correctly
         */
        $template = 'BlahBlahUser:Admin:created_user_email.txt.twig';
        $url = $this->router->generate('** custom login path**', array(), true);
        $rendered = $this->templating->render($template, array(
            'user' => $user,
            'password' => $user->getPlainPassword(),
        ));
        $this->sendEmailMessage($rendered,
            $this->parameters['from_email']['confirmation'], $user->getEmail());
    }
}

Я думаю, что сделал бы это.. хотя я могу ошибаться.

Это документировано в документации к комплекту:

// src/Acme/UserBundle/Controller/RegistrationController.php
<?php

namespace Acme\UserBundle\Controller;

use Symfony\Component\HttpFoundation\RedirectResponse;
use FOS\UserBundle\Controller\RegistrationController as BaseController;

class RegistrationController extends BaseController
{
    public function registerAction()
    {
        $form = $this->container->get('fos_user.registration.form');
        $formHandler = $this->container->get('fos_user.registration.form.handler');
        $confirmationEnabled = $this->container->getParameter('fos_user.registration.confirmation.enabled');

        $process = $formHandler->process($confirmationEnabled);
        if ($process) {
            $user = $form->getData();

            /*****************************************************
             * Add new functionality (e.g. log the registration) *
             *****************************************************/
            $this->container->get('logger')->info(
                sprintf('New user registration: %s', $user)
            );

            if ($confirmationEnabled) {
                $this->container->get('session')->set('fos_user_send_confirmation_email/email', $user->getEmail());
                $route = 'fos_user_registration_check_email';
            } else {
                $this->authenticateUser($user);
                $route = 'fos_user_registration_confirmed';
            }

            $this->setFlash('fos_user_success', 'registration.flash.user_created');
            $url = $this->container->get('router')->generate($route);

            return new RedirectResponse($url);
        }

        return $this->container->get('templating')->renderResponse('FOSUserBundle:Registration:register.html.'.$this->getEngine(), array(
            'form' => $form->createView(),
        ));
    }
}

Просто используйте шаблон и переводчик

конфиг

fos_user:
    registration:
       form:
           template:   AppBundle:Registration:email.txt.twig

шаблон

{% trans_default_domain 'FOSUserBundle' %}
{% block subject %}
{%- autoescape false -%}
{{ 'registration.email.subject'|trans({'%username%': user.username, '%confirmationUrl%': confirmationUrl}) }}
{%- endautoescape -%}
{% endblock %}

{% block body_text %}
{% autoescape false %}
{{ 'registration.email.message'|trans({'%username%': user.username, '%confirmationUrl%': confirmationUrl, %userpassword%: user.plainPassword}) }}
{% endautoescape %}
{% endblock %}
{% block body_html %}{% endblock %}

Приложение дляпереводчиков \Resources\translations\FOSUserBundle.en.yml

registration:
    check_email: |
        An email has been sent to %email%. It contains an activation link you must click to activate your account.
    confirmed: 'Congrats %username%, your account is now activated.'
    back: 'Back to the originating page.'
    submit: Register
    flash:
        user_created: 'The user has been created successfully.'
    email:
        subject: 'Welcome %username%!'
        message: |
            Hello %username%!

            To finish activating your account - please visit %confirmationUrl%

            User name: %username%
            Password: %userpassword%

            This link can only be used once to validate your account.

            Regards,
            the Team.

Вот как отправить имя пользователя / адрес электронной почты и пароль пользователю после регистрации с помощью symfony2:

overide email.txt.twig в свой пакет, затем добавьте это тело письма:

{% block subject %}
    Welcome to My Application
{% endblock %}

{% block body_html %}
    Email : {{ user.email }} 
    Username : {{ user.username }} 
    Password : {{ user.plainPassword }} 
    Activation Link : {{confirmationUrl}} 
{% endblock %}

После этого на электронную почту пользователя будет отправлено письмо с адресом электронной почты, именем пользователя, паролем и URL-адресом для активации учетной записи.

Другие вопросы по тегам