Bonjour,

Voila j'aimerai envoyer par mail les données d'un formulaire de contact sur Symfony.

Ce que je fais

Voici la configuration de mon parameters.yml

parameters
 database_host  localhost
 database_port: 
   database_name: symfony
    database_user: root
    database_password: root
    mailer_transport: mail
    mailer_host: smtp.gmail.com
    mailer_port: 465 
    mailer_encryption: ssl
    mailer_user: test@gmail.com
    mailer_password: '**********

Voici la configuration de mon config.yml au niveau du swift mailer

swiftmailer:
   transport: '%mailer_transport%'
    host: '%mailer_host%'
    port: %mailer_port%
    encryption: %mailer_encryption%
    username: '%mailer_user%'
    password: '%mailer_password%'
    spool: { type: memory }

Et enfin mon code au niveau du controller

if(isset($_POST['reinitialiser'])){

            $message = \Swift_Message::newInstance()
                ->setSubject('Réinitialisation de votre mot de passe')
                ->setFrom('rzj.kevin@gmail.com')
                ->setTo('shirukevin@gmail.com')
                ->setBody(
                    $this->renderView(
                            'ADVGeneralBundle:Mail:mail.html.twig',array('cp'=> $_POST['cp'])
                        ),
                        'text/html'
                    );
            $this->get('mailer')->send($message);

Ce que je veux

J'aimerai recevoir le mail dans boite mail .

Ce que j'obtiens

Il n'y a pas d'erreur quand j'éxécute le code au niveau de symfony sauf que je recois pas de mail
Pourriez vous m'aider s'il vous plaît
Merci d'avance

20 réponses


Salut

Il semblerait que tu puisse définir gmail comme mailer_transport.

Regarde ici: https://symfony.com/doc/current/email/gmail.html

De plus, étonnant que tu utilises des POST dans ce qui semble être un controller Sf. Regarde le composant request (Symfony\Component\HttpFoundation\Request) ;)

Salut,

Si tu es en dev, je ne peux que te conseiller d'utiliser maildev pour tester les envois de mail ;)

Oui même avec gmail comme mailer_transport, ça ne marche pas

Oui j'ai déjà utiliser le composant request en fesant if ($request->isMethod('POST') ).

Tu peux regarder dans le profiler voir si tu as bien un email qui part. Tu peux aussi sûrement retirer le spool le temps de tester.

Pour mon exam de BTS j'avais une mission avec un envoie de mail
Voici ma config.

parameters.yml

# This file is auto-generated during the composer install
parameters:
    database_host: localhost
    database_port: null
    database_name: formarmor
    database_user: root
    database_password: null
    mailer_transport: smtp
    mailer_host: 127.0.0.1
    mailer_user: formarmorbts@gmail.com
    mailer_password:******
    secret: secret
    nb_par_page: 5

Controller

    public function mailValidation($Client,$session_formation,$date){
        $mail = $this->container->getParameter('mailer_user');
        $smtp = $this->container->getParameter('mail_smtp');
        $mdp = $this->container->getParameter('mailer_password');

        //Construction du mail
        $texte = "<h3>Bonjour, " . $Client->getNom() . " " . $Client->getPrenom() . "</h3><br>";
        $texte .= "<p>Nous avons le plaisir de vous annoncer que la session du <b>". $date ."</b> est bien confirmée.</p>";
        $texte .= "<h2>Détails de la session:</h2>";
        $texte .= "<p>". $session_formation->getFormation()->getLibelle() ."(" . $session_formation->getFormation()->getNiveau() .")</p>";
        $texte .= "<p>Au cours de cette session de <b>". $session_formation->getFormation()->getDuree() ." heures</b>, vous allez effetuer : <b>". $session_formation->getFormation()->getDescription() ."</b></p>";
        $texte .= "<br> Cordialement,<br>L'administration de formarmor.";
        $transport = \Swift_SmtpTransport::newInstance($smtp, 465,'ssl')->setUsername($mail)->setPassword($mdp);

        $mailer = \Swift_Mailer::newInstance($transport);

        $message = \Swift_Message::newInstance()
               ->setSubject("FormArmor - Confirmation d'inscription")
                ->setFrom(array('formarmorbts@gmail.com' => 'formarmorbts@gmail.com'))
                ->setTo(array(''.$Client->getEmail().'' => ''.$Client->getEmail().''))// email du client pour teste replacer par son @
               ->addPart($texte,'text/html');
        $result = $mailer->send($message);
        return $result;
    }

Après, là, mon code n'est pas propre car ce n'est pas la version finale.
La fonction mail de validation permettait juste de ne pas répéter ce code 2 fois, car je pouvais l'utiliser dans deux contextes.

@Mehdikacim : j'ai tester ton code mais le

$smtp = $this->container->getParameter('mail_smtp');

M'affiche :
The parameter "mailer_smtp" must be defined.
comme erreur

Oui, tu dois le définir dans PARAMETERS.YML
Je m'excuse car aux modifs de l'exam je devais importer un bundle et ça remet à jour parameters.yml, or, j'avais bloqué l'appel de cette fonction pour l'exam car le réseau du bahut bloque l'envoie de mail hahaha
Rajoute : mail_smtp: smtp.gmail.com dans parameters
Car dans mon code j'appel pas mailer mais mail_smtp

Cela m'affiche l'erreur suivant :
Connection could not be established with host smtp.gmail.com [Network is unreachable #101]

As-tu teamviewer ? Je peux essayer de voir ça maintenant si tu veux

Non je n'ai pas teamviewer

Envoie moi ton parameter et ta nouvelle fonction modifiée au niveau de ton controller

Mon parameter

parameters:
   database_host: localhost
    database_port: 
    database_name: symfony
    database_user: root
    database_password: root
    mailer_transport: smtp
    mailer_host: 127.0.0.1
    mail_smtp: smtp.gmail.com 
    mailer_user: test@gmail.com
    mailer_password: ****
    secret: 8b3fdfaddad056c4ca759ffe81156eafb10f30fc

Mon controller

public function loginAction(Request $request)
{

if($request->isMethod('POST'){
 $texte = "<h3>Bonjour, </h3><br>";
  $texte .= "<p>Votre demande a été bien enregisté.</p>";

  $transport = \Swift_SmtpTransport::newInstance($smtp, 465,'ssl')->setUsername($mail)->setPassword($mdp);

        $mailer = \Swift_Mailer::newInstance($transport);

        $message = \Swift_Message::newInstance()
               ->setSubject("FormArmor - Confirmation d'inscription")
                ->setFrom(array('test@gmail.com' => 'test@gmail.com'))
                ->setTo(array('A.roll@gmail.com' => 'A.roll@gmail.com'))// email du client pour teste replacer par son @
               ->addPart($texte,'text/html');
        $result = $mailer->send($message);

smtp,mail et mdp sont bien récupéré grace à ceci ?

$this->container->getParameter('...');

As-tu testé tes identifiants que tu as mis dans ton parameters ?
A.roll@gmail.com est un mail qui existe ?

Si tout correspond, je te propose d'installer TEAMVIEWER et d'envoyer tes id (de teamviewer haha) à Mehdikacim@hotmail.fr, mon adresse mail pour que je suis controler ton PC (non rien de méchant haha) poru que je puisse voir, et manipuler ton code.
Les identifiants sont éphémères donc, aps de soucis demain je pourrais pas le controler :)

Bonjour.
@Mehdikacim: Je te le dis pour la dernière fois, arrêtes avec TeamViewer, si tu veux l'aider c'est sur le forum et non en prenant le contrôle de son PC.

En vue de son code, je comprend pas le pourquoi ça ne fonctionne pas. Etant plus à l'aise ave symfony que lui je suppose, je lui propose de résoudre son problème.
Trouve le problème MONSIEUR alors.
Bye.

Le but du forum, n'est pas de résoudre le problème à la place de la personne, mais de l'aider à le résoudre, car si tu résouds toi même son problème de la manière que tu proposes, il ne comprendra jamais où il a pu faire une erreur et par conséquent, il ne sera pas capable par la suite de pouvoir résoudre son problème quand il se représentera.

D'où le principe de trouver l'erreur avec de lui expliquer le pourquoi il ne fonctionne pas.

J'ai regardé un peu sur google et j'aimerai savoir s'il faut modifier/Configurer le php.ini pour l'envoie des mail sous symfony comme en php pure (quand en utilise l'outil sendmail) ? Peut-être est-ce là le problème ?