{"id":20109,"date":"2026-09-14T22:07:11","date_gmt":"2026-09-14T22:07:11","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\/"},"modified":"2026-09-14T22:07:12","modified_gmt":"2026-09-14T22:07:12","slug":"como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\/","title":{"rendered":"Como criar fluxos de trabalho de e-mail transacional para redefinir senhas com a API do Mailgun"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/mailchimp.com\/marketing-glossary\/transactional-email\/\" target=\"_tabs\" rel=\"noopener noreferrer\">E-mails transacionais<\/a> s\u00e3o e-mails automatizados acionados por a\u00e7\u00f5es do usu\u00e1rio em um site, aplicativo ou servi\u00e7o. Ao contr\u00e1rio dos <a href=\"https:\/\/www.brevo.com\/blog\/what-is-email-marketing\/\" target=\"_tabs\" rel=\"noopener noreferrer\">e-mails de marketing<\/a>, que promovem produtos ou servi\u00e7os, os e-mails transacionais fornecem informa\u00e7\u00f5es essenciais, muitas vezes em tempo real.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Os fluxos de trabalho de e-mail transacional v\u00e3o al\u00e9m, automatizando uma sequ\u00eancia de e-mails com base nas a\u00e7\u00f5es do usu\u00e1rio para garantir uma comunica\u00e7\u00e3o pontual e uma experi\u00eancia do usu\u00e1rio tranquila. As empresas contam com servi\u00e7os como <a href=\"https:\/\/www.mailgun.com\/pt\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Mailgun<\/a> para e-mails transacionais porque s\u00e3o r\u00e1pidos, relevantes e acionados por a\u00e7\u00f5es imediatas do usu\u00e1rio. Por exemplo, o fluxo de trabalho permite que o usu\u00e1rio possa redefinir sua senha rapidamente e recuperar o acesso \u00e0 sua conta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Neste tutorial, voc\u00ea aprender\u00e1 como criar um fluxo de trabalho de e-mail transacional para redefinir senhas com a API do 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-4219\"><p class=\"h5 m-0\" id=\"toc-title-4219\">\u00cdndice<\/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=\"#configurando-uma-conta-do-mailgun\">Configurando uma conta do 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=\"#como-obter-uma-chave-de-api\">Como obter uma chave de 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=\"#criando-a-interface-do-aplicativo-usando-fastapi\">Criando a interface do aplicativo usando 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=\"#configurando-uma-conexao-com-o-mailgun\">Configurando uma conex\u00e3o com o 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=\"#como-criar-e-configurar-o-modelo-de-e-mail\">Como criar e configurar o modelo de e-mail<\/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=\"#implementando-a-funcionalidade-de-envio-de-e-mail\">Implementando a funcionalidade de envio de e-mail<\/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=\"#integrando-com-eventos-do-aplicativo\">Integrando com eventos do aplicativo<\/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=\"#monitorando-e-gerenciando-e-mails\">Monitorando e gerenciando e-mails<\/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=\"#conclusao\">Conclus\u00e3o<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Configurando uma conta do Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Se voc\u00ea ainda n\u00e3o tem uma conta no Mailgun, a primeira coisa que precisa fazer \u00e9 <a href=\"https:\/\/signup.mailgun.com\/new\/signup\" target=\"_tabs\" rel=\"noopener noreferrer\">criar uma<\/a>. N\u00e3o se esque\u00e7a de checar o e-mail associado \u00e0 sua conta no Mailgun e verific\u00e1-la:<\/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\">Em seguida, insira seu n\u00famero de telefone e o c\u00f3digo de autoriza\u00e7\u00e3o fornecido para ativar sua conta:<\/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\">Assim que sua conta no Mailgun estiver configurada, \u00e9 hora de obter uma chave de API para come\u00e7ar a usar o servi\u00e7o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Como obter uma chave de API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para que seu aplicativo interaja com os servi\u00e7os do Mailgun, ele precisa ser autenticado por meio de uma chave de API. Para obter sua chave de API, acesse o painel do Mailgun e selecione <b>\u201cCome\u00e7ar\u201d<\/b> \u00e0 esquerda para visualizar um <b>\u201cGuia de introdu\u00e7\u00e3o\u201d<\/b>:<\/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\">Clique no bot\u00e3o <b>\u201cCome\u00e7ar\u201d<\/b> abaixo de <b>\u201cCriar uma chave de API\u201d<\/b>. Depois, forne\u00e7a uma descri\u00e7\u00e3o que explique corretamente o prop\u00f3sito da chave de API. Por exemplo, se a chave de API for para processos de autentica\u00e7\u00e3o de usu\u00e1rios, voc\u00ea pode cham\u00e1-la de algo como user_authentication e clicar em <b>\u201cCriar chave\u201d<\/b>:<\/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\">N\u00e3o se esque\u00e7a de copiar e guardar essa chave em um local seguro, pois esta \u00e9 a \u00fanica vez que ela ser\u00e1 exibida:<\/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\">Criando a interface do aplicativo usando FastAPI<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para criar a interface do aplicativo que impulsiona o fluxo de trabalho de e-mail, a primeira coisa a fazer \u00e9 instalar as bibliotecas necess\u00e1rias. Antes de fazer isso, crie um diret\u00f3rio de projeto executando <code>mkdir my_fastapi_app<\/code> e inicie um <a href=\"https:\/\/www.freecodecamp.org\/news\/how-to-setup-virtual-environments-in-python\/\" target=\"_tabs\" rel=\"noopener noreferrer\">ambiente virtual<\/a> no diret\u00f3rio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em seguida, instale as bibliotecas necess\u00e1rias com o seguinte comando:<\/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\">Aqui, voc\u00ea instala:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>fastapi<\/code>, que serve como o framework principal de backend<\/li>\n\n\n\n<li><code>jinja2<\/code>, que serve seus modelos de frontend<\/li>\n\n\n\n<li><code>requests<\/code>, que envia requisi\u00e7\u00f5es HTTP para a API do Mailgun<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Embora o FastAPI seja principalmente para a cria\u00e7\u00e3o de APIs, a adi\u00e7\u00e3o da biblioteca <code>jinja2<\/code> permite o desenvolvimento full-stack, mas requer uma configura\u00e7\u00e3o de diret\u00f3rio adequada. A estrutura do seu projeto deve seguir este formato:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>my_fastapi_app\/<br>\n\u2502\u2500\u2500 main.py # Arquivo principal do aplicativo FastAPI<br>\n\u2502\u2500\u2500 users.json # Arquivo JSON que armazena dados do usu\u00e1rio<br>\n\u2502\u2500\u2500 templates\/ # Pasta de modelos HTML<br>\n\u2502 \u251c\u2500\u2500 login.html # P\u00e1gina de login<br>\n\u2502 \u251c\u2500\u2500 home.html # P\u00e1gina inicial<br>\n\u2502 \u251c\u2500\u2500 passwordReset.html # P\u00e1gina para redefinir senha<br>\n\u2502\u2500\u2500 static\/ # Pasta de arquivos est\u00e1ticos<br>\n\u2502 \u251c\u2500\u2500 styles.css # Estilos para os arquivos login.html e passwordReset.html<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voc\u00ea pode encontrar todo o c\u00f3digo para este tutorial no <a href=\"https:\/\/github.com\/EphraimX\/building-transactional-email-workflows-for-password-resets-with-mailgun-api\" target=\"_tabs\" rel=\"noopener noreferrer\">este reposit\u00f3rio do GitHub<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Com a estrutura do seu projeto em vigor, voc\u00ea pode copiar e colar o c\u00f3digo nos respectivos arquivos ou clonar o reposit\u00f3rio do GitHub acima com o seguinte comando:<\/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\">Vamos dar uma olhada na primeira se\u00e7\u00e3o do arquivo main.py. Este arquivo \u00e9 onde toda a m\u00e1gica acontece, pois conecta as opera\u00e7\u00f5es de frontend e backend:<\/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=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\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\">Neste c\u00f3digo, o aplicativo lida com a autentica\u00e7\u00e3o servindo p\u00e1ginas de login e para redefinir senhas enquanto verifica as credenciais em <code>users.json<\/code>. O aplicativo inicializa o FastAPI, configura os modelos e define um modelo loginData para valida\u00e7\u00e3o. As rotas <code>\/login <\/code> e <code>\/passwordResetView\/ <\/code> servem suas respectivas p\u00e1ginas, enquanto a \/home verifica as credenciais, redirecionando usu\u00e1rios v\u00e1lidos ou exibindo erros. A fun\u00e7\u00e3o para redefinir a senha gera um link exclusivo usando o uuid e o envia pela API do Mailgun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para testar isso, abra seu banco de dados improvisado (<code>users.json<\/code>) e cole o seguinte:<\/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=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\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\">Voc\u00ea tamb\u00e9m deve <a href=\"https:\/\/help.mailgun.com\/hc\/en-us\/articles\/217531258-Authorized-Recipients\" target=\"_tabs\" rel=\"noopener noreferrer\">autorizar<\/a> esses endere\u00e7os de e-mail pelo painel do Mailgun se voc\u00ea estiver usando um dom\u00ednio de sandbox.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inicie seu aplicativo executando o comando uvicorn main:app &#8211;reload. Depois, acesse <a href=\"http:\/\/localhost:8000\/login\" target=\"_tabs\" rel=\"noopener noreferrer\">http:\/\/localhost:8000\/login<\/a>, onde voc\u00ea dever\u00e1 ver isto:<\/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\">Se voc\u00ea tentar fazer login com alguma das credenciais no arquivo users.json, voc\u00ea ser\u00e1 levado para a p\u00e1gina inicial:<\/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\">Se voc\u00ea inserir as informa\u00e7\u00f5es de login incorretas, ver\u00e1 o seguinte:<\/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\">Configurando uma conex\u00e3o com o Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para enviar e-mails usando o Mailgun, voc\u00ea precisa estabelecer uma conex\u00e3o entre seu aplicativo e o servi\u00e7o de e-mail do Mailgun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para fazer isso, abra o main.py e cole o c\u00f3digo a seguir, substituindo <code><\/code>, <code><\/code> e  por valores v\u00e1lidos:<\/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=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\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\">Para fins de teste, passe sua chave de API diretamente ao chamar a fun\u00e7\u00e3o:<\/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\">Execute o script com o seguinte comando:<\/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\">Se for bem-sucedida, a fun\u00e7\u00e3o imprimir\u00e1 uma resposta semelhante a esta:<\/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\">Isso confirma que a requisi\u00e7\u00e3o de e-mail foi adicionada \u00e0 fila com sucesso pelo Mailgun.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Como criar e configurar o modelo de e-mail<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para trabalhar na l\u00f3gica de redefinir a senha, voc\u00ea precisa criar o modelo para o e-mail que \u00e9 enviado ao usu\u00e1rio. Com o Mailgun, h\u00e1 duas maneiras de criar um e-mail: HTML ou o construtor de modelos de arrastar e soltar do Mailgun. Voc\u00ea usar\u00e1 a abordagem HTML aqui.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para iniciar a cria\u00e7\u00e3o, acesse seu painel do Mailgun e navegue at\u00e9 <b>\u201cEnviar\u201d &gt; \u201cEnvio\u201d &gt; \u201cModelos\u201d<\/b>:<\/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\">Em seguida, clique em <b>\u201cCriar modelo de mensagem\u201d<\/b>, selecione a op\u00e7\u00e3o para program\u00e1-lo em HTML e clique no modelo <b>\u201cEm branco\u201d<\/b>:<\/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\">Preencha o formul\u00e1rio do modelo com o nome, a descri\u00e7\u00e3o e os detalhes do e-mail:<\/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\">Depois, role a p\u00e1gina at\u00e9 a guia <b>\u201cEditor\u201d<\/b> e copie e cole o c\u00f3digo do <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> arquivo:<\/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\">Ao selecionar a guia <b>\u201cDados de teste\u201d<\/b>, voc\u00ea ver\u00e1 duas vari\u00e1veis din\u00e2micas: <code>username<\/code> e <code>reset_link<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Selecione a guia <b>\u201cPr\u00e9-visualiza\u00e7\u00e3o\u201d<\/b> para ver o modelo:<\/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\">Por fim, clique no bot\u00e3o <b>\u201cCriar\u201d<\/b> para cri\u00e1-lo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Implementando a funcionalidade de envio de e-mail<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Assim que seu modelo de e-mail estiver pronto, \u00e9 hora de desenvolver a funcionalidade de envio de e-mails. Abra o arquivo <code>main.py<\/code> e cole o c\u00f3digo a seguir:<\/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=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\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\">Neste c\u00f3digo, a fun\u00e7\u00e3o <code>reset_password<\/code> (<code>@app.post(\"\/resetPassword\/\")<\/code>) processa as solicita\u00e7\u00f5es para redefinir a senha, verificando se o e-mail enviado existe no banco de dados <code>users.json<\/code>. Se encontrado, ela gera um link de redefini\u00e7\u00e3o exclusivo usando <code>generate_password_reset_link(email_address) <\/code> e envia o e-mail de redefini\u00e7\u00e3o por meio da <code>send_password_reset_email(username, email_address, reset_link)<\/code>. A fun\u00e7\u00e3o ent\u00e3o retorna uma mensagem de sucesso se o e-mail foi enviado ou exibe uma mensagem de erro caso contr\u00e1rio. Se nenhum e-mail correspondente for encontrado, uma resposta de erro apropriada \u00e9 fornecida.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Nota:<\/b> substitua a vari\u00e1vel <code>API_KEY<\/code> pela chave da sua conta no Mailgun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para testar a implementa\u00e7\u00e3o, execute <code>uvicorn main:app<\/code> &#8211;reload e abra <a href=\"http:\/\/localhost:8000\/login\" target=\"_tabs\" rel=\"noopener noreferrer\">http:\/\/localhost:8000\/login<\/a>. Clique em <b>\u201cEsqueceu a senha?\u201d<\/b> link:<\/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\">Insira um e-mail presente no seu arquivo <code>users.json<\/code> e clique em <b>\u201cRedefinir senha\u201d<\/b>:<\/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\">Se for bem-sucedido, voc\u00ea dever\u00e1 ser direcionado de volta para a p\u00e1gina de login, onde receber\u00e1 instru\u00e7\u00f5es para verificar seu e-mail. Voc\u00ea dever\u00e1 ver o seguinte e-mail na caixa de entrada de e-mail do destinat\u00e1rio:<\/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>Integrando com eventos do aplicativo<\/b><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Integrando com eventos do aplicativo usando <a href=\"https:\/\/hookdeck.com\/webhooks\/guides\/what-are-webhooks-how-they-work\" target=\"_tabs\" rel=\"noopener noreferrer\">webhooks<\/a> permite que seu sistema responda automaticamente a atualiza\u00e7\u00f5es em tempo real de servi\u00e7os externos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um webhook \u00e9 essencialmente um HTTP <a href=\"https:\/\/www.adjust.com\/glossary\/callback\/\" target=\"_tabs\" rel=\"noopener noreferrer\">callback<\/a>. Sempre que ocorre um evento espec\u00edfico em um aplicativo externo (como uma confirma\u00e7\u00e3o de pagamento, inscri\u00e7\u00e3o do usu\u00e1rio ou solicita\u00e7\u00e3o para redefinir a senha), o servi\u00e7o envia uma requisi\u00e7\u00e3o para a sua URL do webhook predefinida. Isso possibilita uma automa\u00e7\u00e3o perfeita, reduzindo a necessidade de interven\u00e7\u00e3o manual ou de consultas peri\u00f3dicas. Ao configurar seu aplicativo para escutar esses eventos de webhook, voc\u00ea pode acionar a\u00e7\u00f5es relevantes, como atualizar um banco de dados, enviar notifica\u00e7\u00f5es ou processar transa\u00e7\u00f5es, assim que o evento acontecer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para integrar webhooks com o Mailgun, voc\u00ea precisa criar um endpoint. Para fazer isso, abra o arquivo main.py e cole o seguinte c\u00f3digo no final:<\/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=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\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\">Volte para o painel e acesse <b>\u201cEnviar\u201d &gt; \u201cEnvio\u201d &gt; \u201cWebhooks\u201d<\/b>:<\/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\">Clique em <b>\u201cAdicionar webhook\u201d<\/b> no canto superior direito. Na lista suspensa de tipos de evento, selecione <b>\u201cMensagens entregues\u201d<\/b> e, no campo <b>URL<\/b>, insira a rota para a sua URL do webhook. Nesse caso, \u00e9 https:\/\/\/webhooks\/password-reset. Quando terminar, clique em <b>\u201cCriar webhook\u201d<\/b>:<\/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\">Teste o webhook. O resultado dever\u00e1 ser semelhante a este:<\/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\">No lado do servidor, voc\u00ea dever\u00e1 receber a seguinte mensagem:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>E-mail para redefinir a senha clicado: {'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\">Isso pode mudar dependendo do e-mail que est\u00e1 sendo enviado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Monitorando e gerenciando e-mails<\/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>, um famoso consultor de gest\u00e3o, disse uma vez:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se voc\u00ea n\u00e3o pode medir, n\u00e3o pode melhorar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em sintonia com isso, o Mailgun fornece ferramentas para verificar o desempenho dos e-mails enviados. Por exemplo, a p\u00e1gina <b>\u201cEnviar\u201d &gt; \u201cEnvio\u201d &gt; \u201cAn\u00e1lises\u201d<\/b> ajuda a medir qual a porcentagem de e-mails que est\u00e3o sendo entregues, abertos e clicados:<\/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\">Na p\u00e1gina <b>\u201cEnviar\u201d &gt; \u201cRelat\u00f3rios\u201d &gt; \u201cM\u00e9tricas\u201d<\/b>, voc\u00ea pode obter informa\u00e7\u00f5es detalhadas sobre o desempenho dos seus e-mails:<\/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\">Voc\u00ea tamb\u00e9m pode escolher as m\u00e9tricas que deseja ver em um determinado per\u00edodo:<\/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\">O Mailgun tamb\u00e9m fornece logs caso voc\u00ea queira se aprofundar nos eventos entregues e investigar falhas quando elas ocorrerem:<\/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\">Por \u00faltimo, o Mailgun fornece uma classifica\u00e7\u00e3o de devolu\u00e7\u00e3o para ver quantos dos seus e-mails n\u00e3o foram entregues. Ele tamb\u00e9m informa quantas dessas devolu\u00e7\u00f5es s\u00e3o cr\u00edticas:<\/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\">Conclus\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Neste tutorial, voc\u00ea aprendeu como criar um fluxo de trabalho de e-mail transacional completo para redefinir senhas usando a API do Mailgun. Ap\u00f3s configurar uma conta no Mailgun e obter uma chave de API, voc\u00ea criou uma interface de aplicativo usando o FastAPI. Em seguida, voc\u00ea desenhou e configurou um modelo de e-mail, implementou a funcionalidade de envio de e-mail e integrou webhooks para o rastreamento de eventos em tempo real.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As opera\u00e7\u00f5es de e-mail transacional s\u00e3o essenciais para fornecer uma experi\u00eancia do usu\u00e1rio perfeita e segura, especialmente para redefinir senhas. O <u>Mailgun<\/u> pode ajud\u00e1-lo a automatizar esse processo, melhorando a seguran\u00e7a e a produtividade enquanto elimina a interven\u00e7\u00e3o manual. Implementar essa abordagem em seus projetos n\u00e3o apenas aumentar\u00e1 a satisfa\u00e7\u00e3o do cliente, mas tamb\u00e9m ajudar\u00e1 a manter um sistema de autentica\u00e7\u00e3o confi\u00e1vel.<\/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_8b070a2bf56352ea753ce7cb0baf8a0c\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                Cadastre-se            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_8b070a2bf56352ea753ce7cb0baf8a0c\">\r\n                \u00c9 f\u00e1cil come\u00e7ar. E \u00e9 gr\u00e1tis.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">Veja o que voc\u00ea pode alcan\u00e7ar com a melhor plataforma de entrega de e-mail do mundo.<\/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>Com dificuldades para enviar e-mails seguros para redefinir senhas? Este guia pr\u00e1tico mostra como criar um fluxo de trabalho de e-mail automatizado e confi\u00e1vel usando a API do Mailgun e o 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-20109","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>Aprenda a criar um fluxo de trabalho de e-mail para redefini\u00e7\u00e3o de senha usando a API do Mailgun - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Saiba como criar um fluxo de trabalho de e-mail transacional para redefini\u00e7\u00e3o de senha usando a API do Mailgun e o FastAPI para otimizar a autentica\u00e7\u00e3o e melhorar a experi\u00eancia do usu\u00e1rio.\" \/>\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\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Aprenda a criar um fluxo de trabalho de e-mail para redefini\u00e7\u00e3o de senha usando a API do Mailgun - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Saiba como criar um fluxo de trabalho de e-mail transacional para redefini\u00e7\u00e3o de senha usando a API do Mailgun e o FastAPI para otimizar a autentica\u00e7\u00e3o e melhorar a experi\u00eancia do usu\u00e1rio.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-14T22:07:12+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 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\\\/\",\"name\":\"Aprenda a criar um fluxo de trabalho de e-mail para redefini\u00e7\u00e3o de senha usando a API do Mailgun - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"datePublished\":\"2026-09-14T22:07:11+00:00\",\"dateModified\":\"2026-09-14T22:07:12+00:00\",\"description\":\"Saiba como criar um fluxo de trabalho de e-mail transacional para redefini\u00e7\u00e3o de senha usando a API do Mailgun e o FastAPI para otimizar a autentica\u00e7\u00e3o e melhorar a experi\u00eancia do usu\u00e1rio.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\\\/#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\\\/pt\\\/blog\\\/dev-life\\\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/inicio\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Como criar fluxos de trabalho de e-mail transacional para redefinir senhas com a API do Mailgun\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Poderosas APIs de e-mail transacional que permitem a voc\u00ea enviar, receber e rastrear e-mails, criadas com os desenvolvedores em mente. Saiba mais hoje mesmo!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#\\\/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\\\/pt\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Aprenda a criar um fluxo de trabalho de e-mail para redefini\u00e7\u00e3o de senha usando a API do Mailgun - Transactional Email API Service For Developers | Mailgun","description":"Saiba como criar um fluxo de trabalho de e-mail transacional para redefini\u00e7\u00e3o de senha usando a API do Mailgun e o FastAPI para otimizar a autentica\u00e7\u00e3o e melhorar a experi\u00eancia do usu\u00e1rio.","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\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\/","og_locale":"pt_BR","og_type":"article","og_title":"Aprenda a criar um fluxo de trabalho de e-mail para redefini\u00e7\u00e3o de senha usando a API do Mailgun - Transactional Email API Service For Developers | Mailgun","og_description":"Saiba como criar um fluxo de trabalho de e-mail transacional para redefini\u00e7\u00e3o de senha usando a API do Mailgun e o FastAPI para otimizar a autentica\u00e7\u00e3o e melhorar a experi\u00eancia do usu\u00e1rio.","og_url":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","article_modified_time":"2026-09-14T22:07:12+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 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\/","url":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\/","name":"Aprenda a criar um fluxo de trabalho de e-mail para redefini\u00e7\u00e3o de senha usando a API do Mailgun - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","datePublished":"2026-09-14T22:07:11+00:00","dateModified":"2026-09-14T22:07:12+00:00","description":"Saiba como criar um fluxo de trabalho de e-mail transacional para redefini\u00e7\u00e3o de senha usando a API do Mailgun e o FastAPI para otimizar a autentica\u00e7\u00e3o e melhorar a experi\u00eancia do usu\u00e1rio.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\/#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\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-redefinir-senhas\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/pt\/inicio\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/pt\/blog\/"},{"@type":"ListItem","position":3,"name":"Como criar fluxos de trabalho de e-mail transacional para redefinir senhas com a API do Mailgun"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/pt\/#website","url":"https:\/\/www.mailgun.com\/pt\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Poderosas APIs de e-mail transacional que permitem a voc\u00ea enviar, receber e rastrear e-mails, criadas com os desenvolvedores em mente. Saiba mais hoje mesmo!","publisher":{"@id":"https:\/\/www.mailgun.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/pt\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.mailgun.com\/pt\/#\/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\/pt\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/20109","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/users\/9"}],"version-history":[{"count":1,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/20109\/revisions"}],"predecessor-version":[{"id":20110,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/20109\/revisions\/20110"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/media\/3952"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/media?parent=20109"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog_category?post=20109"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}