Bonjour,

J'ai un application avec 1500 utilisateurs, j'ai developpé la possibilitée d'envoyer une notification par e-mail en même temps à tous les utilisateurs.

Je passe par une boucle avec SwiftMailer et Symfony 5

//Submit form
        if ($form->isSubmitted() && $form->isValid()) {
            $today = new DateTime();

            foreach ($form->get('customers')->getData() as $customer) {
                $displayAt = $form->get('display_at')->getData();
                // Relation
                $relation = new PanoramaUser();
                $relation->setPanorama($panoramas);
                $relation->setCustomers($customer);
                $relation->setSender( $this->getUser() );
                if ( $displayAt !== null ) {
                    $displayAt->setTime(8,00);
                    $relation->setDisplayAt($displayAt);
                } else {
                    $relation->setDisplayAt( $today );
                }

                //Send email notification
                $message = (new \Swift_Message('XX.'))
                    ->setFrom('XX', 'XX')
                    ->setTo( $customer->getEmail() )
                    ->setBody(
                        $this->renderView(
                            'emails/notification/user/panorama.html.twig', [
                                'first_name' => $customer->getIdentity()
                            ]
                        ),
                        'text/html'
                    )
                ;
                $mailer->send($message);

                if ( $mailer ) {
                    $this->em->persist( $relation );
                    $this->em->flush();
                } else {
                    $this->addFlash('danger','Une erreur est surevenue #'. $customer->getId());
                }
            }

            $this->addFlash('success', 'Panorama envoyé avec succès');

            return $this->redirectToRoute('panorama_index');
        }

Ce que je veux

Que les 1500 clients reçoivent l'email.

Ce que j'obtiens

Je n'arrive à récupérer une erreur dans ma boucle SwiftMailer et le return du $mailer est tout le temps true. J'essaye de trouver la class pour une Exeption et la catch mais j'arrive pas.

J'ai contacter le support Ionios la limite passe normalement.

Je voulais savoir si ma méthode était la bonne ou je devrais envoyer 1 seul e-mail avec des copies cachées ?

Merci beaucoup

19 réponses


bonjour.
c'est logique que $mailer renvoie tout le temps true puisque c'est l'instance de classe.
ca serait plutôt la ligne juste avant.
c'est à dire le retour de la méthode send.

P2P
Auteur

Bonjour,

Merci pour ta réponse d'accord mais je ne peux pas faire un if ( $mailer->send( $message ) ) la function ne sera pas lancé ?

P2P
Auteur

J'ai vu sur d'autres forum que utiliser la fonction mail() de php serait mieux pourquoi ?

Le if prend aussi des fonctions, et si, ça lance la fonction, tu peux faire if($mailer->send($message)) ;)

Par exemple quand tu utilises des helper de comparaisons, par exemple if(isset($value), tu lances bien la fonction isset (oui oui c'est une fonction, une fonction native php ça reste une fonction) :p

Pour ce qui est de la fonction mail,, ils disent ça parce que c'est plus rapide, en théorie...
En gros dans la fonction mail tu n'a que la commande pour envoyer le mail, alors que dans swift tu à la fonction mail + le support multipart, html complexe et la securisation

C'est rapide seulement en théorie parce que en pratique la fonction mail tu va l'enrichir et tu va la sécuriser toi même, peut être même de façon moins opti que ce que swift a fait :/

P2P
Auteur

D'accord merci beaucoup donc il faut bien faire une boucle avec le send() à l'intérieur ?

smtp à t'il une limite ou faut t'il utiliser un autre protocol ?

De rien ;)

yes, ça va enclancher le send, la methode send va ensuite renvoyer false si y'a eu un problème ou bien true si c'est envoyé :)

Possible ce ça envoie autre chose que true si c'est envoyé, regardes ce que ça retourne, si ça retourne true ou 1, c'est bon, par contre si ça return des infos dont tu as besoin, il faudrait plutot faire:

if($response = $mailer->send($message))

Comme ça tu aura le return dans ton $response ^^'

P2P
Auteur

Merci pour ta réponse mais aucunes erreurs arrive avec une boucle sur 300 utilisateurs. Je pense que ça viens du serveur smtp chez ionos qui doit avoir une limite donc j'utilise celui d'ovh mais pareil

Si utiliser le smtp://ssl0.ovh.net ou autre service smtp chez ovh ou autre est une mauvaise idée. Quelle est la bonne idée ?

Je suis à la recherche d'une solution type "push mail" qui me permette d'envoyer - et d’être certain d'envoyer - des mails (environ 500/jour). Il semble que le smtp Ovh est limité mais alors que prendre ?Existe-t-il un autre soltutions chez OVH ? EMail pro ? Faut-il partir sur une autre offre type Amazon (https://aws.amazon.com/fr/ses/3) ? Autres ?

Alors tu n'as pas d'erreur dans swift, si il y'a une erreur, ça renvoie seulement false

Tu peux faire ça:

if($response = $mailer->send($message)) {
    // la suite de ton code
} else {
    // Flash un message d'erreur
    die('ERREUR') // pour vérifier
}
P2P
Auteur

J'ai fait === 2 puis ton code mais 0 erreurs ça viens de mon domaine SMTP mais j'ai pas de réponse pour ça

Oaky si le send envoie en reponse que c'est envoyé alors que non c'est bizarre :/
Si ça vien de ton serveur tu devrait trouver le message d'erreur dans le dashboard de ton serveur

si c'est la fonction mail, il ne faut pas confondre "envoyer" et "accepter pour envoi"
regarde les logs de ton serveur
essaye l'envoi d'un mail sur le site "mail-tester.com"
regarde tes spams

P2P
Auteur

J'ai regarder mes spams et fait un mail tester mais les e-mails ne parte pas quand je sélectionne un boucle de 300 users

https://dashboard.serversmtp.com ou le dashboard de l'hebergeur si tu passes par un hebergeur
Ca dit quoi dans les logs?

P2P
Auteur

J'ai ça avec les codes Ionos

[2021-07-09 17:35:19] app.ERROR: Exception occurred while flushing email queue: Expected response code 250 but got code "451", with message "451-Requested action aborted 451 Mails per session limit exceeded. " [] []

Okay je vois, en fait Swift ne te retoure pas d'erreur parce que de son coté il n'a pas d'erreur, et il a bien envoyé le mail à ton serveur IONOS

Tu as un problème du coté de ton serveur: Ta quantité de mail envoyé est trop grand, il faut que tu payes pour pouvoir envoyer plus de mails $$$ :P

P2P
Auteur

Merci :)

Connais tu une gamme ou un site ou service avec moins de limite ? J'ai appelé Ionos il propose rien

Ahah ouai faut oublier les hebergeurs web xD surtout IONOS c'est pas top comme hebergeur xD

Pour les mails j'utilisais Mailgun, c'est pas mal, dans cette page tu a une barre au dessus des prix pour regler le nombre de mails que tu comptes envoyer par mois, il y'a un monitoring, des statistiques etc
https://www.mailgun.com/pricing/

Par contre il faudra vérifier les normes pour éviter que tes mails finissent en plainte pour spam (rien a voir avec la mise dans "courrier indésirable", faut juste qu'il n'y ai par trop de monde qui cliquent sur "signaler comme spam" ou que ton mail te fasse choper par le filtre anti-spam), si tu as trop de spam ils te punissent en réduisant ton activité pendant une certaine période (tous les fournisseurs mail font ça, ce n'est pas seulement mailgun), mais si tu respectes les normes y'a pas de soucis, et c'est facile de trouver des articles sur internet
Si t'as la fleme de chercher:
https://www.cakemail.com/blog/fr/guide-eviter-etre-considere-spam/ (j'ai pris le premier lien donc je sais pas ce que ça vaut, mais c'est standardisé donc tous les articles vont surement mettre la même chose

P2P
Auteur

Merci beaucoup j'ai init mailgun mais j'ai cette erreur:

Exception occurred while flushing email queue: Connection could not be established with host smtp.eu.mailgun.org :stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:1408F10B:SSL routines:ssl3_get_record:wrong version number [] []
Mon .Env.local
MAILER_URL=smtp://smtp.eu.mailgun.org:587?encryption=ssl&auth_mode=login&username=postmaster@xx.fr&password=

ah nan ton env faut pas faire ça :x

Met ça à la place avec les bonnes valeurs dans ton .env:

MAIL_HOST=smtp.eu.mailgun.org
MAIL_PORT=587
MAIL_FROM_ADDRESS=address@example.com
MAIL_FROM_NAME=example
MAIL_USERNAME=address@example.com
MAIL_PASSWORD="123abc456def"
MAIL_ENCRYPTION=tls

Et pour le reste de la config je te confie ça:
https://devdojo.com/devdojo/sending-emails-with-laravel-and-mailgun