{"id":19769,"date":"2025-06-11T00:00:00","date_gmt":"2025-06-11T00:00:00","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\/"},"modified":"2026-09-14T15:02:20","modified_gmt":"2026-09-14T15:02:20","slug":"comment-creer-flux-travail-emails-transactionnels-notifications-expedition","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\/","title":{"rendered":"Cr\u00e9er des flux de travail d&#8217;emails transactionnels pour les notifications d&rsquo;exp\u00e9dition avec l&rsquo;API de Mailgun"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Lorsque vous commandez un article en ligne, vous vous attendez \u00e0 savoir exactement o\u00f9 il se trouve et quand il arrivera. Les flux de travail d&#8217;emails transactionnels rendent possible ce type de communication en temps opportun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Contrairement aux emails de marketing qui font la promotion de produits, les emails transactionnels sont envoy\u00e9s en r\u00e9ponse \u00e0 l&rsquo;action d&rsquo;un utilisateur, comme le fait de passer une commande ou de recevoir une mise \u00e0 jour d&rsquo;exp\u00e9dition. Ils fournissent des d\u00e9tails en temps r\u00e9el qui tiennent les utilisateurs inform\u00e9s \u00e0 chaque \u00e9tape.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans cet article, vous apprendrez \u00e0 cr\u00e9er un flux de travail d&#8217;emails transactionnels pour les notifications d&rsquo;exp\u00e9dition \u00e0 l&rsquo;aide de  <a href=\"https:\/\/documentation.mailgun.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\">l&rsquo;API de Mailgun<\/a>. Le flux de travail int\u00e9grera  <a href=\"https:\/\/docs.bullmq.io\/\" target=\"_tabs\" rel=\"noopener noreferrer\">BullMQ<\/a>, un puissant syst\u00e8me de file d&rsquo;attente de t\u00e2ches, pour mettre en file d&rsquo;attente et traiter les notifications par email s\u00e9par\u00e9ment de la logique principale de l&rsquo;application, et am\u00e9liorer la scalabilit\u00e9 et les performances. Cela est utile pour les applications \u00e0 fort trafic o\u00f9 l&rsquo;envoi d&#8217;emails directement dans un cycle de requ\u00eate-r\u00e9ponse pourrait ralentir le syst\u00e8me.<\/p>\n\n\n\r\n    <nav data-content-type=\"longform\" class=\"toc-block longform-spacings px-5 py-6 px-md-6 px-lg-7 py-md-7 bg-light fs-sm rounded-lg\" aria-labelledby=\"toc-title-1012\"><p class=\"h5 m-0\" id=\"toc-title-1012\">Table des mati\u00e8res<\/p><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">01<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#mettre-en-oeuvre-des-flux-de-travail-demails-transactionnels-pour-les-notifications-dexpedition-avec-lapi-de-mailgun\">Mettre en \u0153uvre des flux de travail d&#8217;emails transactionnels pour les notifications d&rsquo;exp\u00e9dition avec l&rsquo;API de Mailgun<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">02<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#configuration-du-compte-mailgun\">Configuration du compte Mailgun<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">03<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#configuration-du-modele-de-depart\">Configuration du mod\u00e8le de d\u00e9part<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">04<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#installez-toutes-les-dependances-a-laide-de-la-commande-suivante\">Installez toutes les d\u00e9pendances \u00e0 l&rsquo;aide de la commande suivante\u00a0:<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">05<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#conception-des-modeles-demails\">Conception des mod\u00e8les d&#8217;emails<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">06<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#implementation-de-la-fonctionnalite-denvoi-demails\">Impl\u00e9mentation de la fonctionnalit\u00e9 d&rsquo;envoi d&#8217;emails<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">07<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#integration-avec-les-evenements-de-lapplication\">Int\u00e9gration avec les \u00e9v\u00e9nements de l&rsquo;application<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">08<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#tester-le-flux-de-travail\">Tester le flux de travail<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">09<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#suivi-et-gestion-des-emails\">Suivi et gestion des emails<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">10<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#conclusion\">Conclusion<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Mettre en \u0153uvre des flux de travail d&#8217;emails transactionnels pour les notifications d&rsquo;exp\u00e9dition avec l&rsquo;API de Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour suivre ce guide, vous avez besoin de ces outils et comptes :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Un <a href=\"https:\/\/signup.mailgun.com\/new\/signup\" target=\"_tabs\" rel=\"noopener noreferrer\">compte Mailgun<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/nodejs.org\/en\/download\" target=\"_tabs\" rel=\"noopener noreferrer\">Node.js<\/a> et <a href=\"https:\/\/docs.docker.com\/engine\/install\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Docker<\/a>  install\u00e9 sur votre machine locale<\/li>\n\n\n\n<li>Un \u00e9diteur de code (ce tutoriel utilise  <a href=\"https:\/\/code.visualstudio.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\">VS Code<\/a>) et un navigateur web<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Avant de nous plonger dans la mise en \u0153uvre, examinons le flux de travail :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3943\" width=\"2252\" height=\"1078\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/1__3_.png\" alt=\"transactional email workflows diagram\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/1__3_.png 2252w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/1__3_-300x144.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/1__3_-768x368.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/1__3_-1024x490.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/1__3_-1536x735.png 1536w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/1__3_-2048x980.png 2048w\" sizes=\"(max-width: 2252px) 100vw, 2252px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Voici comment fonctionne le processus :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>L&rsquo;\u00e9quipe d&rsquo;exp\u00e9dition (ou toute personne g\u00e9rant les mises \u00e0 jour d&rsquo;exp\u00e9dition) envoie une requ\u00eate HTTP pour mettre \u00e0 jour le statut de la commande<\/li>\n\n\n\n<li>Le serveur Express met \u00e0 jour le statut de la commande dans la base de donn\u00e9es SQLite et met une t\u00e2che en file d&rsquo;attente dans BullMQ<\/li>\n\n\n\n<li>Un worker BullMQ traite les t\u00e2ches de la file d&rsquo;attente et interagit avec l&rsquo;API de Mailgun pour envoyer un email au client<\/li>\n\n\n\n<li>Le worker relance automatiquement les t\u00e2ches \u00e9chou\u00e9es<\/li>\n\n\n\n<li>Mailgun livre l&#8217;email au client<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Configuration du compte Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour utiliser l&rsquo;API de Mailgun, vous avez besoin d&rsquo;un domaine Mailgun et d&rsquo;une cl\u00e9 API pour l&rsquo;authentification. Mailgun fournit deux types de domaines : <a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/domains\/#sandbox-domain\" target=\"_tabs\" rel=\"noopener noreferrer\">des domaines sandbox<\/a>  pour les tests et  <a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/domains\/#custom-domains\" target=\"_tabs\" rel=\"noopener noreferrer\">des domaines personnalis\u00e9s<\/a>  pour une utilisation dans les environnements de production.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans ce guide, vous utiliserez un domaine sandbox. Chaque compte Mailgun en est automatiquement pourvu, vous n&rsquo;avez donc pas besoin de le cr\u00e9er manuellement. Pour obtenir votre domaine sandbox, connectez-vous \u00e0 votre compte Mailgun, puis acc\u00e9dez \u00e0 <b>Envoi &gt; Envois &gt; Domaines<\/b> dans la barre lat\u00e9rale. Copiez votre domaine :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3944\" width=\"2010\" height=\"1018\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/2__3_.png\" alt=\"Send &gt; Sending &gt; Domains Screen Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/2__3_.png 2010w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/2__3_-300x152.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/2__3_-768x389.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/2__3_-1024x519.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/2__3_-1536x778.png 1536w\" sizes=\"(max-width: 2010px) 100vw, 2010px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Par d\u00e9faut, un domaine sandbox ne peut envoyer des emails qu&rsquo;\u00e0  <a href=\"https:\/\/help.mailgun.com\/hc\/en-us\/articles\/217531258-Authorized-Recipients\" target=\"_tabs\" rel=\"noopener noreferrer\">destinataires autoris\u00e9s<\/a>. Pour configurer un email comme destinataire autoris\u00e9, cliquez sur votre nom de domaine sur la page <b>Domaines<\/b> pour afficher ses param\u00e8tres. Dans l&rsquo;onglet <b>Configuration<\/b>, sous <b>Ajouter des destinataires autoris\u00e9s<\/b>, ajoutez l&rsquo;adresse email \u00e0 laquelle vous souhaitez envoyer des emails. Veillez \u00e0 suivre les instructions envoy\u00e9es \u00e0 l&rsquo;adresse email que vous avez fournie pour la configurer en tant que destinataire autoris\u00e9\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3947\" width=\"2006\" height=\"1012\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/3__3_.png\" alt=\"Add authorized recipients Screen Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/3__3_.png 2006w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/3__3_-300x151.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/3__3_-768x387.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/3__3_-1024x517.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/3__3_-1536x775.png 1536w\" sizes=\"(max-width: 2006px) 100vw, 2006px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Pour obtenir votre cl\u00e9 API, acc\u00e9dez \u00e0 la <a href=\"https:\/\/app.mailgun.com\/settings\/api_security\" target=\"_tabs\" rel=\"noopener noreferrer\">page <b>Cl\u00e9s API<\/b><\/a> et cliquez sur <b>Ajouter une nouvelle cl\u00e9<\/b> pour cr\u00e9er une nouvelle cl\u00e9 API. Donnez un nom \u00e0 la cl\u00e9 et cliquez sur <b>Cr\u00e9er la cl\u00e9<\/b>, puis veillez \u00e0 copier la valeur de votre cl\u00e9, car elle ne s&rsquo;affichera qu&rsquo;une seule fois\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3948\" width=\"2012\" height=\"1022\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/4__4_.png\" alt=\"API Keys page Screen Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/4__4_.png 2012w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/4__4_-300x152.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/4__4_-768x390.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/4__4_-1024x520.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/4__4_-1536x780.png 1536w\" sizes=\"(max-width: 2012px) 100vw, 2012px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Configuration du mod\u00e8le de d\u00e9part<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour que ce tutoriel reste centr\u00e9 sur la cr\u00e9ation de flux de travail d&#8217;emails transactionnels, nous avons pr\u00e9par\u00e9 un mod\u00e8le de d\u00e9part sur lequel vous pouvez vous appuyer. Clonez le mod\u00e8le sur votre machine locale en ex\u00e9cutant la commande suivante dans votre terminal\u00a0:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>git clone --single-branch -b starter-template https:\/\/github.com\/kimanikevin254\/mailgun-transactional-email-workflows.git<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voici les fichiers cl\u00e9s du projet\u00a0:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>src\/controllers\/order.controller.ts contient<\/code> deux m\u00e9thodes\u00a0:\n<ul class=\"wp-block-list\">\n<li><code>index<\/code> effectue le rendu de l&rsquo;interface d&rsquo;administration, d\u00e9finie dans <code>src\/views\/admin.ejs<\/code><\/li>\n\n\n\n<li><code>updateOrderStatus<\/code> met \u00e0 jour le statut de la commande dans la base de donn\u00e9es <\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>src\/database\/entity\/order.entity.ts<\/code> d\u00e9finit l&rsquo;entit\u00e9 de la commande<\/li>\n\n\n\n<li><code>src\/database\/entity\/user.entity.ts<\/code> d\u00e9finit l&rsquo;entit\u00e9 de l&rsquo;utilisateur<\/li>\n\n\n\n<li><code>src\/database\/seed.ts<\/code> remplit la base de donn\u00e9es avec un utilisateur et une commande de test<\/li>\n\n\n\n<li><code>docker-compose.yml ex\u00e9cute<\/code> <a href=\"https:\/\/redis.io\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Redis<\/a> dans Docker, ce qui est requis par BullMQ<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Installez toutes les d\u00e9pendances \u00e0 l&rsquo;aide de la commande suivante\u00a0:<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>npm install<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ensuite, renommez le <code>fichier<\/code> <code>.env.example<\/code> en <code>.env <\/code> et remplacez les \u00e9l\u00e9ments de substitution pour <code>MAILGUN_DOMAIN <\/code> et <code>MAILGUN_API_KEY<\/code> par les identifiants que vous avez obtenus depuis le tableau de bord de Mailgun. Pour la variable MAIL_FROM, indiquez votre adresse email comme valeur.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ensuite, ouvrez le <code>fichier<\/code> <code>src\/database\/seed.ts<\/code> et remplacez les informations de l&rsquo;\u00e9l\u00e9ment de substitution dans la <code>constante userInfo<\/code> par vos propres informations. Pour l&#8217;email, veillez \u00e0 en fournir un que vous avez ajout\u00e9 en tant que destinataire autoris\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Enfin, remplissez la base de donn\u00e9es en ex\u00e9cutant la commande <code>npm run db:seed<\/code> dans votre terminal. Vous pouvez maintenant ex\u00e9cuter le projet \u00e0 l&rsquo;aide de la commande <code>npm run dev<\/code> et acc\u00e9der \u00e0 <a href=\"http:\/\/localhost:3000\/\" target=\"_tabs\" rel=\"noopener noreferrer\">http:\/\/localhost:3000<\/a> dans votre navigateur pour afficher et mettre \u00e0 jour le statut de la commande\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3953\" width=\"2028\" height=\"536\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/5__4_.png\" alt=\"order status management screen image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/5__4_.png 2028w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/5__4_-300x79.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/5__4_-768x203.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/5__4_-1024x271.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/5__4_-1536x406.png 1536w\" sizes=\"(max-width: 2028px) 100vw, 2028px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dans la section suivante, vous impl\u00e9menterez un flux de travail qui envoie automatiquement un email \u00e0 l&rsquo;utilisateur une fois le statut de la commande mis \u00e0 jour.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conception des mod\u00e8les d&#8217;emails<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Des mod\u00e8les d&#8217;emails bien con\u00e7us am\u00e9liorent la lisibilit\u00e9 et l&rsquo;exp\u00e9rience utilisateur, tout en garantissant une apparence professionnelle sur tous les appareils. Dans cette section, vous allez cr\u00e9er des mod\u00e8les qui rendent vos emails transactionnels clairs, engageants et efficaces.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Une commande passe par trois \u00e9tats (exp\u00e9di\u00e9e, en cours de livraison et livr\u00e9e), tels que d\u00e9finis dans le <code>type OrderStatus<\/code> du fichier <code>src\/types\/index.ts.<\/code> Vous allez cr\u00e9er un mod\u00e8le d&#8217;email correspondant \u00e0 chaque \u00e9tat pour tenir les clients inform\u00e9s \u00e0 chaque \u00e9tape.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour ce faire, cr\u00e9ez un fichier dans <code>src\/email-templates\/html\/shipped.html<\/code> et ajoutez le code suivant\u00a0:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                HTML                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-markup\">\r\n                                <code id=\"code_0_content\" class=\"language-markup\">\r\n\r\n                                    &lt;!DOCTYPE html&gt;rn&lt;html&gt;rn&lt;head&gt;rn    &lt;meta charset=&quot;UTF-8&quot; \/&gt;rn    &lt;title&gt;Order Shipped&lt;\/title&gt;rn&lt;\/head&gt;rn&lt;body style=&quot;font-family: Arial, sans-serif; background-color: #f4f4f4; padding: 20px; text-align: center;&quot;&gt;rnrn    &lt;div style=&quot;background: #ffffff; padding: 20px; border-radius: 8px; max-width: 600px; margin: auto; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);&quot;&gt;rnrn        &lt;div style=&quot;background-color: #007bff; color: white; padding: 15px; font-size: 22px; font-weight: bold; border-top-left-radius: 8px; border-top-right-radius: 8px;&quot;&gt;rn            Your Order Has Been Shipped! \u2708\ufe0frn        &lt;\/div&gt;rnrn        &lt;div style=&quot;padding: 20px; font-size: 16px; color: #333; text-align: left;&quot;&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;Hello, &lt;%= name %&gt;&lt;\/p&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;Your order has been shipped and is on its way to you. \ud83d\udce6&lt;\/p&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;&lt;strong&gt;Tracking Number:&lt;\/strong&gt; &lt;%= trackingNumber %&gt;&lt;\/p&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;You can track your package below. We hope you enjoy your purchase!&lt;\/p&gt;rnrn            &lt;a href=&quot;https:\/\/yourwebsite.com\/track?trackingNumber=&lt;%= trackingNumber %&gt;&quot;rn               style=&quot;background-color: #007bff; color: white; text-decoration: none; padding: 12px 18px; border-radius: 5px; display: inline-block; margin-top: 15px; font-weight: bold;&quot;&gt;rn                Track Your Shipmentrn            &lt;\/a&gt;rn        &lt;\/div&gt;rnrn        &lt;div style=&quot;background-color: #f4f4f4; padding: 10px; font-size: 14px; color: #555; border-bottom-left-radius: 8px; border-bottom-right-radius: 8px;&quot;&gt;rn            Thank you for shopping with us! \ud83d\uded2rn        &lt;\/div&gt;rn    &lt;\/div&gt;rn&lt;\/body&gt;rn&lt;\/html&gt;rn\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Ce mod\u00e8le d&#8217;email permet d&rsquo;informer les clients que leur commande a \u00e9t\u00e9 exp\u00e9di\u00e9e. Il inclut des \u00e9l\u00e9ments de substitution pour le nom et le num\u00e9ro de suivi du client, qui seront remplis dynamiquement par <a href=\"https:\/\/ejs.co\/\" target=\"_tabs\" rel=\"noopener noreferrer\">EJS<\/a> lors du rendu du mod\u00e8le. Les mod\u00e8les pour les deux autres statuts de commande suivront le m\u00eame format.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cr\u00e9ez un mod\u00e8le pour notifier les utilisateurs que leur commande est en cours de livraison. Pour ce faire, cr\u00e9ez un fichier nomm\u00e9 <code>out_for_delivery.html<\/code> dans le dossier <code>src\/email-templates\/html<\/code> et ajoutez le code suivant\u00a0:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                HTML                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-markup\">\r\n                                <code id=\"code_0_content\" class=\"language-markup\">\r\n\r\n                                    &lt;!DOCTYPE html&gt;rn&lt;html&gt;rn&lt;head&gt;rn    &lt;meta charset=&quot;UTF-8&quot; \/&gt;rn    &lt;title&gt;Out for Delivery&lt;\/title&gt;rn&lt;\/head&gt;rn&lt;body style=&quot;font-family: Arial, sans-serif; background-color: #f4f4f4; padding: 20px; text-align: center;&quot;&gt;rnrn    &lt;div style=&quot;background: #ffffff; padding: 20px; border-radius: 8px; max-width: 600px; margin: auto; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);&quot;&gt;rnrn        &lt;div style=&quot;background-color: #28a745; color: white; padding: 15px; font-size: 22px; font-weight: bold; border-top-left-radius: 8px; border-top-right-radius: 8px;&quot;&gt;rn            Your Order Is Out for Delivery! \ud83d\ude9arn        &lt;\/div&gt;rnrn        &lt;div style=&quot;padding: 20px; font-size: 16px; color: #333; text-align: left;&quot;&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;Hello, &lt;%= name %&gt;&lt;\/p&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;Good news! Your package is out for delivery and will arrive soon. \ud83d\udce6&lt;\/p&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;&lt;strong&gt;Tracking Number:&lt;\/strong&gt; &lt;%= trackingNumber %&gt;&lt;\/p&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;We appreciate your business and can&#039;t wait for you to receive your order!&lt;\/p&gt;rnrn            &lt;a href=&quot;https:\/\/yourwebsite.com\/track?trackingNumber=&lt;%= trackingNumber %&gt;&quot;rn               style=&quot;background-color: #28a745; color: white; text-decoration: none; padding: 12px 18px; border-radius: 5px; display: inline-block; margin-top: 15px; font-weight: bold;&quot;&gt;rn                Track Your Packagern            &lt;\/a&gt;rn        &lt;\/div&gt;rnrn        &lt;div style=&quot;background-color: #f4f4f4; padding: 10px; font-size: 14px; color: #555; border-bottom-left-radius: 8px; border-bottom-right-radius: 8px;&quot;&gt;rn            Thank you for choosing us! \ud83d\udecd\ufe0frn        &lt;\/div&gt;rn    &lt;\/div&gt;rn&lt;\/body&gt;rn&lt;\/html&gt;\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Enfin, cr\u00e9ez un mod\u00e8le pour informer les utilisateurs que leur commande a \u00e9t\u00e9 livr\u00e9e, en cr\u00e9ant un fichier nomm\u00e9 <code>delivered.html<\/code> dans le <code>dossier<\/code> <code>src\/email-templates\/html<\/code> et en ajoutant le code suivant\u00a0:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                HTML                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-markup\">\r\n                                <code id=\"code_0_content\" class=\"language-markup\">\r\n\r\n                                    &lt;!DOCTYPE html&gt;rn&lt;html&gt;rn&lt;head&gt;rn    &lt;meta charset=&quot;UTF-8&quot; \/&gt;rn    &lt;title&gt;Order Delivered&lt;\/title&gt;rn&lt;\/head&gt;rn&lt;body style=&quot;font-family: Arial, sans-serif; background-color: #f4f4f4; padding: 20px; text-align: center;&quot;&gt;rnrn    &lt;div style=&quot;background: #ffffff; padding: 20px; border-radius: 8px; max-width: 600px; margin: auto; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);&quot;&gt;rnrn        &lt;div style=&quot;background-color: #ffc107; color: white; padding: 15px; font-size: 22px; font-weight: bold; border-top-left-radius: 8px; border-top-right-radius: 8px;&quot;&gt;rn            Your Order Has Been Delivered! \ud83c\udf89rn        &lt;\/div&gt;rnrn        &lt;div style=&quot;padding: 20px; font-size: 16px; color: #333; text-align: left;&quot;&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;Hello, &lt;%= name %&gt;&lt;\/p&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;We&#039;re happy to inform you that your package has been successfully delivered. \ud83c\udf81&lt;\/p&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;&lt;strong&gt;Tracking Number:&lt;\/strong&gt; &lt;%= trackingNumber %&gt;&lt;\/p&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;We hope you enjoy your purchase! If you have any questions, feel free to contact us.&lt;\/p&gt;rnrn            &lt;a href=&quot;https:\/\/yourwebsite.com\/track?trackingNumber=&lt;%= trackingNumber %&gt;&quot;rn               style=&quot;background-color: #ffc107; color: white; text-decoration: none; padding: 12px 18px; border-radius: 5px; display: inline-block; margin-top: 15px; font-weight: bold;&quot;&gt;rn                Track Your Orderrn            &lt;\/a&gt;rn        &lt;\/div&gt;rnrn        &lt;div style=&quot;background-color: #f4f4f4; padding: 10px; font-size: 14px; color: #555; border-bottom-left-radius: 8px; border-bottom-right-radius: 8px;&quot;&gt;rn            Thank you for shopping with us! \ud83d\udecd\ufe0frn        &lt;\/div&gt;rn    &lt;\/div&gt;rn&lt;\/body&gt;rn&lt;\/html&gt;\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Pour g\u00e9rer et g\u00e9n\u00e9rer des mod\u00e8les d&#8217;emails de mani\u00e8re dynamique, vous devez cr\u00e9er une classe qui charge et organise les mod\u00e8les pour les diff\u00e9rents statuts de commande. Cette classe r\u00e9cup\u00e9rera le mod\u00e8le appropri\u00e9 et en effectuera le rendu avec les donn\u00e9es sp\u00e9cifiques au client. Pour ce faire, cr\u00e9ez un nouveau fichier nomm\u00e9 <code>index.ts<\/code> dans le <code>dossier src\/email-templates <\/code> et ajoutez le code suivant\u00a0:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    import { readFileSync } from &quot;fs&quot;;rnimport { EmailTemplate, OrderStatus } from &quot;..\/types&quot;;rnimport ejs from &quot;ejs&quot;;rnrnexport class EmailTemplateManager {rn    private templates: Map&lt;OrderStatus, EmailTemplate&gt;;rnrn    constructor() {rn        this.templates = new Map();rn        this.loadTemplates();rn    }rnrn    private loadTemplates() {rn        \/\/ Load each template for different statusesrn        const statuses: OrderStatus[] = [rn            &quot;shipped&quot;,rn            &quot;out_for_delivery&quot;,rn            &quot;delivered&quot;,rn        ];rn        const subjects: Record&lt;OrderStatus, string&gt; = {rn            shipped: &quot;Your Order Has Been Shipped! \u2708\ufe0f&quot;,rn            out_for_delivery: &quot;Your Order is Out for Delivery! \ud83d\ude9a&quot;,rn            delivered: &quot;Your Order Has Been Delivered! \ud83c\udf89&quot;,rn        };rnrn        statuses.forEach((status) =&gt; {rn            const htmlTemplate = readFileSync(rn                `src\/email-templates\/html\/${status}.html`,rn                &quot;utf-8&quot;rn            );rnrn            this.templates.set(status, {rn                subject: subjects[status],rn                html: htmlTemplate,rn            });rn        });rn    }rnrn    getTemplate(status: OrderStatus): EmailTemplate {rn        const template = this.templates.get(status);rn        if (!template) {rn            throw new Error(`No template found for status: ${status}`);rn        }rn        return template;rn    }rnrn    renderTemplate(templateString: string, data: Record&lt;string, any&gt;): string {rn        return ejs.render(templateString, data); \/\/ Render the template with the provided datarn    }rn}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Cette classe initialise une variable priv\u00e9e nomm\u00e9e templates, qui stocke les mod\u00e8les d&#8217;emails dans une structure Map pour une recherche rapide en fonction du statut de la commande. L&rsquo;utilisation d&rsquo;une structure Map garantit une r\u00e9cup\u00e9ration efficace et \u00e9vite de lire les fichiers de mani\u00e8re r\u00e9p\u00e9t\u00e9e \u00e0 partir du disque. La classe d\u00e9finit \u00e9galement les m\u00e9thodes suivantes\u00a0:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>loadTemplates<\/code> (priv\u00e9e) lit les mod\u00e8les HTML \u00e0 partir de fichiers et les stocke dans la structure Map templates, avec leurs objets d&#8217;email correspondants.<\/li>\n\n\n\n<li><code>getTemplate<\/code> r\u00e9cup\u00e8re le mod\u00e8le d&#8217;email pour un statut de commande donn\u00e9 et renvoie une erreur si aucun mod\u00e8le n&rsquo;est trouv\u00e9.<\/li>\n\n\n\n<li><code>renderTemplate<\/code> utilise EJS pour effectuer un rendu dynamique d&rsquo;un mod\u00e8le avec les donn\u00e9es fournies.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Impl\u00e9mentation de la fonctionnalit\u00e9 d&rsquo;envoi d&#8217;emails<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Une fois les mod\u00e8les d&#8217;emails configur\u00e9s, l&rsquo;\u00e9tape suivante consiste \u00e0 impl\u00e9menter la fonctionnalit\u00e9 d&rsquo;envoi des notifications. Cela implique de mettre les t\u00e2ches d&#8217;email en file d&rsquo;attente et de les traiter de mani\u00e8re asynchrone.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mais avant de pouvoir le faire, vous devez installer quelques d\u00e9pendances en ex\u00e9cutant la commande suivante\u00a0:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>npm i mailgun.js@11.1.0 form-data@4.0.2 bullmq@5.41.2 ioredis@5.5.0<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voici un aper\u00e7u de chacune de ces d\u00e9pendances\u00a0:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>mailgun.js<\/code> est un client Node.js permettant d&rsquo;interagir avec l&rsquo;API de Mailgun. Vous l&rsquo;utiliserez pour envoyer des emails transactionnels.<\/li>\n\n\n\n<li><code>form-data<\/code> est un package requis par <code>mailgun.js<\/code> pour g\u00e9rer les envois de formulaires lors de l&rsquo;envoi d&#8217;emails.<\/li>\n\n\n\n<li><code>bullmq<\/code> est une biblioth\u00e8que de file d&rsquo;attente de t\u00e2ches permettant de g\u00e9rer les t\u00e2ches asynchrones. Elle vous permet de mettre les notifications par email en file d&rsquo;attente et de les traiter en arri\u00e8re-plan.<\/li>\n\n\n\n<li><code>ioredis<\/code> est un client Redis pour Node.js utilis\u00e9 par BullMQ pour stocker et g\u00e9rer les t\u00e2ches mises en file d&rsquo;attente.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ensuite, vous devez d\u00e9finir un client de l&rsquo;API de Mailgun que vous utiliserez pour envoyer des emails. Pour ce faire, cr\u00e9ez un nouveau fichier dans <code>src\/config\/mailgun.config.ts<\/code> et ajoutez le code suivant\u00a0:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    import FormData from &quot;form-data&quot;;rnimport Mailgun from &quot;mailgun.js&quot;;rnrnconst mailgun = new Mailgun(FormData);rnexport const mgClient = mailgun.client({rn    username: &quot;api&quot;,rn    key: process.env.MAILGUN_API_KEY,rn});\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Ce code configure et exporte un client Mailgun \u00e0 l&rsquo;aide de la biblioth\u00e8que <code>mailgun.js<\/code> et de <code>form-data<\/code>, ce qui permet \u00e0 votre application d&rsquo;envoyer des emails via l&rsquo;API de Mailgun avec la cl\u00e9 API stock\u00e9e dans les variables d&rsquo;environnement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vous devez maintenant d\u00e9finir une connexion Redis qui sera utilis\u00e9e par BullMQ pour stocker et g\u00e9rer les t\u00e2ches en arri\u00e8re-plan. Pour ce faire, cr\u00e9ez un nouveau fichier nomm\u00e9 <code>redis.config.ts<\/code> dans le dossier <code>src\/config<\/code> et ajoutez le code ci-dessous\u00a0:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    import IORedis from &quot;ioredis&quot;;rnrnexport const redisConfig = new IORedis({rn    host: process.env.REDIS_HOST,rn    port: parseInt(process.env.REDIS_PORT),rn    maxRetriesPerRequest: null,rn});\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Vous devez configurer une file d&rsquo;attente BullMQ pour les notifications d&rsquo;exp\u00e9dition, qui g\u00e9rera les t\u00e2ches de notification par email en arri\u00e8re-plan en utilisant la connexion Redis d\u00e9finie \u00e0 l&rsquo;\u00e9tape pr\u00e9c\u00e9dente. Pour ce faire, cr\u00e9ez un nouveau fichier nomm\u00e9 <code>queues.config.ts<\/code> dans le dossier <code>src\/config<\/code> et ajoutez le code suivant\u00a0:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    import { Queue } from &quot;bullmq&quot;;rnimport { redisConfig } from &quot;.\/redis.config&quot;;rnrnexport const QUEUE_NAMES = {rn    SHIPPING_NOTICATIONS: &quot;shipping-notifications&quot;,rn};rnrnexport const JOB_NAMES = {rn    SEND_NOTIFICATION: &quot;send-notification&quot;,rn};rnrnexport const SHIPPING_NOTICATIONS_QUEUE = new Queue(rn    QUEUE_NAMES.SHIPPING_NOTICATIONS,rn    {rn        connection: redisConfig,rn    }rn);\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Ce code d\u00e9finit \u00e9galement des noms pour la file d&rsquo;attente et le type de t\u00e2che, qui peuvent \u00eatre utilis\u00e9s dans d&rsquo;autres parties de l&rsquo;application pour \u00e9viter les cha\u00eenes de caract\u00e8res cod\u00e9es en dur.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Enfin, cr\u00e9ez un nouveau fichier dans <code>src\/services\/notifications.service.ts<\/code> et ajoutez le code suivant\u00a0:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    import { Job, Queue, Worker } from &quot;bullmq&quot;;rnimport {rn    QUEUE_NAMES,rn    SHIPPING_NOTICATIONS_QUEUE,rn    JOB_NAMES,rn} from &quot;..\/config\/queues.config&quot;;rnimport { redisConfig } from &quot;..\/config\/redis.config&quot;;rnimport { mgClient } from &quot;..\/config\/mailgun.config&quot;;rnimport { IMailgunClient } from &quot;mailgun.js\/Interfaces&quot;;rnimport { EmailTemplateManager } from &quot;..\/email-templates&quot;;rnimport { MailgunMessageData } from &quot;mailgun.js&quot;;rnimport { NotificationJob } from &quot;..\/types&quot;;rnrnexport class NotificationService {rn    private queue: Queue;rn    private mailgunClient: IMailgunClient;rn    private templateManager: EmailTemplateManager;rnrn    constructor() {rn        this.queue = SHIPPING_NOTICATIONS_QUEUE;rn        this.mailgunClient = mgClient;rn        this.templateManager = new EmailTemplateManager();rn        this.setupWorker();rn    }rnrn    private setupWorker() {rn        const worker = new Worker(rn            QUEUE_NAMES.SHIPPING_NOTICATIONS,rn            async (job) =&gt; {rn                console.log(`Processing job: ${job.id}`);rn                await this.processNotification(job);rn            },rn            {rn                connection: redisConfig,rn            }rn        );rnrn        worker.on(&quot;completed&quot;, (job) =&gt; {rn            console.log(`Job ${job.id} completed successfully`);rn        });rnrn        worker.on(&quot;failed&quot;, (job, error) =&gt; {rn            console.log(`Job ${job?.id} failed`, error);rn        });rn    }rnrn    private async processNotification(job: Job&lt;NotificationJob&gt;) {rn        const { email, trackingNumber, status, metadata } = job.data;rnrn        try {rn            const template = this.templateManager.getTemplate(status);rn            const emailData: MailgunMessageData = {rn                from: process.env.MAIL_FROM,rn                to: email,rn                subject: template.subject,rn                html: this.templateManager.renderTemplate(template.html, {rn                    trackingNumber,rn                    ...metadata,rn                }),rn            };rnrn            await this.mailgunClient.messages.create(rn                process.env.MAILGUN_DOMAIN,rn                emailDatarn            );rn        } catch (error) {rn            console.log(error);rn            throw error;rn        }rn    }rnrn    async queueNotification(data: NotificationJob) {rn        await this.queue.add(JOB_NAMES.SEND_NOTIFICATION, data, {rn            attempts: 5, \/\/ number of retry attempts before failing permanentlyrn            backoff: {rn                type: &quot;exponential&quot;, \/\/ Retry using exponential backoffrn                delay: 5000, \/\/ Delay in ms before retryingrn            },rn        });rn        console.log(&quot;Job queued successfully&quot;);rn    }rn}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Ce code d\u00e9finit une classe <code>NotificationService<\/code> qui g\u00e8re les notifications par email en utilisant un syst\u00e8me de file d&rsquo;attente de t\u00e2ches avec BullMQ et Mailgun. Cette classe initialise trois propri\u00e9t\u00e9s priv\u00e9es\u00a0: queue, qui est la file d&rsquo;attente o\u00f9 les t\u00e2ches d&#8217;email sont ajout\u00e9es\u00a0; <code>mailgunClient<\/code>, qui est le client Mailgun pour l&rsquo;envoi d&#8217;emails\u00a0; et <code>templateManager<\/code>, qui est une instance de la classe TemplateManager que vous avez cr\u00e9\u00e9e pr\u00e9c\u00e9demment pour g\u00e9rer et r\u00e9cup\u00e9rer les mod\u00e8les d&#8217;emails. Cette classe d\u00e9finit \u00e9galement les m\u00e9thodes suivantes\u00a0:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>setupWorker<\/code> cr\u00e9e un worker qui \u00e9coute les nouvelles t\u00e2ches d&#8217;email et les traite. Il consigne la r\u00e9ussite ou l&rsquo;\u00e9chec de la t\u00e2che.<\/li>\n\n\n\n<li><code>processNotification<\/code> r\u00e9cup\u00e8re le mod\u00e8le d&#8217;email appropri\u00e9, le remplit avec des donn\u00e9es dynamiques et envoie l&#8217;email via Mailgun.<\/li>\n\n\n\n<li><code>queueNotification<\/code> ajoute une nouvelle t\u00e2che d&#8217;email \u00e0 la file d&rsquo;attente, avec <a href=\"https:\/\/docs.bullmq.io\/guide\/retrying-failing-jobs\" target=\"_tabs\" rel=\"noopener noreferrer\">des tentatives de relance<\/a> et <a href=\"https:\/\/docs.bullmq.io\/guide\/retrying-failing-jobs#built-in-backoff-strategies\" target=\"_tabs\" rel=\"noopener noreferrer\">un d\u00e9lai d&rsquo;attente exponentiel<\/a> pour les tentatives \u00e9chou\u00e9es. Cette m\u00e9thode peut \u00eatre appel\u00e9e depuis d&rsquo;autres parties de l&rsquo;application pour ajouter des t\u00e2ches \u00e0 la file d&rsquo;attente.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Int\u00e9gration avec les \u00e9v\u00e9nements de l&rsquo;application<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour envoyer des notifications par email lorsqu&rsquo;un statut de commande est mis \u00e0 jour, vous devez mettre une t\u00e2che en file d&rsquo;attente dans le syst\u00e8me de notification. Pour ce faire, ouvrez le fichier <code>src\/controllers\/order.controller.ts<\/code> et ajoutez l&rsquo;instruction d&rsquo;importation suivante pour importer la classe <code>NotificationService<\/code>\u00a0:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>import { NotificationService } from \"..\/services\/notifications.service\";<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ensuite, d\u00e9finissez une propri\u00e9t\u00e9 priv\u00e9e dans la classe <code>OrderController<\/code> pour contenir une instance de la classe <code>NotificationService<\/code>\u00a0:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>private notificationService: NotificationService;<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Initialisez cette propri\u00e9t\u00e9 en ajoutant le code suivant dans la m\u00e9thode <code>constructor<\/code>\u00a0:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>this.notificationService = new NotificationService();<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Enfin, ajoutez le code suivant dans la m\u00e9thode <code>updateOrderStatus<\/code> apr\u00e8s <code>await this.orderRepository.save(order);<\/code> pour mettre une t\u00e2che en file d&rsquo;attente une fois le statut de la commande mis \u00e0 jour avec succ\u00e8s\u00a0:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    \/\/ Send notificationrnthis.notificationService.queueNotification({rn    email: order.user.email,rn    trackingNumber: order.trackingNumber,rn    status,rn    metadata: {rn        name: order.user.name.split(&quot; &quot;)[0],rn    },rn});\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Le flux de travail de l&#8217;email transactionnel est maintenant termin\u00e9. Vous pouvez maintenant v\u00e9rifier que tout fonctionne comme pr\u00e9vu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tester le flux de travail<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour vous assurer que tout fonctionne correctement, d\u00e9marrez Redis en ex\u00e9cutant la commande suivante dans votre terminal\u00a0:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>docker compose up -d<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Apr\u00e8s avoir ex\u00e9cut\u00e9 cette commande, vous pouvez v\u00e9rifier que Redis est op\u00e9rationnel en listant les conteneurs\u00a0:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>docker ps<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cette commande affiche une liste de conteneurs actifs, et vous devriez voir le conteneur <code>redis<\/code> en cours d&rsquo;ex\u00e9cution.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ensuite, lancez le serveur Express \u00e0 l&rsquo;aide de la commande <code>npm run dev<\/code> et acc\u00e9dez \u00e0 <a href=\"http:\/\/localhost:3000\/\" target=\"_tabs\" rel=\"noopener noreferrer\">http:\/\/localhost:3000<\/a> dans votre navigateur. Sur le tableau de bord de l&rsquo;application, mettez \u00e0 jour le statut de la commande avec l&rsquo;une des options disponibles. Une fois la mise \u00e0 jour effectu\u00e9e, vous recevrez une r\u00e9ponse imm\u00e9diate\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3955\" width=\"2012\" height=\"550\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/6__4_.png\" alt=\"Shipped Order Status Screen Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/6__4_.png 2012w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/6__4_-300x82.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/6__4_-768x210.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/6__4_-1024x280.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/6__4_-1536x420.png 1536w\" sizes=\"(max-width: 2012px) 100vw, 2012px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dans votre terminal, vous obtiendrez un journal vous indiquant que la t\u00e2che d&rsquo;envoi d&#8217;email a bien \u00e9t\u00e9 mise en file d&rsquo;attente et est en cours de traitement\u00a0:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Job queued successfully<br>\nProcessing job: 1<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Et lorsqu&rsquo;elle est termin\u00e9e\u00a0:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Job 1 completed successfully<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vous recevrez ensuite un email contenant le statut actualis\u00e9 de la commande\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3958\" width=\"2028\" height=\"1024\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/7__3_.png\" alt=\"Your order has shipped screen image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/7__3_.png 2028w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/7__3_-300x151.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/7__3_-768x388.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/7__3_-1024x517.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/7__3_-1536x776.png 1536w\" sizes=\"(max-width: 2028px) 100vw, 2028px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Chaque fois que vous mettez \u00e0 jour le statut d&rsquo;une commande, le syst\u00e8me enverra automatiquement un email correspondant \u00e0 l&rsquo;utilisateur, pour le tenir inform\u00e9\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3962\" width=\"2014\" height=\"986\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/8__3_.png\" alt=\"Your Order has been delivered screen image 8\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/8__3_.png 2014w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/8__3_-300x147.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/8__3_-768x376.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/8__3_-1024x501.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/8__3_-1536x752.png 1536w\" sizes=\"(max-width: 2014px) 100vw, 2014px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Le code complet de l&rsquo;application est disponible sur <a href=\"https:\/\/github.com\/kimanikevin254\/mailgun-transactional-email-workflows\" target=\"_tabs\" rel=\"noopener noreferrer\">GitHub<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Suivi et gestion des emails<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour vous assurer que vos emails transactionnels parviennent bien \u00e0 vos clients, vous devez surveiller leur \u00e9tat de livraison et leurs taux d&rsquo;ouverture, et g\u00e9rer les \u00e9ventuels \u00e9checs. Mailgun propose un tableau de bord o\u00f9 vous pouvez suivre les emails envoy\u00e9s, v\u00e9rifier s&rsquo;ils ont \u00e9t\u00e9 livr\u00e9s, ouverts ou cliqu\u00e9s, et consulter les rapports de rebond.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vous pouvez acc\u00e9der \u00e0 ce tableau de bord en acc\u00e9dant \u00e0 <b>Envoi &gt; Rapports &gt; Statistiques<\/b> dans Mailgun\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3968\" width=\"2016\" height=\"1072\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/9__3_.png\" alt=\"Send &gt; Reporting &gt; Metrics Screen Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/9__3_.png 2016w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/9__3_-300x160.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/9__3_-768x408.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/9__3_-1024x545.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/9__3_-1536x817.png 1536w\" sizes=\"(max-width: 2016px) 100vw, 2016px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Cependant, les taux d&rsquo;ouverture ne sont pas suivis automatiquement. Vous devez les configurer manuellement via l&rsquo;onglet <b>Param\u00e8tres<\/b> de votre domaine d&rsquo;envoi\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3975\" width=\"2040\" height=\"1064\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/10__2_.png\" alt=\"Domain Settings Screen Tab image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/10__2_.png 2040w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/10__2_-300x156.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/10__2_-768x401.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/10__2_-1024x534.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/10__2_-1536x801.png 1536w\" sizes=\"(max-width: 2040px) 100vw, 2040px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">De plus amples informations sur le suivi des taux d&rsquo;ouverture et de clics sont disponibles dans la <a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/tracking-messages\/#tracking-opens\" target=\"_tabs\" rel=\"noopener noreferrer\">documentation officielle<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">De plus, vous pouvez utiliser <a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/tracking-messages\/#webhooks\" target=\"_tabs\" rel=\"noopener noreferrer\">webhooks<\/a> pour recevoir des notifications en temps r\u00e9el concernant les \u00e9checs de livraison et prendre les mesures appropri\u00e9es, telles que renvoyer l&#8217;email.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En surveillant activement les performances de vos emails, vous pouvez am\u00e9liorer la d\u00e9livrabilit\u00e9, r\u00e9duire les rebonds et vous assurer que les notifications importantes parviennent \u00e0 vos clients.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dans cet article, vous avez appris \u00e0 configurer un flux de travail d&#8217;emails transactionnels pour les notifications d&rsquo;exp\u00e9dition \u00e0 l&rsquo;aide de Mailgun, BullMQ et Redis. Vous avez appris \u00e0 configurer Mailgun pour l&rsquo;envoi d&#8217;emails, \u00e0 d\u00e9finir une file d&rsquo;attente de t\u00e2ches avec BullMQ, et \u00e0 l&rsquo;int\u00e9grer \u00e0 un syst\u00e8me de mise \u00e0 jour des commandes afin de garantir que les clients re\u00e7oivent des notifications par email en temps r\u00e9el. Cette approche am\u00e9liore la communication et optimise l&rsquo;exp\u00e9rience client globale.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cet article vous a-t-il \u00e9t\u00e9 utile\u00a0? N&rsquo;oubliez pas de vous inscrire \u00e0 notre newsletter pour recevoir d&rsquo;autres tutoriels et analyses approfondies comme celle-ci.<\/p>\n\n\n\r\n    <aside data-content-type=\"longform\"  class=\"banner-block longform-spacings rounded-lg shadow-lg px-5 py-6 px-md-6 py-md-7 p-lg-7 bg-light\" data-theme=\"dark\" aria-labelledby=\"banner-block-block_a5b33e7817e902af54a4c3481fdcd41a\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                S&rsquo;inscrire            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_a5b33e7817e902af54a4c3481fdcd41a\">\r\n                Lancez-vous, c&rsquo;est facile ! Et c&rsquo;est gratuit.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">D\u00e9couvrez ce que vous pouvez accomplir avec la meilleure plateforme de livraison d\u2019emails au monde.<\/div>\r\n                            <\/div>\r\n        \r\n        <div class=\"text-start mt-5\"><a href=\"https:\/\/signup.mailgun.com\/new\/signup\"  class=\"btn btn-secondary\" >Get started<\/a><\/div>\r\n    <\/aside>\r\n\r\n","protected":false},"excerpt":{"rendered":"<p>Les clients s&rsquo;attendent \u00e0 des mises \u00e0 jour en temps r\u00e9el d\u00e8s que l&rsquo;\u00e9tat de leur commande change. Ce guide vous explique comment cr\u00e9er un flux de travail d&#8217;emails transactionnels fiable pour les notifications d&rsquo;exp\u00e9dition \u00e0 l&rsquo;aide de l&rsquo;API de Mailgun et de BullMQ, afin que vos emails arrivent dans la bo\u00eete de r\u00e9ception exactement au bon moment.<\/p>\n","protected":false},"author":5,"featured_media":3952,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[19],"class_list":["post-19769","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-dev-life"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Cr\u00e9er des flux de travail d&#039;emails transactionnels avec l&#039;API de Mailgun - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"D\u00e9couvrez comment cr\u00e9er des emails de notification d&#039;exp\u00e9dition \u00e9volutifs et bas\u00e9s sur des \u00e9v\u00e9nements en utilisant l&#039;API de Mailgun et BullMQ pour de meilleures performances et une d\u00e9livrabilit\u00e9 optimale.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cr\u00e9er des flux de travail d&#039;emails transactionnels avec l&#039;API de Mailgun - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"D\u00e9couvrez comment cr\u00e9er des emails de notification d&#039;exp\u00e9dition \u00e9volutifs et bas\u00e9s sur des \u00e9v\u00e9nements en utilisant l&#039;API de Mailgun et BullMQ pour de meilleures performances et une d\u00e9livrabilit\u00e9 optimale.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-14T15:02:20+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"448\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\\\/\",\"name\":\"Cr\u00e9er des flux de travail d'emails transactionnels avec l'API de Mailgun - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"datePublished\":\"2025-06-11T00:00:00+00:00\",\"dateModified\":\"2026-09-14T15:02:20+00:00\",\"description\":\"D\u00e9couvrez comment cr\u00e9er des emails de notification d'exp\u00e9dition \u00e9volutifs et bas\u00e9s sur des \u00e9v\u00e9nements en utilisant l'API de Mailgun et BullMQ pour de meilleures performances et une d\u00e9livrabilit\u00e9 optimale.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Cr\u00e9er des flux de travail d\u2019emails transactionnels pour les notifications d\u2019exp\u00e9dition avec l\u2019API de Mailgun\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Des API d\u2019emails transactionnels puissantes qui vous permettent d'envoyer, de recevoir et de suivre des emails, con\u00e7ues pour les d\u00e9veloppeurs. En savoir plus d\u00e8s aujourd'hui !\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"width\":512,\"height\":512,\"caption\":\"Transactional Email API Service For Developers | Mailgun\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Cr\u00e9er des flux de travail d'emails transactionnels avec l'API de Mailgun - Transactional Email API Service For Developers | Mailgun","description":"D\u00e9couvrez comment cr\u00e9er des emails de notification d'exp\u00e9dition \u00e9volutifs et bas\u00e9s sur des \u00e9v\u00e9nements en utilisant l'API de Mailgun et BullMQ pour de meilleures performances et une d\u00e9livrabilit\u00e9 optimale.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\/","og_locale":"fr_FR","og_type":"article","og_title":"Cr\u00e9er des flux de travail d'emails transactionnels avec l'API de Mailgun - Transactional Email API Service For Developers | Mailgun","og_description":"D\u00e9couvrez comment cr\u00e9er des emails de notification d'exp\u00e9dition \u00e9volutifs et bas\u00e9s sur des \u00e9v\u00e9nements en utilisant l'API de Mailgun et BullMQ pour de meilleures performances et une d\u00e9livrabilit\u00e9 optimale.","og_url":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","article_modified_time":"2026-09-14T15:02:20+00:00","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\/","url":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\/","name":"Cr\u00e9er des flux de travail d'emails transactionnels avec l'API de Mailgun - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","datePublished":"2025-06-11T00:00:00+00:00","dateModified":"2026-09-14T15:02:20+00:00","description":"D\u00e9couvrez comment cr\u00e9er des emails de notification d'exp\u00e9dition \u00e9volutifs et bas\u00e9s sur des \u00e9v\u00e9nements en utilisant l'API de Mailgun et BullMQ pour de meilleures performances et une d\u00e9livrabilit\u00e9 optimale.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-travail-emails-transactionnels-notifications-expedition\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/fr\/blog\/"},{"@type":"ListItem","position":3,"name":"Cr\u00e9er des flux de travail d\u2019emails transactionnels pour les notifications d\u2019exp\u00e9dition avec l\u2019API de Mailgun"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/fr\/#website","url":"https:\/\/www.mailgun.com\/fr\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Des API d\u2019emails transactionnels puissantes qui vous permettent d'envoyer, de recevoir et de suivre des emails, con\u00e7ues pour les d\u00e9veloppeurs. En savoir plus d\u00e8s aujourd'hui !","publisher":{"@id":"https:\/\/www.mailgun.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/fr\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mailgun.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","width":512,"height":512,"caption":"Transactional Email API Service For Developers | Mailgun"},"image":{"@id":"https:\/\/www.mailgun.com\/fr\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog\/19769","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/users\/5"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog\/19769\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/media\/3952"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/media?parent=19769"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog_category?post=19769"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}