Envoi de mail Symfony 3.3.x


#1

Je suis en train de réaliser un système de questions/réponses sur un article commandé.
J’aimerais qu’un utilisateur puisse poser une question sur un produit. Une fois la question posée je sélectionne la liste des autres utilisateurs ayant acheté ce produit avec un certain critère et je les envoie un mail pour qu’il puisse répondre à la question. J’ai fait mon traitement mais je n’arrive pas à envoyer mon mail. Pourtant la question elle est bien enregistrée en base de données seulement le mail qui n’est pas envoyé. Le message d’erreur que j’obtienne m’indique que mes variables sont “indifined” dans le template d’email. Je n’arrive pas à mettre le doigt sur l’origine. Est-ce l’erreur vient d’ailleurs puisque mes variables sont bien définis ou un autre dysfonctionnement ? J’ai besoin d’aide. Merci par avance !

CI-dessous mon code :

Mon formType:

namespace AppBundle\Form;
 
use AppBundle\Entity\Question;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
 
class QuestionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('username', TextType::class)
            ->add('title', TextType::class)
            ->add('content', TextareaType::class)
        ;
    }
 
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Question::class,
        ));
    }
}

Mon formulaire :

{{ form_start(form) }}
    {{ form_widget(form.username) }}
    {{ form_widget(form.title) }}
    {{ form_widget(form.content) }}
 
    <input type="submit" value="Send"/>
{{ form_end(form) }}

Mon controller :

public function newAction(Request $request)
{
    $question = new Question();
    $form = $this->createForm(TblQuestionType::class, $question);
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($question);
        $em->flush();

        $title = $request->request->get('title');
        $content = $request->request->get('content');
        $ref = $request->query->get('ref');
 
        // requêtes pour récupérer les emails utilisateurs
        $qb = $em->createQueryBuilder();
        $query1 = $qb->select('n')
            ->from('AppBundle\Entity\Note', 'n')
            ->where('n.ref = :ref')
            ->andWhere('n.note = 2 OR n.note is null')
            ->setParameter('ref', $ref)
            ->getQuery()
            ->getDQL();
        $query2 = $qb->select('m')
            ->from('AppBundle\Entity\SendMail', '')
            ->where('m.rob = :rob')
            ->setParameter('rob', '1')
            ->getQuery()
            ->getDQL();    
        $queries = $qb->select('c.commandeId', 'c.dateExpe', 'u.userId', 'u.email')
            ->from('AppBundle\Entity\Commande', 'c')
            ->join('AppBundle\Entity\Users', 'u', 'WITH', $qb->expr()->eq('c.userId', 'u.userId'))
            ->where($qb->expr()->andX(
                $qb->expr()->in('c.commandeId', ':query1'),
                $qb->expr()->notIn('u.email', ':query2')
            ))
            ->andWhere(date_diff(D, 'c.dateExpe', NOW()) > 5)
            ->setParameters('query1', $query1)
            ->setParameters('query2', $query2)
            ->getQuery()
            ->getResult();    
 
            $message = \Swift_Message::newInstance();
            $message->setSubject('Envoi mail');
            $message->setFrom(array('noreply@domaine.com' => 'domaine'));
            foreach ($queries as $query) {
                $email = $query->getEmail();
                $username = $query->getUsername();
                $message->setTo($email);
            }    
            $message->setBody($this->renderView('mail_user.html.twig', array(
                'username' => $username,
                'title' => $title,
                'content' => $content
            )));
            $message->setCharset('utf-8');
            $message->setContentType('text/html');
 
            $this->get('mailer')->send($message);

            $response = new JsonResponse();
            $response->setData(array(
                'formSuccess' => $this->render('layout.html.twig', array(
                        'form' => $form->createView())
                ),
                'successMessage' => 'Success d\'envoi'
            ));
            return $response;
    } else {
           $response = new JsonResponse();
           $response->setData(array(
                'formErrors' => $this->render('layout.html.twig', array(
                        'form' => $form->createView())
                ),
                'errorMessage' => 'Echec lors d\'envoie'
                //$this->addFlash('warning', $translator->trans('c2c.message_error'))
            ));
            return $response;
    }
}

Mon template mail:

{% block mail %}
    {{ username }}
    {{ title }}
    {{ content }}
{% endblock %}

#2

Dans un premier temps, tu fais message->setTo() à plusieurs reprises : quel est le dernier To: du message que tu obtiens ? Est-il correct ?

Regarde bien le profiler de Symfony et check les logs, les panel Twig, Form et Swiftmailer, histoire de voir un peu mieux