{"id":19772,"date":"2025-06-11T00:00:00","date_gmt":"2025-06-11T00:00:00","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-notificacoes-de-envio\/"},"modified":"2026-09-14T15:10:04","modified_gmt":"2026-09-14T15:10:04","slug":"como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-notificacoes-de-envio","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-notificacoes-de-envio\/","title":{"rendered":"Criando fluxos de trabalho de e-mail transacional para notifica\u00e7\u00f5es de envio com a API do Mailgun"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Quando voc\u00ea faz um pedido on-line, espera saber exatamente onde ele est\u00e1 e quando chegar\u00e1. Os fluxos de trabalho de e-mail transacional ajudam a tornar poss\u00edvel esse tipo de comunica\u00e7\u00e3o oportuna.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Diferente dos e-mails de marketing que promovem produtos, os e-mails transacionais s\u00e3o enviados em resposta a uma a\u00e7\u00e3o do usu\u00e1rio, como fazer um pedido ou receber uma atualiza\u00e7\u00e3o de envio. Eles fornecem detalhes em tempo real que mant\u00eam os usu\u00e1rios informados em cada etapa do caminho.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Neste artigo, voc\u00ea aprender\u00e1 a criar um fluxo de trabalho de e-mail transacional para notifica\u00e7\u00f5es de envio usando <a href=\"https:\/\/documentation.mailgun.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\">a API do Mailgun<\/a>. O fluxo de trabalho incorporar\u00e1 o <a href=\"https:\/\/docs.bullmq.io\/\" target=\"_tabs\" rel=\"noopener noreferrer\">BullMQ<\/a>, um poderoso sistema de fila de tarefas, para enfileirar e processar notifica\u00e7\u00f5es de e-mail separadamente da l\u00f3gica principal do aplicativo e melhorar a escalabilidade e o desempenho. Isso \u00e9 \u00fatil para aplicativos de alto tr\u00e1fego, onde o envio de e-mails diretamente em um ciclo de solicita\u00e7\u00e3o-resposta poderia desacelerar o sistema.<\/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-5500\"><p class=\"h5 m-0\" id=\"toc-title-5500\">\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=\"#implementando-fluxos-de-trabalho-de-e-mail-transacional-para-notificacoes-de-envio-com-a-api-do-mailgun\">Implementando fluxos de trabalho de e-mail transacional para notifica\u00e7\u00f5es de envio com a API 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=\"#configuracao-da-conta-do-mailgun\">Configura\u00e7\u00e3o da conta do Mailgun<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">03<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#configuracao-do-modelo-inicial\">Configura\u00e7\u00e3o do modelo inicial<\/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=\"#instale-todas-as-dependencias-usando-o-seguinte-comando\">Instale todas as depend\u00eancias usando o seguinte comando:<\/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=\"#design-dos-modelos-de-e-mail\">Design dos modelos 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=\"#implementacao-da-funcionalidade-de-envio-de-e-mails\">Implementa\u00e7\u00e3o da funcionalidade de envio de e-mails<\/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=\"#testando-o-fluxo-de-trabalho\">Testando o fluxo de trabalho<\/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=\"#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\">10<\/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\">Implementando fluxos de trabalho de e-mail transacional para notifica\u00e7\u00f5es de envio com a API do Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para acompanhar, voc\u00ea precisa destas ferramentas e contas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Um <a href=\"https:\/\/signup.mailgun.com\/new\/signup\" target=\"_tabs\" rel=\"noopener noreferrer\">conta do Mailgun<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/nodejs.org\/en\/download\" target=\"_tabs\" rel=\"noopener noreferrer\">Node.js<\/a> e <a href=\"https:\/\/docs.docker.com\/engine\/install\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Docker<\/a> instalado em sua m\u00e1quina local<\/li>\n\n\n\n<li>Um editor de c\u00f3digo (este tutorial usa o <a href=\"https:\/\/code.visualstudio.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\">VS Code<\/a>) e um navegador web<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de mergulhar na implementa\u00e7\u00e3o, vamos dar uma olhada no fluxo de trabalho:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3943\" width=\"2252\" height=\"1078\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/1__3_.png\" alt=\"transactional email workflows diagram\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/1__3_.png 2252w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/1__3_-300x144.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/1__3_-768x368.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/1__3_-1024x490.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/1__3_-1536x735.png 1536w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/1__3_-2048x980.png 2048w\" sizes=\"(max-width: 2252px) 100vw, 2252px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Veja como o processo funciona:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A equipe de envio (ou qualquer pessoa respons\u00e1vel por gerenciar atualiza\u00e7\u00f5es de envio) envia uma solicita\u00e7\u00e3o HTTP para atualizar o status do pedido<\/li>\n\n\n\n<li>O servidor Express atualiza o status do pedido no banco de dados SQLite e coloca uma tarefa em fila no BullMQ<\/li>\n\n\n\n<li>Um worker do BullMQ processa tarefas da fila e interage com a API do Mailgun para enviar um e-mail ao cliente<\/li>\n\n\n\n<li>O worker tenta executar automaticamente as tarefas que falharam<\/li>\n\n\n\n<li>O Mailgun entrega o e-mail ao cliente<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Configura\u00e7\u00e3o da conta do Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para usar a API do Mailgun, voc\u00ea precisa de um dom\u00ednio do Mailgun e de uma chave de API para autentica\u00e7\u00e3o. O Mailgun fornece dois tipos de dom\u00ednios: <a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/domains\/#sandbox-domain\" target=\"_tabs\" rel=\"noopener noreferrer\">dom\u00ednios de sandbox<\/a> para testes e <a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/domains\/#custom-domains\" target=\"_tabs\" rel=\"noopener noreferrer\">dom\u00ednios personalizados<\/a> para uso em ambientes de produ\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Neste guia, voc\u00ea usar\u00e1 um dom\u00ednio de sandbox. Cada conta do Mailgun \u00e9 provisionada automaticamente com um, portanto voc\u00ea n\u00e3o precisa cri\u00e1-lo manualmente. Para obter seu dom\u00ednio de sandbox, fa\u00e7a login na sua conta do Mailgun, depois acesse <b>Send &gt; Sending &gt; Domains<\/b> na barra lateral. Copie seu dom\u00ednio:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3944\" width=\"2010\" height=\"1018\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/2__3_.png\" alt=\"Send &gt; Sending &gt; Domains Screen Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/2__3_.png 2010w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/2__3_-300x152.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/2__3_-768x389.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/2__3_-1024x519.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/2__3_-1536x778.png 1536w\" sizes=\"(max-width: 2010px) 100vw, 2010px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Por padr\u00e3o, um dom\u00ednio de sandbox s\u00f3 pode enviar e-mails para <a href=\"https:\/\/help.mailgun.com\/hc\/en-us\/articles\/217531258-Authorized-Recipients\" target=\"_tabs\" rel=\"noopener noreferrer\">destinat\u00e1rios autorizados<\/a>. Para configurar um e-mail como um destinat\u00e1rio autorizado, clique no nome do seu dom\u00ednio na p\u00e1gina <b>Domains<\/b> para ver suas configura\u00e7\u00f5es. Na aba \u201c<b>Setup<\/b>\u201d, em \u201c<b>Add authorized recipients<\/b>\u201d, adicione o endere\u00e7o de e-mail para o qual voc\u00ea deseja enviar e-mails. Certifique-se de seguir as instru\u00e7\u00f5es enviadas para o endere\u00e7o de e-mail fornecido para configur\u00e1-lo como um destinat\u00e1rio autorizado:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3947\" width=\"2006\" height=\"1012\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/3__3_.png\" alt=\"Add authorized recipients Screen Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/3__3_.png 2006w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/3__3_-300x151.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/3__3_-768x387.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/3__3_-1024x517.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/3__3_-1536x775.png 1536w\" sizes=\"(max-width: 2006px) 100vw, 2006px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Para obter sua chave de API, acesse a <a href=\"https:\/\/app.mailgun.com\/settings\/api_security\" target=\"_tabs\" rel=\"noopener noreferrer\">p\u00e1gina \u201c<b>API Keys<\/b>\u201d<\/a> e clique em \u201c<b>Add new key<\/b>\u201d para criar uma nova chave de API. D\u00ea um nome para a chave e clique em \u201c<b>Create Key<\/b>\u201d. Em seguida, certifique-se de copiar o valor da sua chave, pois ele ser\u00e1 exibido apenas uma vez:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3948\" width=\"2012\" height=\"1022\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/4__4_.png\" alt=\"API Keys page Screen Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/4__4_.png 2012w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/4__4_-300x152.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/4__4_-768x390.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/4__4_-1024x520.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/4__4_-1536x780.png 1536w\" sizes=\"(max-width: 2012px) 100vw, 2012px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Configura\u00e7\u00e3o do modelo inicial<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para manter este tutorial focado na cria\u00e7\u00e3o de fluxos de trabalho de e-mail transacional, preparamos um modelo inicial para voc\u00ea usar como base. Clone o modelo para a sua m\u00e1quina local executando o seguinte comando no seu terminal:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>git clone --single-branch -b starter-template https:\/\/github.com\/kimanikevin254\/mailgun-transactional-email-workflows.git<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aqui est\u00e3o os principais arquivos do projeto:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>src\/controllers\/order.controller.ts cont\u00e9m<\/code> dois m\u00e9todos:\n<ul class=\"wp-block-list\">\n<li><code>index<\/code> renderiza a interface de administra\u00e7\u00e3o, que \u00e9 definida em <code>src\/views\/admin.ejs<\/code><\/li>\n\n\n\n<li><code>updateOrderStatus<\/code> atualiza o status do pedido no banco de dados <\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>src\/database\/entity\/order.entity.ts<\/code> define a entidade de pedido<\/li>\n\n\n\n<li><code>src\/database\/entity\/user.entity.ts<\/code> define a entidade de usu\u00e1rio<\/li>\n\n\n\n<li><code>src\/database\/seed.ts<\/code> popula o banco de dados com um usu\u00e1rio e um pedido de exemplo<\/li>\n\n\n\n<li><code>docker-compose.yml roda<\/code> <a href=\"https:\/\/redis.io\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Redis<\/a> no Docker, o que \u00e9 exigido pelo BullMQ<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Instale todas as depend\u00eancias usando o seguinte comando:<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>npm install<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em seguida, renomeie o <code>arquivo<\/code> <code>.env.example<\/code> para <code>.env <\/code> e substitua os valores de placeholder para <code>MAILGUN_DOMAIN <\/code> e <code>MAILGUN_API_KEY<\/code> pelas credenciais que voc\u00ea obteve no painel do Mailgun. Para a vari\u00e1vel MAIL_FROM, forne\u00e7a seu endere\u00e7o de e-mail como valor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em seguida, abra o <code>arquivo<\/code> <code>src\/database\/seed.ts<\/code> e substitua os detalhes de placeholder na <code>constante userInfo<\/code> pelos seus pr\u00f3prios dados. Para o e-mail, certifique-se de fornecer um que voc\u00ea adicionou como destinat\u00e1rio autorizado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por fim, popule o banco de dados executando o comando <code>npm run db:seed<\/code> no seu terminal. Agora voc\u00ea pode rodar o projeto usando o comando <code>npm run dev<\/code> e acessar a p\u00e1gina <a href=\"http:\/\/localhost:3000\/\" target=\"_tabs\" rel=\"noopener noreferrer\">http:\/\/localhost:3000<\/a> no seu navegador para visualizar e atualizar o status do pedido:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3953\" width=\"2028\" height=\"536\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/5__4_.png\" alt=\"order status management screen image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/5__4_.png 2028w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/5__4_-300x79.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/5__4_-768x203.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/5__4_-1024x271.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/5__4_-1536x406.png 1536w\" sizes=\"(max-width: 2028px) 100vw, 2028px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Na pr\u00f3xima se\u00e7\u00e3o, voc\u00ea implementar\u00e1 um fluxo de trabalho que envia automaticamente um e-mail para o usu\u00e1rio assim que o status do pedido for atualizado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Design dos modelos de e-mail<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Modelos de e-mail bem projetados melhoram a legibilidade, aprimoram a experi\u00eancia do usu\u00e1rio e garantem que seus e-mails pare\u00e7am profissionais em diferentes dispositivos. Nesta se\u00e7\u00e3o, voc\u00ea criar\u00e1 modelos que tornam seus e-mails transacionais claros, envolventes e eficazes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um pedido passa por tr\u00eas estados (enviado, saiu para entrega e entregue), conforme definido no <code>tipo OrderStatus<\/code> em <code>src\/types\/index.ts.<\/code> Voc\u00ea criar\u00e1 um modelo de e-mail correspondente para cada estado, a fim de manter a clientela informada em cada etapa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para isso, crie um arquivo em <code>src\/email-templates\/html\/shipped.html<\/code> e adicione o seguinte c\u00f3digo:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                HTML                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"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-markup\">\r\n                                <code id=\"code_0_content\" class=\"language-markup\">\r\n\r\n                                    &lt;!DOCTYPE html&gt;rn&lt;html&gt;rn&lt;head&gt;rn    &lt;meta charset=&quot;UTF-8&quot; \/&gt;rn    &lt;title&gt;Order Shipped&lt;\/title&gt;rn&lt;\/head&gt;rn&lt;body style=&quot;font-family: Arial, sans-serif; background-color: #f4f4f4; padding: 20px; text-align: center;&quot;&gt;rnrn    &lt;div style=&quot;background: #ffffff; padding: 20px; border-radius: 8px; max-width: 600px; margin: auto; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);&quot;&gt;rnrn        &lt;div style=&quot;background-color: #007bff; color: white; padding: 15px; font-size: 22px; font-weight: bold; border-top-left-radius: 8px; border-top-right-radius: 8px;&quot;&gt;rn            Your Order Has Been Shipped! \u2708\ufe0frn        &lt;\/div&gt;rnrn        &lt;div style=&quot;padding: 20px; font-size: 16px; color: #333; text-align: left;&quot;&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;Hello, &lt;%= name %&gt;&lt;\/p&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;Your order has been shipped and is on its way to you. \ud83d\udce6&lt;\/p&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;&lt;strong&gt;Tracking Number:&lt;\/strong&gt; &lt;%= trackingNumber %&gt;&lt;\/p&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;You can track your package below. We hope you enjoy your purchase!&lt;\/p&gt;rnrn            &lt;a href=&quot;https:\/\/yourwebsite.com\/track?trackingNumber=&lt;%= trackingNumber %&gt;&quot;rn               style=&quot;background-color: #007bff; color: white; text-decoration: none; padding: 12px 18px; border-radius: 5px; display: inline-block; margin-top: 15px; font-weight: bold;&quot;&gt;rn                Track Your Shipmentrn            &lt;\/a&gt;rn        &lt;\/div&gt;rnrn        &lt;div style=&quot;background-color: #f4f4f4; padding: 10px; font-size: 14px; color: #555; border-bottom-left-radius: 8px; border-bottom-right-radius: 8px;&quot;&gt;rn            Thank you for shopping with us! \ud83d\uded2rn        &lt;\/div&gt;rn    &lt;\/div&gt;rn&lt;\/body&gt;rn&lt;\/html&gt;rn\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Este modelo de e-mail \u00e9 usado para notificar a clientela de que o pedido foi enviado. Ele inclui placeholders para o nome do cliente e n\u00famero de rastreamento, que ser\u00e3o preenchidos dinamicamente por <a href=\"https:\/\/ejs.co\/\" target=\"_tabs\" rel=\"noopener noreferrer\">EJS<\/a> durante a renderiza\u00e7\u00e3o do modelo. Os modelos para os outros dois status de pedido seguir\u00e3o o mesmo formato.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Crie um modelo para notificar os usu\u00e1rios de que o pedido saiu para entrega, criando um arquivo chamado <code>out_for_delivery.html<\/code> na pasta <code>src\/email-templates\/html<\/code> e adicionando o seguinte c\u00f3digo:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                HTML                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"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-markup\">\r\n                                <code id=\"code_0_content\" class=\"language-markup\">\r\n\r\n                                    &lt;!DOCTYPE html&gt;rn&lt;html&gt;rn&lt;head&gt;rn    &lt;meta charset=&quot;UTF-8&quot; \/&gt;rn    &lt;title&gt;Out for Delivery&lt;\/title&gt;rn&lt;\/head&gt;rn&lt;body style=&quot;font-family: Arial, sans-serif; background-color: #f4f4f4; padding: 20px; text-align: center;&quot;&gt;rnrn    &lt;div style=&quot;background: #ffffff; padding: 20px; border-radius: 8px; max-width: 600px; margin: auto; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);&quot;&gt;rnrn        &lt;div style=&quot;background-color: #28a745; color: white; padding: 15px; font-size: 22px; font-weight: bold; border-top-left-radius: 8px; border-top-right-radius: 8px;&quot;&gt;rn            Your Order Is Out for Delivery! \ud83d\ude9arn        &lt;\/div&gt;rnrn        &lt;div style=&quot;padding: 20px; font-size: 16px; color: #333; text-align: left;&quot;&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;Hello, &lt;%= name %&gt;&lt;\/p&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;Good news! Your package is out for delivery and will arrive soon. \ud83d\udce6&lt;\/p&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;&lt;strong&gt;Tracking Number:&lt;\/strong&gt; &lt;%= trackingNumber %&gt;&lt;\/p&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;We appreciate your business and can&#039;t wait for you to receive your order!&lt;\/p&gt;rnrn            &lt;a href=&quot;https:\/\/yourwebsite.com\/track?trackingNumber=&lt;%= trackingNumber %&gt;&quot;rn               style=&quot;background-color: #28a745; color: white; text-decoration: none; padding: 12px 18px; border-radius: 5px; display: inline-block; margin-top: 15px; font-weight: bold;&quot;&gt;rn                Track Your Packagern            &lt;\/a&gt;rn        &lt;\/div&gt;rnrn        &lt;div style=&quot;background-color: #f4f4f4; padding: 10px; font-size: 14px; color: #555; border-bottom-left-radius: 8px; border-bottom-right-radius: 8px;&quot;&gt;rn            Thank you for choosing us! \ud83d\udecd\ufe0frn        &lt;\/div&gt;rn    &lt;\/div&gt;rn&lt;\/body&gt;rn&lt;\/html&gt;\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Por fim, crie um modelo para notificar os usu\u00e1rios de que o pedido foi entregue, criando um arquivo chamado <code>delivered.html<\/code> na <code>pasta<\/code> <code>src\/email-templates\/html<\/code> e adicionando o seguinte c\u00f3digo:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                HTML                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"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-markup\">\r\n                                <code id=\"code_0_content\" class=\"language-markup\">\r\n\r\n                                    &lt;!DOCTYPE html&gt;rn&lt;html&gt;rn&lt;head&gt;rn    &lt;meta charset=&quot;UTF-8&quot; \/&gt;rn    &lt;title&gt;Order Delivered&lt;\/title&gt;rn&lt;\/head&gt;rn&lt;body style=&quot;font-family: Arial, sans-serif; background-color: #f4f4f4; padding: 20px; text-align: center;&quot;&gt;rnrn    &lt;div style=&quot;background: #ffffff; padding: 20px; border-radius: 8px; max-width: 600px; margin: auto; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);&quot;&gt;rnrn        &lt;div style=&quot;background-color: #ffc107; color: white; padding: 15px; font-size: 22px; font-weight: bold; border-top-left-radius: 8px; border-top-right-radius: 8px;&quot;&gt;rn            Your Order Has Been Delivered! \ud83c\udf89rn        &lt;\/div&gt;rnrn        &lt;div style=&quot;padding: 20px; font-size: 16px; color: #333; text-align: left;&quot;&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;Hello, &lt;%= name %&gt;&lt;\/p&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;We&#039;re happy to inform you that your package has been successfully delivered. \ud83c\udf81&lt;\/p&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;&lt;strong&gt;Tracking Number:&lt;\/strong&gt; &lt;%= trackingNumber %&gt;&lt;\/p&gt;rn            &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;We hope you enjoy your purchase! If you have any questions, feel free to contact us.&lt;\/p&gt;rnrn            &lt;a href=&quot;https:\/\/yourwebsite.com\/track?trackingNumber=&lt;%= trackingNumber %&gt;&quot;rn               style=&quot;background-color: #ffc107; color: white; text-decoration: none; padding: 12px 18px; border-radius: 5px; display: inline-block; margin-top: 15px; font-weight: bold;&quot;&gt;rn                Track Your Orderrn            &lt;\/a&gt;rn        &lt;\/div&gt;rnrn        &lt;div style=&quot;background-color: #f4f4f4; padding: 10px; font-size: 14px; color: #555; border-bottom-left-radius: 8px; border-bottom-right-radius: 8px;&quot;&gt;rn            Thank you for shopping with us! \ud83d\udecd\ufe0frn        &lt;\/div&gt;rn    &lt;\/div&gt;rn&lt;\/body&gt;rn&lt;\/html&gt;\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Para gerenciar e renderizar modelos de e-mail dinamicamente, voc\u00ea precisa criar uma classe que carregue e organize modelos para diferentes status de pedido. Esta classe recuperar\u00e1 o modelo certo e o renderizar\u00e1 com dados espec\u00edficos de cada cliente. Para isso, crie um novo arquivo chamado <code>index.ts<\/code> na <code>pasta src\/email-templates <\/code> e adicione o seguinte c\u00f3digo:<\/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 { readFileSync } from &quot;fs&quot;;rnimport { EmailTemplate, OrderStatus } from &quot;..\/types&quot;;rnimport ejs from &quot;ejs&quot;;rnrnexport class EmailTemplateManager {rn    private templates: Map&lt;OrderStatus, EmailTemplate&gt;;rnrn    constructor() {rn        this.templates = new Map();rn        this.loadTemplates();rn    }rnrn    private loadTemplates() {rn        \/\/ Load each template for different statusesrn        const statuses: OrderStatus[] = [rn            &quot;shipped&quot;,rn            &quot;out_for_delivery&quot;,rn            &quot;delivered&quot;,rn        ];rn        const subjects: Record&lt;OrderStatus, string&gt; = {rn            shipped: &quot;Your Order Has Been Shipped! \u2708\ufe0f&quot;,rn            out_for_delivery: &quot;Your Order is Out for Delivery! \ud83d\ude9a&quot;,rn            delivered: &quot;Your Order Has Been Delivered! \ud83c\udf89&quot;,rn        };rnrn        statuses.forEach((status) =&gt; {rn            const htmlTemplate = readFileSync(rn                `src\/email-templates\/html\/${status}.html`,rn                &quot;utf-8&quot;rn            );rnrn            this.templates.set(status, {rn                subject: subjects[status],rn                html: htmlTemplate,rn            });rn        });rn    }rnrn    getTemplate(status: OrderStatus): EmailTemplate {rn        const template = this.templates.get(status);rn        if (!template) {rn            throw new Error(`No template found for status: ${status}`);rn        }rn        return template;rn    }rnrn    renderTemplate(templateString: string, data: Record&lt;string, any&gt;): string {rn        return ejs.render(templateString, data); \/\/ Render the template with the provided datarn    }rn}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Esta classe inicializa uma vari\u00e1vel privada chamada templates, que armazena os modelos de e-mail em um Map para pesquisa r\u00e1pida com base no status do pedido. Usar um Map garante uma recupera\u00e7\u00e3o eficiente e evita a leitura repetida de arquivos do disco. A classe tamb\u00e9m define os seguintes m\u00e9todos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>loadTemplates<\/code> (privado) l\u00ea modelos HTML dos arquivos e os armazena no Map templates, juntamente com suas respectivas linhas de assunto.<\/li>\n\n\n\n<li><code>getTemplate<\/code> recupera o modelo de e-mail para um determinado status de pedido e gera um erro se nenhum modelo for encontrado.<\/li>\n\n\n\n<li><code>renderTemplate<\/code> usa o EJS para renderizar dinamicamente um modelo com os dados fornecidos.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Implementa\u00e7\u00e3o da funcionalidade de envio de e-mails<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Com os modelos de e-mail configurados, a pr\u00f3xima etapa \u00e9 implementar a funcionalidade de envio de notifica\u00e7\u00f5es. Isso envolve colocar trabalhos de e-mail na fila e process\u00e1-los de forma ass\u00edncrona.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mas antes de fazer isso, voc\u00ea precisa instalar algumas depend\u00eancias executando o seguinte comando:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>npm i mailgun.js@11.1.0 form-data@4.0.2 bullmq@5.41.2 ioredis@5.5.0<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aqui est\u00e1 uma vis\u00e3o geral de cada uma dessas depend\u00eancias:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>mailgun.js<\/code> \u00e9 um cliente Node.js para interagir com a API do Mailgun. Voc\u00ea usar\u00e1 isso para enviar e-mails transacionais.<\/li>\n\n\n\n<li><code>form-data<\/code> \u00e9 um pacote exigido pelo <code>mailgun.js<\/code> para lidar com envios de formul\u00e1rios ao enviar e-mails.<\/li>\n\n\n\n<li><code>bullmq<\/code> \u00e9 uma biblioteca de fila de trabalhos para lidar com tarefas ass\u00edncronas. Isso permite colocar notifica\u00e7\u00f5es por e-mail na fila e process\u00e1-las em segundo plano.<\/li>\n\n\n\n<li><code>ioredis<\/code> \u00e9 um cliente Redis para Node.js, usado pelo BullMQ para armazenar e gerenciar trabalhos na fila.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Em seguida, voc\u00ea precisa definir um cliente da API do Mailgun que usar\u00e1 para enviar e-mails. Para isso, crie um novo arquivo em <code>src\/config\/mailgun.config.ts<\/code> e adicione o seguinte c\u00f3digo:<\/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 FormData from &quot;form-data&quot;;rnimport Mailgun from &quot;mailgun.js&quot;;rnrnconst mailgun = new Mailgun(FormData);rnexport const mgClient = mailgun.client({rn    username: &quot;api&quot;,rn    key: process.env.MAILGUN_API_KEY,rn});\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Este c\u00f3digo configura e exporta um cliente Mailgun usando a biblioteca <code>mailgun.js<\/code> e o <code>form-data<\/code>, permitindo que sua aplica\u00e7\u00e3o envie e-mails atrav\u00e9s da API do Mailgun com a chave de API armazenada nas vari\u00e1veis de ambiente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Agora, voc\u00ea precisa definir uma conex\u00e3o Redis que ser\u00e1 usada pelo BullMQ para armazenar e gerenciar trabalhos em segundo plano. Para fazer isso, crie um novo arquivo chamado <code>redis.config.ts<\/code> na pasta <code>src\/config<\/code> e adicione o c\u00f3digo abaixo:<\/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 IORedis from &quot;ioredis&quot;;rnrnexport const redisConfig = new IORedis({rn    host: process.env.REDIS_HOST,rn    port: parseInt(process.env.REDIS_PORT),rn    maxRetriesPerRequest: null,rn});\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Voc\u00ea precisa configurar uma fila BullMQ para as notifica\u00e7\u00f5es de envio, que lidar\u00e1 com os trabalhos de notifica\u00e7\u00e3o por e-mail em segundo plano usando a conex\u00e3o Redis definida na etapa anterior. Para isso, crie um novo arquivo chamado <code>queues.config.ts<\/code> na pasta <code>src\/config<\/code> e adicione o seguinte c\u00f3digo:<\/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 { Queue } from &quot;bullmq&quot;;rnimport { redisConfig } from &quot;.\/redis.config&quot;;rnrnexport const QUEUE_NAMES = {rn    SHIPPING_NOTICATIONS: &quot;shipping-notifications&quot;,rn};rnrnexport const JOB_NAMES = {rn    SEND_NOTIFICATION: &quot;send-notification&quot;,rn};rnrnexport const SHIPPING_NOTICATIONS_QUEUE = new Queue(rn    QUEUE_NAMES.SHIPPING_NOTICATIONS,rn    {rn        connection: redisConfig,rn    }rn);\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Este c\u00f3digo tamb\u00e9m define nomes para a fila e o tipo de trabalho que podem ser usados em outras partes da aplica\u00e7\u00e3o para evitar strings hardcoded.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por fim, crie um novo arquivo em <code>src\/services\/notifications.service.ts<\/code> e adicione o seguinte c\u00f3digo:<\/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 { Job, Queue, Worker } from &quot;bullmq&quot;;rnimport {rn    QUEUE_NAMES,rn    SHIPPING_NOTICATIONS_QUEUE,rn    JOB_NAMES,rn} from &quot;..\/config\/queues.config&quot;;rnimport { redisConfig } from &quot;..\/config\/redis.config&quot;;rnimport { mgClient } from &quot;..\/config\/mailgun.config&quot;;rnimport { IMailgunClient } from &quot;mailgun.js\/Interfaces&quot;;rnimport { EmailTemplateManager } from &quot;..\/email-templates&quot;;rnimport { MailgunMessageData } from &quot;mailgun.js&quot;;rnimport { NotificationJob } from &quot;..\/types&quot;;rnrnexport class NotificationService {rn    private queue: Queue;rn    private mailgunClient: IMailgunClient;rn    private templateManager: EmailTemplateManager;rnrn    constructor() {rn        this.queue = SHIPPING_NOTICATIONS_QUEUE;rn        this.mailgunClient = mgClient;rn        this.templateManager = new EmailTemplateManager();rn        this.setupWorker();rn    }rnrn    private setupWorker() {rn        const worker = new Worker(rn            QUEUE_NAMES.SHIPPING_NOTICATIONS,rn            async (job) =&gt; {rn                console.log(`Processing job: ${job.id}`);rn                await this.processNotification(job);rn            },rn            {rn                connection: redisConfig,rn            }rn        );rnrn        worker.on(&quot;completed&quot;, (job) =&gt; {rn            console.log(`Job ${job.id} completed successfully`);rn        });rnrn        worker.on(&quot;failed&quot;, (job, error) =&gt; {rn            console.log(`Job ${job?.id} failed`, error);rn        });rn    }rnrn    private async processNotification(job: Job&lt;NotificationJob&gt;) {rn        const { email, trackingNumber, status, metadata } = job.data;rnrn        try {rn            const template = this.templateManager.getTemplate(status);rn            const emailData: MailgunMessageData = {rn                from: process.env.MAIL_FROM,rn                to: email,rn                subject: template.subject,rn                html: this.templateManager.renderTemplate(template.html, {rn                    trackingNumber,rn                    ...metadata,rn                }),rn            };rnrn            await this.mailgunClient.messages.create(rn                process.env.MAILGUN_DOMAIN,rn                emailDatarn            );rn        } catch (error) {rn            console.log(error);rn            throw error;rn        }rn    }rnrn    async queueNotification(data: NotificationJob) {rn        await this.queue.add(JOB_NAMES.SEND_NOTIFICATION, data, {rn            attempts: 5, \/\/ number of retry attempts before failing permanentlyrn            backoff: {rn                type: &quot;exponential&quot;, \/\/ Retry using exponential backoffrn                delay: 5000, \/\/ Delay in ms before retryingrn            },rn        });rn        console.log(&quot;Job queued successfully&quot;);rn    }rn}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Este c\u00f3digo define uma classe <code>NotificationService<\/code> que lida com notifica\u00e7\u00f5es por e-mail usando um sistema de fila de trabalhos com BullMQ e Mailgun. Esta classe inicializa tr\u00eas propriedades privadas: queue, que \u00e9 a fila onde os trabalhos de e-mail s\u00e3o adicionados; <code>mailgunClient<\/code>, que \u00e9 o cliente Mailgun para o envio de e-mails; e <code>templateManager<\/code>, que \u00e9 uma inst\u00e2ncia da classe TemplateManager criada anteriormente para gerenciar e recuperar modelos de e-mail. Esta classe tamb\u00e9m define os seguintes m\u00e9todos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>setupWorker<\/code> cria um worker que ouve novos trabalhos de e-mail e os processa. Ele registra o sucesso ou a falha do trabalho.<\/li>\n\n\n\n<li><code>processNotification<\/code> busca o modelo de e-mail correto, preenche-o com dados din\u00e2micos e envia o e-mail usando o Mailgun.<\/li>\n\n\n\n<li><code>queueNotification<\/code> adiciona um novo trabalho de e-mail \u00e0 fila, com <a href=\"https:\/\/docs.bullmq.io\/guide\/retrying-failing-jobs\" target=\"_tabs\" rel=\"noopener noreferrer\">tentativas de repeti\u00e7\u00e3o<\/a> e <a href=\"https:\/\/docs.bullmq.io\/guide\/retrying-failing-jobs#built-in-backoff-strategies\" target=\"_tabs\" rel=\"noopener noreferrer\">backoff exponencial<\/a> para tentativas que falharam. Este m\u00e9todo pode ser chamado de outras partes da aplica\u00e7\u00e3o para adicionar trabalhos \u00e0 fila.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Integrando com eventos do aplicativo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para enviar notifica\u00e7\u00f5es por e-mail quando o status de um pedido for atualizado, voc\u00ea precisa colocar um trabalho na fila do sistema de notifica\u00e7\u00f5es. Para isso, abra o arquivo <code>src\/controllers\/order.controller.ts<\/code> e adicione a seguinte instru\u00e7\u00e3o para importar a classe <code>NotificationService<\/code>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>import { NotificationService } from \"..\/services\/notifications.service\";<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em seguida, defina uma propriedade privada dentro da classe <code>OrderController<\/code> para armazenar uma inst\u00e2ncia da classe <code>NotificationService<\/code>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>private notificationService: NotificationService;<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inicialize esta propriedade adicionando o seguinte c\u00f3digo dentro do m\u00e9todo <code>constructor<\/code>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>this.notificationService = new NotificationService();<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por fim, adicione o seguinte c\u00f3digo dentro do m\u00e9todo <code>updateOrderStatus<\/code>, logo ap\u00f3s <code>await this.orderRepository.save(order);<\/code>, para colocar um trabalho na fila assim que o status do pedido for atualizado com sucesso:<\/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                                    \/\/ Send notificationrnthis.notificationService.queueNotification({rn    email: order.user.email,rn    trackingNumber: order.trackingNumber,rn    status,rn    metadata: {rn        name: order.user.name.split(&quot; &quot;)[0],rn    },rn});\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">O fluxo de trabalho de e-mail transacional agora est\u00e1 conclu\u00eddo. Voc\u00ea j\u00e1 pode testar se tudo est\u00e1 funcionando conforme o esperado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testando o fluxo de trabalho<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para garantir que tudo funcione corretamente, inicie o Redis executando o seguinte comando no seu terminal:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>docker compose up -d<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ap\u00f3s rodar esse comando, voc\u00ea pode verificar se o Redis est\u00e1 em execu\u00e7\u00e3o listando os cont\u00eaineres:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>docker ps<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este comando mostra uma lista de cont\u00eaineres ativos, e voc\u00ea deve ver o cont\u00eainer <code>redis<\/code> rodando.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em seguida, inicie o servidor Express usando o comando <code>npm run dev<\/code> e acesse <a href=\"http:\/\/localhost:3000\/\" target=\"_tabs\" rel=\"noopener noreferrer\">http:\/\/localhost:3000<\/a> no seu navegador. No painel da aplica\u00e7\u00e3o, atualize o status do pedido para qualquer uma das op\u00e7\u00f5es dispon\u00edveis. Ap\u00f3s a atualiza\u00e7\u00e3o, voc\u00ea receber\u00e1 uma resposta instant\u00e2nea:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3955\" width=\"2012\" height=\"550\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/6__4_.png\" alt=\"Shipped Order Status Screen Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/6__4_.png 2012w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/6__4_-300x82.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/6__4_-768x210.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/6__4_-1024x280.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/6__4_-1536x420.png 1536w\" sizes=\"(max-width: 2012px) 100vw, 2012px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">No seu terminal, voc\u00ea receber\u00e1 um log notificando que o trabalho de envio de e-mail foi colocado na fila com sucesso e est\u00e1 sendo processado:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Job queued successfully<br>\nProcessing job: 1<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E quando estiver conclu\u00eddo:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Job 1 completed successfully<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em seguida, voc\u00ea receber\u00e1 um e-mail com o status do pedido atualizado:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3958\" width=\"2028\" height=\"1024\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/7__3_.png\" alt=\"Your order has shipped screen image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/7__3_.png 2028w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/7__3_-300x151.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/7__3_-768x388.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/7__3_-1024x517.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/7__3_-1536x776.png 1536w\" sizes=\"(max-width: 2028px) 100vw, 2028px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Sempre que voc\u00ea atualizar o status de um pedido, o sistema enviar\u00e1 automaticamente um e-mail correspondente para o usu\u00e1rio, mantendo-o informado:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3962\" width=\"2014\" height=\"986\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/8__3_.png\" alt=\"Your Order has been delivered screen image 8\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/8__3_.png 2014w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/8__3_-300x147.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/8__3_-768x376.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/8__3_-1024x501.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/8__3_-1536x752.png 1536w\" sizes=\"(max-width: 2014px) 100vw, 2014px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">O c\u00f3digo completo da aplica\u00e7\u00e3o est\u00e1 dispon\u00edvel no <a href=\"https:\/\/github.com\/kimanikevin254\/mailgun-transactional-email-workflows\" target=\"_tabs\" rel=\"noopener noreferrer\">GitHub<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Monitorando e gerenciando e-mails<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para garantir que seus e-mails transacionais cheguem aos clientes de forma eficaz, voc\u00ea precisa monitorar o status de entrega e as taxas de abertura, al\u00e9m de lidar com poss\u00edveis falhas. O Mailgun fornece um painel onde voc\u00ea pode rastrear os e-mails enviados, verificar se eles foram entregues, abertos ou clicados e visualizar relat\u00f3rios de devolu\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voc\u00ea pode acessar este painel navegando at\u00e9 <b>Send &gt; Reporting &gt; Metrics<\/b> no Mailgun:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3968\" width=\"2016\" height=\"1072\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/9__3_.png\" alt=\"Send &gt; Reporting &gt; Metrics Screen Image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/9__3_.png 2016w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/9__3_-300x160.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/9__3_-768x408.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/9__3_-1024x545.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/9__3_-1536x817.png 1536w\" sizes=\"(max-width: 2016px) 100vw, 2016px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">No entanto, as taxas de abertura n\u00e3o s\u00e3o rastreadas automaticamente, e voc\u00ea precisar\u00e1 configur\u00e1-las manualmente na aba <b>Settings<\/b> do seu dom\u00ednio de envio:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-3975\" width=\"2040\" height=\"1064\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/10__2_.png\" alt=\"Domain Settings Screen Tab image\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/10__2_.png 2040w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/10__2_-300x156.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/10__2_-768x401.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/10__2_-1024x534.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/10__2_-1536x801.png 1536w\" sizes=\"(max-width: 2040px) 100vw, 2040px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Mais informa\u00e7\u00f5es sobre como rastrear as taxas de abertura e de cliques est\u00e3o dispon\u00edveis na <a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/tracking-messages\/#tracking-opens\" target=\"_tabs\" rel=\"noopener noreferrer\">documenta\u00e7\u00e3o oficial<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al\u00e9m disso, voc\u00ea pode usar <a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/tracking-messages\/#webhooks\" target=\"_tabs\" rel=\"noopener noreferrer\">webhooks<\/a> para receber notifica\u00e7\u00f5es em tempo real sobre entregas que falharam e tomar a a\u00e7\u00e3o adequada, como tentar enviar o e-mail novamente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ao monitorar ativamente o desempenho de seus e-mails, voc\u00ea pode melhorar a entregabilidade, reduzir as devolu\u00e7\u00f5es e garantir que notifica\u00e7\u00f5es importantes cheguem aos seus clientes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Neste artigo, voc\u00ea aprendeu a configurar um fluxo de trabalho de e-mail transacional para notifica\u00e7\u00f5es de envio usando o Mailgun, o BullMQ e o Redis. Voc\u00ea aprendeu a configurar o Mailgun para enviar e-mails, definir uma fila de trabalhos com o BullMQ e integr\u00e1-la a um sistema de atualiza\u00e7\u00e3o de pedidos para garantir que os clientes recebam notifica\u00e7\u00f5es por e-mail em tempo real. Essa abordagem melhora a comunica\u00e7\u00e3o e aprimora a experi\u00eancia geral do cliente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Isso foi \u00fatil? Assine a nossa newsletter para mais tutoriais e an\u00e1lises detalhadas como esta.<\/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_2d67c441427fedb8b93846cf43884673\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                Inscreva-se            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_2d67c441427fedb8b93846cf43884673\">\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>Os clientes esperam atualiza\u00e7\u00f5es em tempo real assim que o pedido \u00e9 movimentado. Este guia mostra como criar um fluxo de trabalho de e-mail transacional confi\u00e1vel para notifica\u00e7\u00f5es de envio usando a API do Mailgun e o BullMQ, para que seus e-mails cheguem \u00e0 caixa de entrada exatamente quando deveriam.<\/p>\n","protected":false},"author":5,"featured_media":3952,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[19],"class_list":["post-19772","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>Crie fluxos de trabalho de e-mail transacional com a API do Mailgun - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Aprenda a criar e-mails de notifica\u00e7\u00e3o de envio escal\u00e1veis e orientados a eventos usando a API do Mailgun e o BullMQ para melhor desempenho e entregabilidade.\" \/>\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-notificacoes-de-envio\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Crie fluxos de trabalho de e-mail transacional com a API do Mailgun - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Aprenda a criar e-mails de notifica\u00e7\u00e3o de envio escal\u00e1veis e orientados a eventos usando a API do Mailgun e o BullMQ para melhor desempenho e entregabilidade.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-notificacoes-de-envio\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-14T15:10:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"448\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"11 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-notificacoes-de-envio\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-notificacoes-de-envio\\\/\",\"name\":\"Crie fluxos de trabalho de e-mail transacional com 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-notificacoes-de-envio\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-notificacoes-de-envio\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"datePublished\":\"2025-06-11T00:00:00+00:00\",\"dateModified\":\"2026-09-14T15:10:04+00:00\",\"description\":\"Aprenda a criar e-mails de notifica\u00e7\u00e3o de envio escal\u00e1veis e orientados a eventos usando a API do Mailgun e o BullMQ para melhor desempenho e entregabilidade.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-notificacoes-de-envio\\\/#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-notificacoes-de-envio\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-notificacoes-de-envio\\\/#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-notificacoes-de-envio\\\/#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\":\"Criando fluxos de trabalho de e-mail transacional para notifica\u00e7\u00f5es de envio 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":"Crie fluxos de trabalho de e-mail transacional com a API do Mailgun - Transactional Email API Service For Developers | Mailgun","description":"Aprenda a criar e-mails de notifica\u00e7\u00e3o de envio escal\u00e1veis e orientados a eventos usando a API do Mailgun e o BullMQ para melhor desempenho e entregabilidade.","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-notificacoes-de-envio\/","og_locale":"pt_BR","og_type":"article","og_title":"Crie fluxos de trabalho de e-mail transacional com a API do Mailgun - Transactional Email API Service For Developers | Mailgun","og_description":"Aprenda a criar e-mails de notifica\u00e7\u00e3o de envio escal\u00e1veis e orientados a eventos usando a API do Mailgun e o BullMQ para melhor desempenho e entregabilidade.","og_url":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-notificacoes-de-envio\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","article_modified_time":"2026-09-14T15:10:04+00:00","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"11 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-notificacoes-de-envio\/","url":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-notificacoes-de-envio\/","name":"Crie fluxos de trabalho de e-mail transacional com 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-notificacoes-de-envio\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-notificacoes-de-envio\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","datePublished":"2025-06-11T00:00:00+00:00","dateModified":"2026-09-14T15:10:04+00:00","description":"Aprenda a criar e-mails de notifica\u00e7\u00e3o de envio escal\u00e1veis e orientados a eventos usando a API do Mailgun e o BullMQ para melhor desempenho e entregabilidade.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-notificacoes-de-envio\/#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-notificacoes-de-envio\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/como-criar-fluxos-de-trabalho-de-e-mail-transacional-para-notificacoes-de-envio\/#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-notificacoes-de-envio\/#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":"Criando fluxos de trabalho de e-mail transacional para notifica\u00e7\u00f5es de envio 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\/19772","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\/5"}],"version-history":[{"count":1,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/19772\/revisions"}],"predecessor-version":[{"id":19794,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/19772\/revisions\/19794"}],"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=19772"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog_category?post=19772"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}