IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Envoi de mail avec Symfony 7.4


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2017
    Messages : 19
    Par défaut Envoi de mail avec Symfony 7.4
    Bonjour,
    Quelqu'un peut-il me donner la syntaxe à utiliser dans le fichier .ENV de symfony (7.4) pour envoyer des mails en SMTP sur une boîte mail de chez Orange.
    Avant j'utilisais swiftmailer et ça marchait très bien. Maintenant Symfony utilise mailer et en plus si j'ai bien compris messenger intervient aussi. J'ai modifié le fichier messenger.yaml comme indiqué par Grafikart.
    Donc normalement messenger n'intervient plus (mais je ne peux le confirmer, je fais confiance aux connaissances de Grafikart).
    Lorsque je fais un dd($data) en récupérant les données de mon formulaire de mail... toutes les infos saisies dans le formulaire sont là. Donc mon code fonctionne correctement. C'est l'envoi du mail qui ne se fait pas.
    Il y a donc quelque chose dans le système qui bloque l'envoi et je ne comprend pas ce qui est en cause.
    J'ai le sentiment que c'est le paramétrage du MAILER_DSN dans le fichier .ENV qui n'est pas correct. D'où ma demande... est-ce que quelqu'un connait la syntaxe à indiquer pour un envoi en SMTP sur Orange ?
    Merci d'avance à ceux qui prendront 5 minutes pour me répondre.

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 563
    Par défaut
    Bonjour,

    C'est un passage classique et parfois un peu frustrant quand on quitte le confort de SwiftMailer pour le composant Mailer de Symfony.

    1. La syntaxe du MAILER_DSN pour Orange
    Pour un compte Orange (ou Wanadoo), la syntaxe SMTP standard dans votre fichier .env doit ressembler à ceci :

    Code Ini, TOML : Sélectionner tout - Visualiser dans une fenêtre à part
    MAILER_DSN=smtp://VOTRE_EMAIL@orange.fr:VOTRE_MOT_DE_PASSE@smtp.orange.fr:465?encryption=ssl

    Quelques précisions importantes :

    Le port : Le port 465 avec l'option ?encryption=ssl est le plus stable. Si cela ne fonctionne pas, vous pouvez tenter le port 587 avec ?encryption=tls.

    Caractères spéciaux : Si votre mot de passe contient des caractères spéciaux (comme @, /, +), vous devez les encoder en URL (URL-encode). Par exemple, un @ devient %40.

    Authentification : Assurez-vous que l'adresse email utilisée dans le DSN est la même que celle définie dans le setFrom() de votre code PHP.

    2. Le rôle de Messenger (Le "piège" du mode asynchrone)
    Vous avez raison, par défaut, Symfony Mailer essaie d'envoyer les mails de manière asynchrone via Messenger. Si aucun "worker" ne tourne pour traiter la file d'attente, le mail reste bloqué dans votre base de données ou votre transport, sans jamais partir.

    Si vous avez suivi les conseils de Grafikart pour désactiver cet aspect, votre fichier config/packages/messenger.yaml doit ressembler à ceci (ou la ligne correspondante doit être commentée) :

    Code YAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    framework:
        messenger:
            transports:
                # Commenter ou supprimer la redirection des mails vers un transport
                # async: '%env(MESSENGER_TRANSPORT_DSN)%'
     
            routing:
                # S'assurer que Symfony\Component\Mailer\Messenger\SendEmailMessage n'est PAS routé vers 'async'
                'Symfony\Component\Mailer\Messenger\SendEmailMessage': sync

    En forçant le routage sur sync, le mail est envoyé immédiatement durant la requête HTTP. C'est plus lent pour l'utilisateur, mais c'est le meilleur moyen de vérifier que votre configuration SMTP est correcte.

    3. Comment tester et déboguer ?
    Si malgré le bon DSN cela ne part toujours pas :

    Videz le cache : Symfony garde souvent la configuration du .env en cache.

    Code Bash : Sélectionner tout - Visualiser dans une fenêtre à part
    php bin/console cache:clear
    Utilisez la commande de test : Symfony propose une commande intégrée pour tester l'envoi sans passer par votre formulaire :

    Code Bash : Sélectionner tout - Visualiser dans une fenêtre à part
    php bin/console mailer:test votre-email@domaine.com

    Cette commande vous donnera une erreur beaucoup plus précise que le simple fait que le mail n'arrive pas.

    Vérifiez le Profiler : Si vous êtes en environnement de développement (APP_ENV=dev), allez dans la barre de débogage de Symfony, cliquez sur l'icône de l'enveloppe. Vous verrez si le mail a été "collecté" par Symfony et s'il y a une erreur de transport.

    Note sur Orange : Les serveurs SMTP d'Orange sont parfois capricieux avec les envois fréquents ou les scripts automatisés. Si vous prévoyez un volume important, passer par un service dédié (type Mailjet, SendGrid ou Brevo) avec leur propre "Bridge" Symfony est souvent plus simple sur le long terme.

  3. #3
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2017
    Messages : 19
    Par défaut
    Déjà pour commencer... UN GRAND MERCI pour cette réponse très documentée et explicite.
    Je teste immédiatement.

  4. #4
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2017
    Messages : 19
    Par défaut Ben problème...
    J'ai fait exactement ce que vous m'avez indiqué :
    1- j'ai modifié le fichier messenger.yaml j'ai tout commenté sauf ce que vous m'avez dit. Donc mon messenger.yaml est exactement comme le votre.
    2- j'ai modifié le fichier .env en mettant la ligne indiquée pour le SMTP orange.
    3- j'ai essayé avec les 2 ports 465 ssl et 587 tls
    4- j'ai testé le MAILER avec la ligne de commande indiquée

    A CHAQUE MODIFICATION j'ai vidé le cache (je suis en mode DEV dans le fichier .ENV)

    J'ai tout le temps cette erreur : Invalid Messenger routing configuration: the "Symfony\Component\Mailer\Messenger\SendEmailMessage" class is being routed to a sender called "sync". This is not a valid transport or service id.

    Si je comprend le message, il me dit que la configuration de mon mode de transport est "SYNC" et que ce n'est pas valide.
    Pourtant cela veut dire qu'il doit contourner messenger et envoyer immédiatement le mail. Qu'est-ce qui cloche ?

  5. #5
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 563
    Par défaut
    Bonjour,

    il y a 2 choix pour résoudre ce problème :
    Choix A :

    Le message d'erreur est logique : Symfony cherche un transport nommé sync dans la configuration de Messenger. Or, si vous ne l'avez pas explicitement déclaré dans la section transports, Symfony considère que ce n'est pas un identifiant de service valide et refuse de démarrer.

    Voici les deux façons de corriger cela très simplement.

    Option 1 : Déclarer explicitement le transport sync
    Si vous voulez forcer Messenger à traiter le mail de manière synchrone (envoi immédiat pendant la requête), vous devez lui expliquer ce que signifie le mot sync dans la section transports de votre fichier config/packages/messenger.yaml :

    Code YAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    framework:
        messenger:
            transports:
                sync: 'sync://' # <-- C'est cette ligne qui manque !
     
            routing:
                'Symfony\Component\Mailer\Messenger\SendEmailMessage': sync

    Option 2 : Retirer totalement le mailer de Messenger (Le plus simple)
    Si votre but est simplement d'envoyer le mail en direct sans que Messenger n'intervienne du tout, la méthode la plus propre consiste à supprimer ou commenter la ligne de routage. Si Symfony ne trouve aucune règle pour SendEmailMessage, il n'essaiera pas de le mettre en file d'attente et l'enverra de manière classique et synchrone par défaut.

    Dans votre fichier config/packages/messenger.yaml, laissez la partie routing vide ou commentez la ligne en question :

    Code YAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ramework:
        messenger:
            routing:
                # Commentez ou supprimez simplement cette ligne :
                # 'Symfony\Component\Mailer\Messenger\SendEmailMessage': sync

    Une fois l'une de ces deux modifications effectuées, n'oubliez pas de vider à nouveau le cache avec la commande habituelle php bin/console cache:clear.

    La commande php bin/console mailer:test votre@email.com devrait enfin s'exécuter et vous donner le véritable statut de la connexion SMTP avec les serveurs d'Orange sans être bloquée par Messenger.

    Choix B
    Ne vous inquiétez pas, votre logique est la bonne : vous voulez que le mail parte immédiatement. Le message d'erreur est simplement une réaction de Symfony qui vous dit : « Tu me demandes d'envoyer les e-mails vers un transport nommé sync, mais je ne le trouve nulle part dans ma liste ! »

    Dans Messenger, si on utilise un nom dans la section routing, il doit obligatoirement être déclaré au préalable dans la section transports.

    Voici les deux façons de résoudre ce blocage.

    Option 1 : Supprimer totalement le routage (La plus simple)
    Puisque vous voulez envoyer les e-mails immédiatement en direct sans passer par une file d'attente Messenger, le plus simple est de ne rien lui indiquer du tout concernant les e-mails. Par défaut dans Symfony, s'il n'y a pas de règle de routage pour un message, il est exécuté de manière synchrone.

    Ouvrez votre fichier config/packages/messenger.yaml et commentez ou supprimez la ligne dans la section routing :

    Code YAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    framework:
        messenger:
            transports:
                # Vos transports habituels...
     
            routing:
                # Commentez ou supprimez cette ligne :
                # 'Symfony\Component\Mailer\Messenger\SendEmailMessage': sync

    Option 2 : Définir explicitement le transport synchrone
    Si vous préférez garder la règle de routage pour que votre fichier reste explicite, vous devez simplement déclarer le transport sync dans la section transports pour que Symfony sache à quoi cela correspond.

    Modifiez votre config/packages/messenger.yaml comme ceci :

    Code YAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    framework:
        messenger:
            transports:
                # On déclare explicitement le transport synchrone
                sync: 'sync://'
     
            routing:
                # Maintenant, Symfony comprend la destination "sync"
                'Symfony\Component\Mailer\Messenger\SendEmailMessage': sync

    Prochaine étape pour tester :
    • Appliquez l'Option 1 ou l'Option 2 selon votre préférence.
    • Videz le cache pour être sûr qu'il prenne en compte la modification : php bin/console cache:clear.
    • Relancez le test avec la commande : php bin/console mailer:test votre@email.com


    L'erreur liée à Messenger aura disparu. Si l'e-mail ne part toujours pas après cela, la commande de test vous affichera l'erreur brute renvoyée par le serveur SMTP d'Orange (comme un refus d'authentification ou un blocage de port), ce qui permettra d'ajuster le DSN final.

  6. #6
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2017
    Messages : 19
    Par défaut Pas résolu
    J'ai suivi exactement ce que vous m'avez indiqué :
    1- j'ai testé les options 1 et 2
    2- Après chaque option j'ai vidé le cache
    3- après chaque option j'ai fait mailer:test + cache vidé à chaque étape

    Dans tous les cas j'ai cette erreur : Expected response code "250" but got code "501", with message "501 5.1.0 ESNEw2mYPcM3V Emetteur invalide, merci d'utiliser le serveur smtp de votre fournisseur de service email ou une adresse email Orange valide. Invalid Sender.OFR303_396 [396]"

    Qu'est-ce que ça veut dire le passage souligné (par moi) ?
    En plus j'ai fait mailer:test avec 3 adresses mails différentes. Les 3 sont valides chez Orange. Ce qui exclut la fin du message d'erreur "ou une adresse email Orange valide".

    Donc je reste coincé...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Envoi mail avec Symfony Mailer
    Par amelie_koo dans le forum Symfony
    Réponses: 2
    Dernier message: 10/02/2022, 09h23
  2. Réponses: 0
    Dernier message: 30/10/2020, 14h14
  3. Envoi de mail avec symfony
    Par Clazza dans le forum Symfony
    Réponses: 0
    Dernier message: 12/06/2020, 17h51
  4. [2.x] envoie mail avec symfony 2
    Par macksoft dans le forum Symfony
    Réponses: 5
    Dernier message: 05/12/2011, 15h12
  5. envoi de mail avec attachement de fichier
    Par GMI3 dans le forum Modules
    Réponses: 2
    Dernier message: 24/09/2003, 12h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo