THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bonjour,
comme tu dis @Nog, on fait un module, et puis on a envie/besoin d'en faire un autre wink
Bon ben maintenant, puisque j'arrive à envoyer des mails, ce que j'aimerais faire, c'est arriver à envoyer la facture aux clients.

Je lis et je relis la class mailerfactory, j'ai essayé de trouver des modules qui font ça pour m'en inspirer, pas trouvés.
J'essaie de m'inspirer des différents posts à ce sujet notamment : https://forum.thelia.net/viewtopic.php?id=11116 et https://forum.thelia.net/viewtopic.php?id=11689.

J'ai découvert qu'il ne faut plus utiliser swift_mailer, la doc de symfony m'explique : https://symfony.com/doc/current/mailer. … ttachments
Oui mais alors si je comprend  bien leur doc, je ne peux que attacher un fichier "distant", je ne peux pas appeler un fichier géneré par une autre methode de mon listener ?

Voila le code de la methode de mon listener

    public function testSend(OrderEvent $event)
    {
        $order = $event->getOrder();
        $orderStatus = $order->getOrderStatus()->getId();
        $customer = $order->getCustomer();
        $order_id = $order->getId();

        $message = MessageQuery::create()   
        ->filterByName('send_invoice')
                    ->findOne();

        if ($order->isPaid('true')) {

            $email = $this->mailer->createEmailMessage(
                SendInvoice::SEND_INVOICE,
                [ConfigQuery::getStoreEmail() => ConfigQuery::getStoreName()],
                [$customer->getEmail() => $customer->getFirstname() . " " . $customer->getLastname()],
                [
                    'order_id' => $event->getOrder()->getId(),
                    'order_ref' => $event->getOrder()->getRef(),

                ]
            );
            
            // Ajouter la pièce jointe
            
            $pdfPath = 'https://domaine.tld/admin/order/pdf/invoice/' . $order_id . '/1';
            $attachment = new File(file_get_contents($pdfPath), 'nom-du-fichier.pdf', 'application/pdf');

            $email->attach($attachment);
            
            $this->mailer->send($email);

        }
    }

J'ai essayé de mettre l'url en dur via $pdfPath, ça m'a renvoyé une 403, c'est très certainement bon signe.
La ligne avec le file get content est certainement très moche mais je sais pas comment écrire comme symfony le dit : ->addPart ...

Il y en a peut être d'autres, mais je vois deux solutions à mon problème,
ou bien il est possible de récuperer le pdf dans ma methode testSend,
ou bien il faut refabriquer un pdf dans une autre méthode et le faire suivre dans la methode testSend.

Pour le moment je m'y perds

Offline


Haha !

J'ai fini par trouver la solution !

Je la posterai demain quand je serai reposé.

Offline


A la place des lignes suivants le commentaire //AJouter la piece jointe

j'ai écrit : 

$email->attach($generatedPdf, 'invoice.pdf', 'application/pdf');

Peut être qu'il faudrait que j'ouvre un autre post pour la suite mais j'ai dans l'idée (depuis un moment) de limiter le nombre de mails envoyés en une heure.
Par exemple, j'aurai aimé rajouter cette fonctionnalité à stock alert.
Je viens de découvrir le composant symfony : messenger.
Je suis en train de regarder tout ça,
je pense que oui, mais je ne suis pas sur que ce soit possible d'utiliser ce composant dans un module thelia ?
Ceci dit logiquement tout les composants symfony doivent être utilisables dans thelia.
Je demande ça simplement pour éviter de passer du temps à developper un truc qui ne fonctionnera pas.

Si cela est envisageable,
j'imagine que il faudrait mettre dans env.local la ligne :
MESSENGER_TRANSPORT_DSN= mais avec quoi ? ma config smtp ?

Last edited by vz777 (20-02-2023 09:49:24)

Offline


Je ne pense pas que Symfony Messenger soit adapté à ce que tu veux faire.

D'ailleurs, qu'est-ce que tu veux faire exactement ?


OpenStudio Toulouse

Offline


Voila le problème :

J'ai des produits qui peuvent rester hors stock pendant un an ou deux.
Pendant ce temps, les visiteurs ont forcément l'idée d'aller s'inscire aux alertes du module stockalert.

Lors du retour en stock,
il m'est arrivé que il y en ait vraiment beaucoup à qui il faille envoyer un mail, peut être 500 ou 1000,
sauf que ne m'étant pas mefié ils sont tous partis en même temps.

Je ne me rappel plus exactement la limite de l'hébergeur, mais l'idée serait si je ne me trompe pas dans les mots, de traiter ces envois de mails de manière asynchrone,
ou du moins de, par exemple, limiter l'envoi a x par heure.

Je ne sais comment envisager cela.

Offline


Je m'aperçois que ma réponse au dessus est incomplète,
ces fameux messages sont donc tous partis en même temps et une bonne partie m'est revenu en erreur et jamais arrivé aux destinataires.

Cela est du a la limite de l'hébergeur qui m'impose un max de x mail par heure.

J'ai aussi pensé à utiliser la function sleep() dans la methode qui envoie le mail du module.

Sinon, j'ai vu qu'il est possible de rajouter les paramètres restart_threshold et restart_threshold_sleep dans le dsn
Cette solution ne me plait pas beaucoup, car cela impacterait tous les mails envoyés.