{"id":20019,"date":"2026-09-14T21:18:08","date_gmt":"2026-09-14T21:18:08","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/comment-creer-flux-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\/"},"modified":"2026-09-14T21:18:09","modified_gmt":"2026-09-14T21:18:09","slug":"comment-creer-flux-de-travail-emails-transactionnels-reinitialisation-mot-de-passe","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\/","title":{"rendered":"Cr\u00e9er des flux de travail d&#8217;emails transactionnels pour les r\u00e9initialisations de mot de passe avec l&rsquo;API de Mailgun"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/mailchimp.com\/marketing-glossary\/transactional-email\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Emails transactionnels<\/a> sont des emails automatis\u00e9s d\u00e9clench\u00e9s par les actions des utilisateurs sur un site web, une application ou un service. Contrairement aux <a href=\"https:\/\/www.brevo.com\/blog\/what-is-email-marketing\/\" target=\"_tabs\" rel=\"noopener noreferrer\">emails de marketing<\/a>, qui assurent la promotion de produits ou de services, les emails transactionnels fournissent des informations essentielles, souvent en temps r\u00e9el.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Les flux de travail d&#8217;emails transactionnels vont encore plus loin en automatisant une s\u00e9quence d&#8217;emails bas\u00e9e sur les actions des utilisateurs pour garantir une communication opportune et une exp\u00e9rience utilisateur fluide. Les entreprises s&rsquo;appuient sur des services comme <a href=\"https:\/\/www.mailgun.com\/fr\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Mailgun<\/a> pour les emails transactionnels, car ils sont rapides, pertinents et d\u00e9clench\u00e9s par des actions imm\u00e9diates des utilisateurs. Par exemple, le flux de travail permet \u00e0 un utilisateur de r\u00e9initialiser rapidement son mot de passe et de retrouver l&rsquo;acc\u00e8s \u00e0 son compte.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans ce tutoriel, vous apprendrez \u00e0 cr\u00e9er un flux de travail d&#8217;emails transactionnels pour les r\u00e9initialisations de mot de passe avec l&rsquo;API de Mailgun.<\/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-9200\"><p class=\"h5 m-0\" id=\"toc-title-9200\">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=\"#configurer-un-compte-mailgun\">Configurer un compte 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=\"#obtenir-une-cle-api\">Obtenir une cl\u00e9 API<\/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=\"#creer-linterface-de-lapplication-avec-fastapi\">Cr\u00e9er l&rsquo;interface de l&rsquo;application avec FastAPI<\/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=\"#configurer-une-connexion-a-mailgun\">Configurer une connexion \u00e0 Mailgun<\/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=\"#concevoir-et-configurer-le-modele-demail\">Concevoir et configurer le mod\u00e8le d&#8217;email<\/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=\"#mise-en-oeuvre-de-la-fonctionnalite-denvoi-demails\">Mise en \u0153uvre 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=\"#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\">09<\/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\">Configurer un compte Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si vous n&rsquo;avez pas encore de compte Mailgun, la premi\u00e8re chose \u00e0 faire est d&rsquo;en <a href=\"https:\/\/signup.mailgun.com\/new\/signup\" target=\"_tabs\" rel=\"noopener noreferrer\">cr\u00e9er un<\/a>. Assurez-vous de consulter l&#8217;email associ\u00e9 \u00e0 votre compte Mailgun et de v\u00e9rifier votre compte\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3961\" width=\"888\" height=\"572\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/1__1_.png\" alt=\"Account Verification Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/1__1_.png 888w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/1__1_-300x193.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/1__1_-768x495.png 768w\" sizes=\"(max-width: 888px) 100vw, 888px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ensuite, saisissez votre num\u00e9ro de t\u00e9l\u00e9phone et le code d&rsquo;autorisation fourni pour activer votre compte\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3963\" width=\"1348\" height=\"502\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/2__1_.png\" alt=\"Account Verification Phone Number image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/2__1_.png 1348w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/2__1_-300x112.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/2__1_-768x286.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/2__1_-1024x381.png 1024w\" sizes=\"(max-width: 1348px) 100vw, 1348px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Une fois votre compte Mailgun configur\u00e9, il est temps d&rsquo;obtenir une cl\u00e9 API pour commencer \u00e0 utiliser le service.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Obtenir une cl\u00e9 API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour que votre application interagisse avec les services de Mailgun, elle doit \u00eatre authentifi\u00e9e via une cl\u00e9 API. Pour obtenir votre cl\u00e9 API, acc\u00e9dez au tableau de bord Mailgun et s\u00e9lectionnez <b>D\u00e9marrer<\/b> \u00e0 gauche pour afficher un <b>Guide de d\u00e9marrage<\/b>\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3964\" width=\"1554\" height=\"688\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/3__1_.png\" alt=\"API Get Started Guide Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/3__1_.png 1554w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/3__1_-300x133.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/3__1_-768x340.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/3__1_-1024x453.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/3__1_-1536x680.png 1536w\" sizes=\"(max-width: 1554px) 100vw, 1554px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Cliquez sur le bouton <b>D\u00e9marrer<\/b> sous <b>Cr\u00e9er une cl\u00e9 API<\/b>. Ensuite, fournissez une description qui d\u00e9crit correctement l&rsquo;objectif de la cl\u00e9 API. Par exemple, si la cl\u00e9 API est destin\u00e9e aux processus d&rsquo;authentification des utilisateurs, vous pouvez la nommer user_authentication et cliquer sur <b>Cr\u00e9er une cl\u00e9<\/b>\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3969\" width=\"1536\" height=\"656\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/4__2_.png\" alt=\"Create New API Key Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/4__2_.png 1536w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/4__2_-300x128.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/4__2_-768x328.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/4__2_-1024x437.png 1024w\" sizes=\"(max-width: 1536px) 100vw, 1536px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Assurez-vous de copier et de conserver cette cl\u00e9 en lieu s\u00fbr, car c&rsquo;est la seule fois qu&rsquo;elle sera affich\u00e9e\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3973\" width=\"1540\" height=\"678\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/5__2_.png\" alt=\"New API Key Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/5__2_.png 1540w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/5__2_-300x132.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/5__2_-768x338.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/5__2_-1024x451.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/5__2_-1536x676.png 1536w\" sizes=\"(max-width: 1540px) 100vw, 1540px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Cr\u00e9er l&rsquo;interface de l&rsquo;application avec FastAPI<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour cr\u00e9er l&rsquo;interface de l&rsquo;application qui alimente le flux de travail d&#8217;emails, la premi\u00e8re chose \u00e0 faire est d&rsquo;installer les biblioth\u00e8ques n\u00e9cessaires. Avant cela, cr\u00e9ez un r\u00e9pertoire de projet en ex\u00e9cutant <code>mkdir my_fastapi_app<\/code> et lancez un <a href=\"https:\/\/www.freecodecamp.org\/news\/how-to-setup-virtual-environments-in-python\/\" target=\"_tabs\" rel=\"noopener noreferrer\">environnement virtuel<\/a> dans le r\u00e9pertoire.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ensuite, installez les biblioth\u00e8ques n\u00e9cessaires avec la commande suivante\u00a0:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>pip install fastapi jinja2 requests uvicorn python-multipart<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ici, vous installez\u00a0:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>fastapi<\/code>, qui sert de framework backend principal<\/li>\n\n\n\n<li><code>jinja2<\/code>, qui sert vos mod\u00e8les frontend<\/li>\n\n\n\n<li><code>requests<\/code>, qui envoie des requ\u00eates HTTP \u00e0 l&rsquo;API de Mailgun<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Bien que FastAPI soit principalement destin\u00e9 \u00e0 la cr\u00e9ation d&rsquo;API, l&rsquo;ajout de la biblioth\u00e8que <code>jinja2<\/code> permet un d\u00e9veloppement full-stack, mais cela n\u00e9cessite une configuration de r\u00e9pertoire appropri\u00e9e. La structure de votre projet doit suivre ce format\u00a0:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>my_fastapi_app\/<br>\n\u2502\u2500\u2500 main.py # Fichier principal de l'application FastAPI<br>\n\u2502\u2500\u2500 users.json # Fichier JSON stockant les donn\u00e9es utilisateur<br>\n\u2502\u2500\u2500 templates\/ # Dossier des mod\u00e8les HTML<br>\n\u2502 \u251c\u2500\u2500 login.html # Page de connexion<br>\n\u2502 \u251c\u2500\u2500 home.html # Page d'accueil<br>\n\u2502 \u251c\u2500\u2500 passwordReset.html # Page de r\u00e9initialisation de mot de passe<br>\n\u2502\u2500\u2500 static\/ # Dossier des fichiers statiques<br>\n\u2502 \u251c\u2500\u2500 styles.css # Styles pour les fichiers login.html et passwordReset.html<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vous pouvez trouver tout le code de ce tutoriel dans <a href=\"https:\/\/github.com\/EphraimX\/building-transactional-email-workflows-for-password-resets-with-mailgun-api\" target=\"_tabs\" rel=\"noopener noreferrer\">ce d\u00e9p\u00f4t GitHub<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Une fois la structure de votre projet en place, vous pouvez copier et coller le code dans les fichiers respectifs ou cloner le d\u00e9p\u00f4t GitHub ci-dessus avec la commande suivante\u00a0:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>git clone https:\/\/github.com\/EphraimX\/building-transactional-email-workflows-for-password-resets-with-mailgun-api.git<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetons un coup d&rsquo;\u0153il \u00e0 la premi\u00e8re section du fichier main.py. C&rsquo;est dans ce fichier que toute la magie op\u00e8re, car il connecte les op\u00e9rations frontend et backend\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 osrnimport jsonrnimport uuidrnimport requestsrnimport urllib.parsernfrom fastapi import FastAPI, Request, Formrnfrom pydantic import BaseModelrnfrom fastapi.responses import HTMLResponsernfrom fastapi.staticfiles import StaticFilesrnfrom fastapi.templating import Jinja2Templatesrnrnapp = FastAPI()rnapp.mount(&quot;\/static&quot;, StaticFiles(directory=&quot;static&quot;), name=&quot;static&quot;)rntemplates = Jinja2Templates(directory=&quot;templates&quot;)rnrnclass loginData(BaseModel):rn    username: strrn    password: strrnrn@app.get(&quot;\/login&quot;, response_class=HTMLResponse)rnasync def login(request: Request):rn    return templates.TemplateResponse(&quot;login.html&quot;, {&quot;request&quot;: request, &quot;message&quot;: &quot;&quot;})rnrn@app.get(&quot;\/passwordResetView\/&quot;, response_class=HTMLResponse)rnasync def password_reset_view(request: Request):rn    return templates.TemplateResponse(rn        &quot;passwordReset.html&quot;, {&quot;request&quot;: request, &quot;message&quot;: &quot;&quot;}rn    )rnrn@app.post(&quot;\/home&quot;, response_class=HTMLResponse)rnasync def password_reset(rn    request: Request, email_address: str = Form(...), password: str = Form(...)rn):rnrn    # Open and read the JSON DB filern    try:rn        with open(&quot;users.json&quot;, &quot;r&quot;) as file:rn            users = json.load(file)rn    except (FileNotFoundError, json.JSONDecodeError):rn        users = []rnrn    for user in users:rnrn        if user[&quot;email_address&quot;] == email_address and user[&quot;password&quot;] == password:rn            return templates.TemplateResponse(&quot;home.html&quot;, {&quot;request&quot;: request})rnrn    # If no match was found, return an error messagern    return templates.TemplateResponse(rn        &quot;login.html&quot;,rn        {rn            &quot;request&quot;: request,rn            &quot;message&quot;: &quot;Email or Password Incorrect. If you cannot remember your password, kindly reset it.&quot;,rn        },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\">Dans ce code, l&rsquo;application g\u00e8re l&rsquo;authentification en servant des pages de connexion et de r\u00e9initialisation de mot de passe tout en v\u00e9rifiant les identifiants dans <code>users.json<\/code>. L&rsquo;application initialise FastAPI, configure les mod\u00e8les et d\u00e9finit un mod\u00e8le loginData pour la validation. Les routes <code>\/login <\/code>et <code>\/passwordResetView\/ <\/code>servent leurs pages respectives, tandis que \/home v\u00e9rifie les identifiants, redirigeant les utilisateurs valides ou affichant des erreurs. La fonction de r\u00e9initialisation de mot de passe g\u00e9n\u00e8re un lien unique en utilisant uuid et l&rsquo;envoie via l&rsquo;API de Mailgun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour tester cela, ouvrez votre base de donn\u00e9es de fortune (<code>users.json<\/code>) et collez ce qui suit\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                                    [rn    {rn        &quot;username&quot; : &quot;sinchy&quot;,rn        &quot;email_address&quot; : &quot;sinch@gmail.com&quot;,rn        &quot;password&quot; : &quot;sinch12345&quot;rn    },rn    {rn        &quot;username&quot; : &quot;grinchy&quot;,rn        &quot;email_address&quot; : &quot;rinch@gmail.com&quot;,rn        &quot;password&quot; : &quot;grinch67890&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\">Vous devez \u00e9galement <a href=\"https:\/\/help.mailgun.com\/hc\/en-us\/articles\/217531258-Authorized-Recipients\" target=\"_tabs\" rel=\"noopener noreferrer\">autoriser<\/a> ces adresses emails via le tableau de bord Mailgun si vous utilisez un domaine sandbox.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">D\u00e9marrez votre application en ex\u00e9cutant la commande uvicorn main:app &#8211;reload. Ensuite, rendez-vous sur <a href=\"http:\/\/localhost:8000\/login\" target=\"_tabs\" rel=\"noopener noreferrer\">http:\/\/localhost:8000\/login<\/a>, o\u00f9 vous devriez voir ceci\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3979\" width=\"1536\" height=\"718\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/6__2_.png\" alt=\"API Login Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/6__2_.png 1536w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/6__2_-300x140.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/6__2_-768x359.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/6__2_-1024x479.png 1024w\" sizes=\"(max-width: 1536px) 100vw, 1536px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Si vous essayez de vous connecter avec l&rsquo;un des identifiants du fichier users.json, vous serez redirig\u00e9 vers la page d&rsquo;accueil\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3981\" width=\"1538\" height=\"716\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/7__1_.png\" alt=\"Successful API Login Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/7__1_.png 1538w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/7__1_-300x140.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/7__1_-768x358.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/7__1_-1024x477.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/7__1_-1536x715.png 1536w\" sizes=\"(max-width: 1538px) 100vw, 1538px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Si vous saisissez de mauvaises informations de connexion, vous verrez ceci\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3982\" width=\"1540\" height=\"716\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/8__1_.png\" alt=\"Unsuccessful API Login Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/8__1_.png 1540w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/8__1_-300x139.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/8__1_-768x357.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/8__1_-1024x476.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/8__1_-1536x714.png 1536w\" sizes=\"(max-width: 1540px) 100vw, 1540px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Configurer une connexion \u00e0 Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour envoyer des emails avec Mailgun, vous devez \u00e9tablir une connexion entre votre application et le service d&#8217;emailing de Mailgun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour ce faire, ouvrez main.py et collez le code suivant, en rempla\u00e7ant <code><\/code>, <code><\/code> et  par des valeurs valides\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                                    def send_simple_message(API_KEY):rn    response = requests.post(rn        &quot;https:\/\/api.mailgun.net\/v3\/&lt;SANDBOX_URL&gt;\/messages&quot;,rn        auth=(&quot;api&quot;, f&quot;{API_KEY}&quot;),rn        data={&quot;from&quot;: &quot;Mailgun Sandbox &lt;postmaster@&lt;SANDBOX_URL&gt;&gt;&quot;,rn              &quot;to&quot;: &quot;&lt;RECIPIENT_NAME&gt; &lt;RECIPIENT_EMAIL&gt;&quot;,rn              &quot;subject&quot;: &quot;Hello &lt;RECIPIENT_NAME&gt;&quot;,rn              &quot;text&quot;: &quot;Congratulations &lt;RECIPIENT_NAME&gt;, you just sent an email with Mailgun! You are truly awesome!&quot;rn              }rn    )rnrn    print(response.json())rn    return responsern\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\">\u00c0 des fins de test, transmettez votre cl\u00e9 API directement lors de l&rsquo;appel de la fonction\u00a0:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>send_simple_message(\"your-api-key-here\")<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lancez le script en ex\u00e9cutant ce qui suit\u00a0:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>python main.py<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En cas de succ\u00e8s, la fonction affichera une r\u00e9ponse similaire \u00e0 celle-ci\u00a0:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>{<br>\n\"id\": \"\",<br>\n\"message\": \"Queued. Thank you.\"<br>\n}<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cela confirme que la requ\u00eate d&#8217;email a bien \u00e9t\u00e9 mise en file d&rsquo;attente par Mailgun.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Concevoir et configurer le mod\u00e8le d&#8217;email<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour travailler sur la logique de r\u00e9initialisation de mot de passe, vous devez concevoir le mod\u00e8le de l&#8217;email envoy\u00e9 \u00e0 l&rsquo;utilisateur. Avec Mailgun, il existe deux fa\u00e7ons de concevoir un email\u00a0: le HTML ou le constructeur de mod\u00e8le \u00ab\u00a0drag-and-drop\u00a0\u00bb de Mailgun. Vous utiliserez ici l&rsquo;approche HTML.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour commencer la conception, acc\u00e9dez \u00e0 votre tableau de bord Mailgun et naviguez vers <b>Envoi &gt; Envoi &gt; Mod\u00e8les<\/b>\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3985\" width=\"1532\" height=\"678\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/9__1_.png\" alt=\"Templates Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/9__1_.png 1532w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/9__1_-300x133.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/9__1_-768x340.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/9__1_-1024x453.png 1024w\" sizes=\"(max-width: 1532px) 100vw, 1532px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ensuite, cliquez sur <b>Cr\u00e9er un mod\u00e8le de message<\/b>, s\u00e9lectionnez l&rsquo;option pour le coder en HTML et cliquez sur le mod\u00e8le <b>Vierge<\/b>\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3989\" width=\"1532\" height=\"648\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/10.png\" alt=\"Blank Option image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/10.png 1532w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/10-300x127.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/10-768x325.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/10-1024x433.png 1024w\" sizes=\"(max-width: 1532px) 100vw, 1532px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Remplissez le formulaire de mod\u00e8le avec le nom, la description et les d\u00e9tails de l&#8217;email\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3995\" width=\"1570\" height=\"682\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/11.png\" alt=\"Template Details image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/11.png 1570w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/11-300x130.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/11-768x334.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/11-1024x445.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/11-1536x667.png 1536w\" sizes=\"(max-width: 1570px) 100vw, 1570px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ensuite, faites d\u00e9filer jusqu&rsquo;\u00e0 l&rsquo;onglet <b>\u00c9diteur<\/b> et copiez-collez le code du fichier <a href=\"https:\/\/github.com\/EphraimX\/building-transactional-email-workflows-for-password-resets-with-mailgun-api\/blob\/main\/building-transactional-email-workflows-for-password-resets-with-mailgun-api\/email_template.html\" target=\"_tabs\" rel=\"noopener noreferrer\">email_template.html<\/a> \u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3998\" width=\"1560\" height=\"710\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/12.png\" alt=\"Template Editor Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/12.png 1560w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/12-300x137.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/12-768x350.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/12-1024x466.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/12-1536x699.png 1536w\" sizes=\"(max-width: 1560px) 100vw, 1560px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Lorsque vous s\u00e9lectionnez l&rsquo;onglet <b>Donn\u00e9es de test<\/b>, vous verrez deux variables dynamiques\u00a0: <code>username<\/code> et <code>reset_link<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">S\u00e9lectionnez l&rsquo;onglet <b>Aper\u00e7u<\/b> pour voir le mod\u00e8le\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4005\" width=\"1550\" height=\"768\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/13.png\" alt=\"Reset Password Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/13.png 1550w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/13-300x149.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/13-768x381.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/13-1024x507.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/13-1536x761.png 1536w\" sizes=\"(max-width: 1550px) 100vw, 1550px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Enfin, cliquez sur le bouton <b>Cr\u00e9er<\/b> pour le cr\u00e9er.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mise en \u0153uvre de la fonctionnalit\u00e9 d&rsquo;envoi d&#8217;emails<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Une fois votre mod\u00e8le d&#8217;email pr\u00eat, il est temps de d\u00e9velopper la fonctionnalit\u00e9 d&rsquo;envoi d&#8217;emails. Ouvrez le fichier <code>main.py<\/code> et collez 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                                    @app.post(&quot;\/resetPassword\/&quot;)rnasync def reset_password(request: Request, email_address: str = Form(...)):rnrn    # Open and read the JSON DB filern    try:rn        with open(&quot;users.json&quot;, &quot;r&quot;) as file:rn            users = json.load(file)rn    except (FileNotFoundError, json.JSONDecodeError):rn        users = []rnrn    for user in users:rn        if user[&quot;email_address&quot;] == email_address:rnrn            email_address = user[&quot;email_address&quot;]rn            username = user[&quot;username&quot;]rn            reset_link = await generate_password_reset_link(email_address)rnrn            response = await send_password_reset_email(rn                username, email_address, reset_linkrn            )rnrn            if response[&quot;success&quot;]:rnrn                return templates.TemplateResponse(rn                    &quot;login.html&quot;,rn                    {rn                        &quot;request&quot;: request,rn                        &quot;message&quot;: &quot;Kindly check your email to reset your password.&quot;,rn                    },rn                )rnrn            else:rnrn                return templates.TemplateResponse(rn                    &quot;passwordReset.html&quot;,rn                    {rn                        &quot;request&quot;: request,rn                        &quot;message&quot;: &quot;Unfortunately, we ran into an error while trying to reset your password. Kindly try again, and if the issue persists, please contact support.&quot;,rn                    },rn                )rnrn    # If no match was found, return an error messagern    return templates.TemplateResponse(rn        &quot;passwordReset.html&quot;,rn        {rn            &quot;request&quot;: request,rn            &quot;message&quot;: &quot;Unfortunately, we do not have a record of your email. Kindly reach out to the site administrator.&quot;,rn        },rn    )rnrnasync def send_password_reset_email(username, email_address, reset_link):rnrn    API_KEY = os.getenv(&quot;API_KEY&quot;)  # Fetch API key from environmentrnrn    if not API_KEY:rn        print(&quot;Error: API_KEY is not set!&quot;)rn        return {&quot;success&quot;: False, &quot;error&quot;: &quot;API key is missing&quot;}rnrn    try:rn        response = requests.post(rn            &quot;https:\/\/api.mailgun.net\/v3\/&lt;SANDBOX_URL&gt;\/messages&quot;,rn            auth=(&quot;api&quot;, API_KEY),rn            data={rn                &quot;from&quot;: &quot;Mailgun Sandbox &lt;postmaster@&lt;SANDBOX_URL&gt;&gt;&quot;,rn                &quot;to&quot;: f&quot;{username} &lt;{email_address}&gt;&quot;,rn                &quot;subject&quot;: f&quot;Hello {username}&quot;,rn                &quot;template&quot;: &quot;&lt;EMAIL_TEMPLATE_NAME&gt;&quot;,rn                &quot;h:X-Mailgun-Variables&quot;: json.dumps(rn                    {&quot;reset_link&quot;: reset_link, &quot;username&quot;: username}rn                ),rn            },rn        )rnrn        if response.status_code == 200:rn            print(f&quot;Password reset email sent successfully to {email_address}&quot;)rn            return {&quot;success&quot;: True, &quot;message&quot;: &quot;Email sent successfully&quot;}rn        else:rn            print(rn                f&quot;Failed to send email. Status Code: {response.status_code}, Response: {response.text}&quot;rn            )rn            return {&quot;success&quot;: False, &quot;error&quot;: response.text}rnrn    except requests.exceptions.RequestException as e:rn        print(f&quot;Request failed: {str(e)}&quot;)rn        return {&quot;success&quot;: False, &quot;error&quot;: str(e)}rnrnasync def generate_password_reset_link(rn    email_address, base_url=&quot;https:\/\/mailgunny.com\/reset-password&quot;rn):rn    token = uuid.uuid4()rn    encoded_email = urllib.parse.quote(email_address)rn    return f&quot;{base_url}?email={encoded_email}&amp;token={token}&quot;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\">Dans ce code, la fonction <code>reset_password<\/code> (<code>@app.post(\"\/resetPassword\/\")<\/code>) traite les requ\u00eates de r\u00e9initialisation de mot de passe en v\u00e9rifiant si l&#8217;email soumis existe dans la base de donn\u00e9es <code>users.json<\/code>. S&rsquo;il est trouv\u00e9, elle g\u00e9n\u00e8re un lien de r\u00e9initialisation unique \u00e0 l&rsquo;aide de <code>generate_password_reset_link(email_address) <\/code>et envoie l&#8217;email de r\u00e9initialisation via <code>send_password_reset_email(username, email_address, reset_link)<\/code>. La fonction renvoie ensuite un message de r\u00e9ussite si l&#8217;email a \u00e9t\u00e9 envoy\u00e9, ou affiche un message d&rsquo;erreur dans le cas contraire. Si aucun email correspondant n&rsquo;est trouv\u00e9, une r\u00e9ponse d&rsquo;erreur appropri\u00e9e est fournie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Remarque\u00a0:<\/b> Remplacez la variable <code>API_KEY<\/code> par la cl\u00e9 de votre compte Mailgun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour tester l&rsquo;impl\u00e9mentation, ex\u00e9cutez <code>uvicorn main:app<\/code> &#8211;reload et ouvrez <a href=\"http:\/\/localhost:8000\/login\" target=\"_tabs\" rel=\"noopener noreferrer\">http:\/\/localhost:8000\/login<\/a>. Cliquez sur le lien <b>Mot de passe oubli\u00e9\u00a0?<\/b> \u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4013\" width=\"1538\" height=\"628\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/14.png\" alt=\"Forgot Password Link Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/14.png 1538w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/14-300x122.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/14-768x314.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/14-1024x418.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/14-1536x627.png 1536w\" sizes=\"(max-width: 1538px) 100vw, 1538px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Saisissez un email pr\u00e9sent dans votre fichier <code>users.json<\/code> et cliquez sur <b>R\u00e9initialiser le mot de passe<\/b>\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4017\" width=\"1538\" height=\"628\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/15.png\" alt=\"Forgot Password Reset Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/15.png 1538w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/15-300x122.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/15-768x314.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/15-1024x418.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/15-1536x627.png 1536w\" sizes=\"(max-width: 1538px) 100vw, 1538px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">En cas de succ\u00e8s, vous devriez \u00eatre redirig\u00e9 vers la page de connexion, o\u00f9 vous recevrez des instructions pour v\u00e9rifier vos emails. Vous devriez voir l&#8217;email suivant dans la bo\u00eete de r\u00e9ception du destinataire\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4022\" width=\"1544\" height=\"906\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/16.png\" alt=\"Reset Password Request Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/16.png 1544w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/16-300x176.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/16-768x451.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/16-1024x601.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/16-1536x901.png 1536w\" sizes=\"(max-width: 1544px) 100vw, 1544px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><b>Int\u00e9gration avec les \u00e9v\u00e9nements de l&rsquo;application<\/b><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">S&rsquo;int\u00e9grer aux \u00e9v\u00e9nements de l&rsquo;application \u00e0 l&rsquo;aide de <a href=\"https:\/\/hookdeck.com\/webhooks\/guides\/what-are-webhooks-how-they-work\" target=\"_tabs\" rel=\"noopener noreferrer\">webhooks<\/a> permet \u00e0 votre syst\u00e8me de r\u00e9pondre automatiquement aux mises \u00e0 jour en temps r\u00e9el provenant de services externes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un webhook est essentiellement un <a href=\"https:\/\/www.adjust.com\/glossary\/callback\/\" target=\"_tabs\" rel=\"noopener noreferrer\">rappel HTTP<\/a>. Chaque fois qu&rsquo;un \u00e9v\u00e9nement sp\u00e9cifique se produit dans une application externe (comme une confirmation de paiement, une inscription d&rsquo;utilisateur ou une demande de r\u00e9initialisation de mot de passe), le service envoie une requ\u00eate \u00e0 l&rsquo;URL de votre webhook pr\u00e9d\u00e9finie. Cela permet une automatisation fluide, r\u00e9duisant ainsi le besoin d&rsquo;intervention manuelle ou d&rsquo;interrogations p\u00e9riodiques. En configurant votre application pour qu&rsquo;elle \u00e9coute ces \u00e9v\u00e9nements de webhook, vous pouvez d\u00e9clencher des actions pertinentes, telles que la mise \u00e0 jour d&rsquo;une base de donn\u00e9es, l&rsquo;envoi de notifications ou le traitement de transactions, d\u00e8s que l&rsquo;\u00e9v\u00e9nement se produit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour int\u00e9grer des webhooks avec Mailgun, vous devez cr\u00e9er un point de terminaison. Pour ce faire, ouvrez le fichier main.py et collez le code suivant \u00e0 la fin\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                                    @app.post(&quot;\/webhooks\/password-reset&quot;)rnasync def handle_webhook(request: Request):rn    data = await request.json()rn    print(f&quot;Password reset email clicked: {data}&quot;)rn    return {&quot;status&quot;: &quot;received&quot;, &quot;status_code&quot;: 200}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\">Retournez sur le tableau de bord et acc\u00e9dez \u00e0 <b>Envoi &gt; Envoi &gt; Webhooks<\/b>\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4029\" width=\"1546\" height=\"692\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/17.png\" alt=\"Add Webhooks Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/17.png 1546w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/17-300x134.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/17-768x344.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/17-1024x458.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/17-1536x688.png 1536w\" sizes=\"(max-width: 1546px) 100vw, 1546px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Cliquez sur <b>Ajouter un webhook<\/b> dans le coin sup\u00e9rieur droit. Dans la liste d\u00e9roulante des types d&rsquo;\u00e9v\u00e9nements, s\u00e9lectionnez <b>Messages remis<\/b>, et dans le champ <b>URL<\/b>, saisissez la route vers l&rsquo;URL de votre webhook. Dans ce cas, c&rsquo;est https:\/\/\/webhooks\/password-reset. Une fois que vous avez termin\u00e9, cliquez sur <b>Cr\u00e9er un webhook<\/b>\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4031\" width=\"1538\" height=\"682\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/18.png\" alt=\"New Webhook Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/18.png 1538w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/18-300x133.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/18-768x341.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/18-1024x454.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/18-1536x681.png 1536w\" sizes=\"(max-width: 1538px) 100vw, 1538px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Testez le webhook. Votre r\u00e9sultat devrait ressembler \u00e0 ceci\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4032\" width=\"1554\" height=\"1064\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/19.png\" alt=\"Test webhook Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/19.png 1554w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/19-300x205.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/19-768x526.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/19-1024x701.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/19-1536x1052.png 1536w\" sizes=\"(max-width: 1554px) 100vw, 1554px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">C\u00f4t\u00e9 serveur, vous devriez obtenir le message suivant\u00a0:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Password reset email clicked: {'signature': {'token': '41929b08bb287b8a0b157f7834844b6bc483b7b090692a2b15', 'timestamp': '1739785355', 'signature': '117f70dcf985c72df30c07b02898dd458d1cbbad29d0457ccee8c4497f89c5ac'}, 'event-data': {'id': 'CPgfbmQMTCKtHW6uIWtuVe', 'timestamp': 1521472262.908181, 'log-level': 'info', 'event': 'delivered', 'delivery-status': {'tls': True, 'mx-host': 'smtp-in.example.com', 'code': 250, 'description': '', 'session-seconds': 0.4331989288330078, 'utf8': True, 'attempt-no': 1, 'message': 'OK', 'certificate-verified': True}, 'flags': {'is-routed': False, 'is-authenticated': True, 'is-system-test': False, 'is-test-mode': False}, 'envelope': {'transport': 'smtp', 'sender': 'bob@sandbox9199067bcb654265aae9ce9e308b6150.mailgun.org', 'sending-ip': '209.61.154.250', 'targets': 'alice@example.com'}, 'message': {'headers': {'to': 'Alice ', 'message-id': '20130503182626.18666.16540@sandbox9199067bcb654265aae9ce9e308b6150.mailgun.org', 'from': 'Bob ', 'subject': 'Test delivered webhook'}, 'attachments': [], 'size': 111}, 'recipient': 'alice@example.com', 'recipient-domain': 'example.com', 'storage': {'url': 'https:\/\/se.api.mailgun.net\/v3\/domains\/sandbox9199067bcb654265aae9ce9e308b6150.mailgun.org\/messages\/message_key', 'key': 'message_key'}, 'campaigns': [], 'tags': ['my_tag_1', 'my_tag_2'], 'user-variables': {'my_var_1': 'Mailgun Variable #1', 'my-var-2': 'awesome'}}}<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cela peut changer en fonction de l&#8217;email envoy\u00e9.<\/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\"><a href=\"https:\/\/drucker.institute\/about-peter-drucker\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Peter Drucker<\/a>, c\u00e9l\u00e8bre consultant en management, a dit un jour\u00a0:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ce qui ne se mesure pas ne s&rsquo;am\u00e9liore pas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans cette optique, Mailgun propose des outils pour v\u00e9rifier les performances des emails envoy\u00e9s. Par exemple, la page <b>Envoi &gt; Envoi &gt; Statistiques<\/b> permet de mesurer le pourcentage d&#8217;emails remis, ouverts et cliqu\u00e9s\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4035\" width=\"1540\" height=\"696\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/20.png\" alt=\"Analytics Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/20.png 1540w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/20-300x136.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/20-768x347.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/20-1024x463.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/20-1536x694.png 1536w\" sizes=\"(max-width: 1540px) 100vw, 1540px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Sur la page <b>Envoi &gt; Rapports &gt; Statistiques<\/b>, vous pouvez obtenir des informations d\u00e9taill\u00e9es sur les performances de vos emails\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4038\" width=\"1550\" height=\"428\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/21.png\" alt=\"Metrics image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/21.png 1550w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/21-300x83.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/21-768x212.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/21-1024x283.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/21-1536x424.png 1536w\" sizes=\"(max-width: 1550px) 100vw, 1550px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Vous pouvez \u00e9galement choisir les statistiques que vous souhaitez consulter sur une p\u00e9riode donn\u00e9e\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4040\" width=\"1554\" height=\"802\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/22.png\" alt=\"Customized Metrics Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/22.png 1554w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/22-300x155.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/22-768x396.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/22-1024x528.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/22-1536x793.png 1536w\" sizes=\"(max-width: 1554px) 100vw, 1554px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Mailgun met \u00e9galement des journaux \u00e0 votre disposition au cas o\u00f9 vous souhaiteriez approfondir les \u00e9v\u00e9nements de remise et enqu\u00eater sur les \u00e9checs lorsqu&rsquo;ils se produisent\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4041\" width=\"1554\" height=\"430\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/23.png\" alt=\"Logs Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/23.png 1554w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/23-300x83.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/23-768x213.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/23-1024x283.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/23-1536x425.png 1536w\" sizes=\"(max-width: 1554px) 100vw, 1554px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Enfin, Mailgun propose une classification des rebonds pour voir combien de vos emails n&rsquo;ont pas abouti. Cela vous permet \u00e9galement de savoir combien de ces rebonds sont critiques\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4043\" width=\"1550\" height=\"462\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/24.png\" alt=\"Bounce Classification Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/24.png 1550w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/24-300x89.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/24-768x229.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/24-1024x305.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/24-1536x458.png 1536w\" sizes=\"(max-width: 1550px) 100vw, 1550px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dans ce tutoriel, vous avez appris \u00e0 cr\u00e9er un flux de travail d&#8217;emails transactionnels complet pour les r\u00e9initialisations de mot de passe avec l&rsquo;API de Mailgun. Apr\u00e8s avoir configur\u00e9 un compte Mailgun et obtenu une cl\u00e9 API, vous avez cr\u00e9\u00e9 une interface d&rsquo;application \u00e0 l&rsquo;aide de FastAPI. Vous avez ensuite con\u00e7u et configur\u00e9 un mod\u00e8le d&#8217;email, impl\u00e9ment\u00e9 la fonctionnalit\u00e9 d&rsquo;envoi d&#8217;emails et int\u00e9gr\u00e9 des webhooks pour le suivi des \u00e9v\u00e9nements en temps r\u00e9el.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Les op\u00e9rations d&#8217;emails transactionnels sont essentielles pour offrir une exp\u00e9rience utilisateur fluide et s\u00e9curis\u00e9e, en particulier pour les r\u00e9initialisations de mot de passe. <u>Mailgun<\/u> peut vous aider \u00e0 automatiser ce processus, am\u00e9liorant ainsi la s\u00e9curit\u00e9 et la productivit\u00e9 tout en \u00e9liminant les interventions manuelles. La mise en \u0153uvre de cette approche dans vos projets augmentera non seulement la satisfaction de la client\u00e8le, mais contribuera \u00e9galement \u00e0 maintenir un syst\u00e8me d&rsquo;authentification fiable.<\/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_bffe4d39c512662211d8383ce937a3b9\">\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_bffe4d39c512662211d8383ce937a3b9\">\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>Vous avez des difficult\u00e9s \u00e0 envoyer des emails de r\u00e9initialisation de mot de passe s\u00e9curis\u00e9s\u00a0? Ce guide pratique vous accompagne dans la cr\u00e9ation d&rsquo;un flux de travail d&#8217;emails fiable et automatis\u00e9 \u00e0 l&rsquo;aide de l&rsquo;API de Mailgun et de FastAPI.\u2026<\/p>\n","protected":false},"author":9,"featured_media":3952,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[19],"class_list":["post-20019","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>Apprendre \u00e0 cr\u00e9er un flux de travail d&#039;emails de r\u00e9initialisation de mot de passe avec l&#039;API de Mailgun - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Apprenez \u00e0 cr\u00e9er un flux de travail d&#039;emails transactionnels pour les r\u00e9initialisations de mot de passe \u00e0 l&#039;aide de l&#039;API de Mailgun et de FastAPI pour simplifier l&#039;authentification et am\u00e9liorer votre exp\u00e9rience utilisateur.\" \/>\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-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Apprendre \u00e0 cr\u00e9er un flux de travail d&#039;emails de r\u00e9initialisation de mot de passe avec l&#039;API de Mailgun - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Apprenez \u00e0 cr\u00e9er un flux de travail d&#039;emails transactionnels pour les r\u00e9initialisations de mot de passe \u00e0 l&#039;aide de l&#039;API de Mailgun et de FastAPI pour simplifier l&#039;authentification et am\u00e9liorer votre exp\u00e9rience utilisateur.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-14T21:18:09+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=\"12 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-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/comment-creer-flux-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\\\/\",\"name\":\"Apprendre \u00e0 cr\u00e9er un flux de travail d'emails de r\u00e9initialisation de mot de passe 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-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/comment-creer-flux-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"datePublished\":\"2026-09-14T21:18:08+00:00\",\"dateModified\":\"2026-09-14T21:18:09+00:00\",\"description\":\"Apprenez \u00e0 cr\u00e9er un flux de travail d'emails transactionnels pour les r\u00e9initialisations de mot de passe \u00e0 l'aide de l'API de Mailgun et de FastAPI pour simplifier l'authentification et am\u00e9liorer votre exp\u00e9rience utilisateur.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/comment-creer-flux-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/comment-creer-flux-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/dev-life\\\/comment-creer-flux-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\\\/#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-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\\\/#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 r\u00e9initialisations de mot de passe 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":"Apprendre \u00e0 cr\u00e9er un flux de travail d'emails de r\u00e9initialisation de mot de passe avec l'API de Mailgun - Transactional Email API Service For Developers | Mailgun","description":"Apprenez \u00e0 cr\u00e9er un flux de travail d'emails transactionnels pour les r\u00e9initialisations de mot de passe \u00e0 l'aide de l'API de Mailgun et de FastAPI pour simplifier l'authentification et am\u00e9liorer votre exp\u00e9rience utilisateur.","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-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\/","og_locale":"fr_FR","og_type":"article","og_title":"Apprendre \u00e0 cr\u00e9er un flux de travail d'emails de r\u00e9initialisation de mot de passe avec l'API de Mailgun - Transactional Email API Service For Developers | Mailgun","og_description":"Apprenez \u00e0 cr\u00e9er un flux de travail d'emails transactionnels pour les r\u00e9initialisations de mot de passe \u00e0 l'aide de l'API de Mailgun et de FastAPI pour simplifier l'authentification et am\u00e9liorer votre exp\u00e9rience utilisateur.","og_url":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","article_modified_time":"2026-09-14T21:18:09+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":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\/","url":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\/","name":"Apprendre \u00e0 cr\u00e9er un flux de travail d'emails de r\u00e9initialisation de mot de passe 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-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","datePublished":"2026-09-14T21:18:08+00:00","dateModified":"2026-09-14T21:18:09+00:00","description":"Apprenez \u00e0 cr\u00e9er un flux de travail d'emails transactionnels pour les r\u00e9initialisations de mot de passe \u00e0 l'aide de l'API de Mailgun et de FastAPI pour simplifier l'authentification et am\u00e9liorer votre exp\u00e9rience utilisateur.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mailgun.com\/fr\/blog\/dev-life\/comment-creer-flux-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\/#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-de-travail-emails-transactionnels-reinitialisation-mot-de-passe\/#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 r\u00e9initialisations de mot de passe 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\/20019","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\/9"}],"version-history":[{"count":1,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog\/20019\/revisions"}],"predecessor-version":[{"id":20020,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog\/20019\/revisions\/20020"}],"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=20019"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog_category?post=20019"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}