{"id":23047,"date":"2026-09-16T01:28:06","date_gmt":"2026-09-16T01:28:06","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/um-guia-para-usar-os-webhooks-da-mailgun\/"},"modified":"2026-09-16T01:28:06","modified_gmt":"2026-09-16T01:28:06","slug":"um-guia-para-usar-os-webhooks-da-mailgun","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/pt\/blog\/product\/um-guia-para-usar-os-webhooks-da-mailgun\/","title":{"rendered":"Um guia pr\u00e1tico para usar os webhooks da Mailgun"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><i>Este guest post \u00e9 de\u00a0<\/i><i><b>Opeyemi Obembe<\/b><\/i><i>, cliente da Mailgun com sede na Nig\u00e9ria. Quando vimos o tutorial de Opeyemi sobre como configurar webhooks, sab\u00edamos que precis\u00e1vamos compartilh\u00e1-lo com voc\u00ea. A metodologia de Opeyemi n\u00e3o \u00e9 apenas s\u00f3lida, mas ele \u00e9 o tipo de profissional de desenvolvimento que adoramos apoiar.<\/i><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><i>Opeyemi se cadastrou na Mailgun h\u00e1 quatro anos e, desde ent\u00e3o, construiu coisas muito legais. Mais recentemente, ele desenvolveu o\u00a0Suet, um projeto de c\u00f3digo aberto que fornece an\u00e1lises detalhadas e relat\u00f3rios para e-mails transacionais enviados pela Mailgun. Voc\u00ea pode us\u00e1-lo em conjunto com nossos novos recursos de an\u00e1lises para obter insights adicionais sobre o engajamento do seu e-mail.<\/i><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E-mails transacionais s\u00e3o essenciais para a maioria dos aplicativos. Enviamos e-mails de boas-vindas, e-mails de recupera\u00e7\u00e3o de senha, notifica\u00e7\u00f5es e muito mais. E quando fazemos isso, usamos provedores como a Mailgun. Enviar os e-mails \u00e9 muito legal, mas e quanto \u00e0 entrega e ao desempenho? O usu\u00e1rio recebeu aquele e-mail de redefini\u00e7\u00e3o de senha? Aquele e-mail de notifica\u00e7\u00e3o de &#8220;expira\u00e7\u00e3o do cart\u00e3o de cr\u00e9dito&#8221; foi aberto?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Embora esses dados estejam dispon\u00edveis em\u00a0<a href=\"https:\/\/app.mailgun.com\/sessions\/new\" target=\"_tabs\" rel=\"noopener noreferrer\">seu painel da conta Mailgun<\/a>, outra maneira de obter atualiza\u00e7\u00f5es sobre o que est\u00e1 acontecendo com suas mensagens transacionais na Mailgun \u00e9 por meio de <a href=\"https:\/\/www.mailgun.com\/resources\/learn\/glossary\/webhook\/\" target=\"_tabs\" rel=\"noopener noreferrer\">webhooks<\/a>.\u00a0<a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/api-reference\/intro\/\" target=\"_tabs\" rel=\"noopener noreferrer\">H\u00e1 tamb\u00e9m a API<\/a>, mas, diferentemente da API, em que voc\u00ea &#8220;solicita&#8221; essas atualiza\u00e7\u00f5es (Poll), com webhooks, as atualiza\u00e7\u00f5es s\u00e3o enviadas para voc\u00ea (Push). Tudo o que voc\u00ea precisa fazer \u00e9 fornecer o URL de um script que possa lidar com os dados do evento via\u00a0<code>POST<\/code>.<\/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-6586\"><p class=\"h5 m-0\" id=\"toc-title-6586\">\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=\"#configuracao-de-webhooks\">Configura\u00e7\u00e3o de webhooks<\/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=\"#lidando-com-os-dados\">Lidando com os dados<\/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=\"#tornando-o-seguro\">Tornando-o seguro<\/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=\"#tornando-o-escalavel\">Tornando-o escal\u00e1vel<\/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=\"#conclusao\">Conclus\u00e3o<\/a><\/div><\/div><\/nav>\n\n\n<p class=\"wp-block-paragraph\"><b>N\u00e3o \u00e9 preciso dizer que o push tem algumas vantagens sobre o poll.<\/b><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Voc\u00ea n\u00e3o precisa fazer solicita\u00e7\u00f5es repetidas de API. Isso significa consumir menos recursos do servidor.<\/li>\n\n\n\n<li>As atualiza\u00e7\u00f5es s\u00e3o mais em tempo real porque s\u00e3o enviadas assim que ficam dispon\u00edveis no servidor.<\/li>\n<\/ul>\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_2aea5707596905a1c088f68ea22a9573\">\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_2aea5707596905a1c088f68ea22a9573\">\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\n\n\n<h2 class=\"wp-block-heading\">Configura\u00e7\u00e3o de webhooks<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Existem duas maneiras de configurar webhooks na Mailgun. Isso pode ser feito pelo painel da Mailgun ou\u00a0<a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/api-reference\/openapi-final\/tag\/Webhooks\/\" target=\"_tabs\" rel=\"noopener noreferrer\">API<\/a>. A maneira mais direta de fazer isso \u00e9 pelo painel. Ap\u00f3s entrar no seu painel,\u00a0<a href=\"https:\/\/app.mailgun.com\/app\/webhooks\" target=\"_tabs\" rel=\"noopener noreferrer\">um link de Webhooks<\/a>\u00a0est\u00e1 dispon\u00edvel na barra de navega\u00e7\u00e3o.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4570\" width=\"1024\" height=\"783\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/webhooks1.jpeg\" alt=\"webhooks1\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/webhooks1.jpeg 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/webhooks1-300x229.jpeg 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/webhooks1-768x587.jpeg 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A p\u00e1gina de webhooks lista os diferentes tipos de eventos para os quais voc\u00ea pode receber dados de eventos. Ao clicar no \u00edcone de \u201c+\u201d na frente de cada evento, <b>voc\u00ea pode definir o URL para onde os dados do evento ser\u00e3o enviados.<\/b><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lidando com os dados<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para lidar com os dados do evento enviados para o URL do nosso webhook, precisamos saber como esses dados ser\u00e3o. Os par\u00e2metros enviados via POST est\u00e3o dispon\u00edveis\u00a0<a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/tracking-messages\/#tracking-open-messages\" target=\"_tabs\" rel=\"noopener noreferrer\">na documenta\u00e7\u00e3o da API<\/a>. Podemos ir um passo al\u00e9m e confirmar isso usando um URL de webhook de teste que registrar\u00e1 os dados da Mailgun. Podemos usar o\u00a0<a href=\"http:\/\/bin.mailgun.net\/?utm_source=mailgun&amp;utm_medium=blog&amp;utm_campaign=webhooks-1710\" target=\"_tabs\" rel=\"noopener noreferrer\">Postbin da Mailgun<\/a>\u00a0ou\u00a0<a href=\"https:\/\/requestbin.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\">requestb.in<\/a>. <b>Esses servi\u00e7os gerar\u00e3o um endpoint exclusivo que podemos usar no painel da Mailgun para obter dados de eventos de amostra<\/b>. Recomendo o requestbin porque ele fornece mais detalhes, como os cabe\u00e7alhos da solicita\u00e7\u00e3o. Esses cabe\u00e7alhos s\u00e3o importantes porque voc\u00ea pode facilmente deixar passar o fato de que a Mailgun envia alguns dados usando o content-type\u00a0[<code>application\/x-www-form-urlencoded]<\/code>\u00a0e outros como\u00a0[<code>multipart\/form-data]<\/code>. Perder esses pequenos detalhes muda tudo sobre como voc\u00ea obt\u00e9m os dados do evento.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos em frente e criar um endpoint de teste e ver como os dados do evento se parecem em compara\u00e7\u00e3o com o que est\u00e1 na documenta\u00e7\u00e3o.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Acesse <a href=\"https:\/\/requestbin.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\">requestb.in<\/a> e crie um bin.<\/li>\n\n\n\n<li>Copie o URL e acesse <a href=\"https:\/\/app.mailgun.com\/app\/webhooks\" target=\"_tabs\" rel=\"noopener noreferrer\">a se\u00e7\u00e3o de Webhooks no seu painel da Mailgun<\/a>.<\/li>\n\n\n\n<li>Cole o URL no campo de entrada e clique no link \u201cTest Webhook\u201d. Isso enviar\u00e1 dados de evento de amostra para o URL.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4571\" width=\"1024\" height=\"547\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screen-Shot-2019-04-12-at-3.18.54-PM.png\" alt=\"Screen-Shot-2019-04-12-at-3\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screen-Shot-2019-04-12-at-3.18.54-PM.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screen-Shot-2019-04-12-at-3.18.54-PM-300x160.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screen-Shot-2019-04-12-at-3.18.54-PM-768x410.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Repita isso para todos os eventos nos quais voc\u00ea tem interesse.<\/li>\n\n\n\n<li>Atualize a p\u00e1gina do requestbin para ver os dados do evento enviados.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4572\" width=\"956\" height=\"343\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/requestbin-webhooks-data.png\" alt=\"requestbin-webhooks-data\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/requestbin-webhooks-data.png 956w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/requestbin-webhooks-data-300x108.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/requestbin-webhooks-data-768x276.png 768w\" sizes=\"(max-width: 956px) 100vw, 956px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Se voc\u00ea observar atentamente os dados do requestbin, notar\u00e1 o que eu disse sobre alguns dados serem enviados como multipart\/form-data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Agora que sabemos quais s\u00e3o os par\u00e2metros para cada tipo de evento e o tipo de conte\u00fado em que eles podem vir, \u00e9 f\u00e1cil escrever um c\u00f3digo para lidar com os dados enviados. Aqui est\u00e1 um c\u00f3digo simples que exibir\u00e1 detalhes de reclama\u00e7\u00f5es e e-mails descartados. (Estou usando o\u00a0<a href=\"https:\/\/github.com\/expressjs\/multer\" target=\"_tabs\" rel=\"noopener noreferrer\">multer<\/a>\u00a0para lidar com multipart\/form-data.)<\/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                                Java                            <\/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-Java\">\r\n                                <code id=\"code_0_content\" class=\"language-Java\">\r\n\r\n                                    const express = require(&#039;express&#039;)  rn    , bodyParser = require(&#039;body-parser&#039;)rn    , multer = require(&#039;multer&#039;)rn    ;rnrnconst app = express();  rnapp.use(bodyParser.urlencoded({extended: false}));  rnapp.listen(process.env.PORT || 3000);rnrnapp.post(&#039;\/webhook&#039;, multer().none(), function(req, res) {  rn  const email = req.body.recipient;rn  const event = req.body.event;rnrn  if (event == &#039;complained&#039;) {rn    console.log(&lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;${email} complained about your mail&lt;\/code&gt;);rn  }rn  else if (event == &#039;dropped&#039;) {rn    console.log(&lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;Mail to ${email} dropped. ${event.description}&lt;\/code&gt;);rn  }rn  else if (event == &#039;bounced&#039;) {rn    console.log(&lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;Error ${event.code}: Mail to ${email} bounced. ${event.error}&lt;\/code&gt;);rn  }rnrn  res.end();rn});\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Tornando-o seguro<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">N\u00e3o h\u00e1 nada que impe\u00e7a algu\u00e9m que conhe\u00e7a o URL do nosso webhook de criar dados de eventos falsos e envi\u00e1-los para o URL. Felizmente, a Mailgun assina cada solicita\u00e7\u00e3o enviada e tamb\u00e9m publica os seguintes par\u00e2metros:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>timestamp (n\u00famero de segundos decorridos desde 1\u00ba de janeiro de 1970)<\/li>\n\n\n\n<li>token (string gerada aleatoriamente com tamanho 50)<\/li>\n\n\n\n<li>signature (string hexadecimal gerada pelo algoritmo HMAC)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Para verificar o token, voc\u00ea precisa:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Concatenar os valores de timestamp e token.<\/li>\n\n\n\n<li>Codificar a string resultante com HMAC, usando a chave de assinatura HTTP do seu webhook como chave e Sha256 como algoritmo.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><b>O resultado deve ser igual \u00e0 signature.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Veja como isso fica no Node.js:<\/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                                Java                            <\/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-Java\">\r\n                                <code id=\"code_0_content\" class=\"language-Java\">\r\n\r\n                                    const value = event_data_timestamp+event_data_token;  rnconst hash = crypto.createHmac(&#039;sha256&#039;, apikey)  rn                   .update(value)rn                   .digest(&#039;hex&#039;);rnif (hash !== event_data_signature) {  rn  console.log(&#039;Invalid signature&#039;);rn  return;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\">Se adicionarmos isso ao nosso exemplo de c\u00f3digo original, teremos algo assim:<\/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                                Java                            <\/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-Java\">\r\n                                <code id=\"code_0_content\" class=\"language-Java\">\r\n\r\n                                    const express = require(&#039;express&#039;)  rn    , crypto = require(&#039;crypto&#039;)rn    , multer = require(&#039;multer&#039;)rn    , bodyParser = require(&#039;body-parser&#039;)rn    ;rnrnconst app = express();  rnapp.use(bodyParser.urlencoded({extended: false}));  rnapp.listen(process.env.PORT || 3000);rnrnapp.get(&#039;\/webhook&#039;, multer().none(), function(req, res) {  rn  \/\/ Validate signaturern  const value = req.body.timestamp+req.body.token;rn  const hash = crypto.createHmac(&#039;sha256&#039;,rn              process.env.API_KEY)rn                   .update(value)rn                   .digest(&#039;hex&#039;);rn  if (hash !== req.body.signature) {rn    console.log(&#039;Invalid signature&#039;);rn    return res.end();rn  }rnrn  \/\/ Log status of eventrn  const email = req.body.recipient;rn  const event = req.body.event;rnrn  if (event == &#039;complained&#039;) {rn    console.log(&lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;${email} complained about your mail&lt;\/code&gt;);rn  }rn  else if (event == &#039;dropped&#039;) {rn    console.log(&lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;Mail to ${email} dropped. ${event.description}&lt;\/code&gt;);rn  }rn  else if (event == &#039;bounced&#039;) {rn    console.log(&lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;Error ${event.code}: Mail to ${email} bounced. ${event.error}&lt;\/code&gt;);rn  }rnrn  res.end();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\">Podemos at\u00e9 melhorar isso, e:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A cada solicita\u00e7\u00e3o, verificar em um cache de token para evitar o uso do mesmo token. Todos os tokens ser\u00e3o armazenados l\u00e1. Isso evitar\u00e1 ataques de repeti\u00e7\u00e3o.<\/li>\n\n\n\n<li>Verificar se o timestamp n\u00e3o est\u00e1 muito distante do hor\u00e1rio atual.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Tornando-o escal\u00e1vel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Se voc\u00ea enviar muitos e-mails e esperar muitos eventos, colocar seu script de webhook em um servidor que n\u00e3o pode ser dimensionado automaticamente \u00e9 uma m\u00e1 ideia. Mesmo que voc\u00ea n\u00e3o esteja esperando muitos eventos, coisas inesperadas podem causar um aumento neles. Ter um servidor com capacidade de escalonamento autom\u00e1tico \u00e9 muito \u00fatil para casos como este.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9 a\u00ed que entra a\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Serverless_computing\" target=\"_tabs\" rel=\"noopener noreferrer\">computa\u00e7\u00e3o sem servidor<\/a>. Em termos simples, a ideia \u00e9 que voc\u00ea pode delegar a execu\u00e7\u00e3o do seu c\u00f3digo e tudo relacionado a isso para um provedor. V\u00e1rias inst\u00e2ncias do seu c\u00f3digo podem ser executadas em paralelo, e voc\u00ea pode ajustar os recursos de computa\u00e7\u00e3o, como RAM e tempo de execu\u00e7\u00e3o, em tempo real. Isso o torna altamente escal\u00e1vel. <b>Voc\u00ea tamb\u00e9m \u00e9 cobrado com base nos recursos consumidos e no tempo de execu\u00e7\u00e3o, portanto, pode ser muito barato se voc\u00ea n\u00e3o enviar muitos e-mails regularmente.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Existem alguns provedores de computa\u00e7\u00e3o sem servidor. Um que uso e recomendo \u00e9 o\u00a0<a href=\"https:\/\/cloud.google.com\/functions\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Google Cloud Functions<\/a>\u00a0por causa da facilidade de configurar fun\u00e7\u00f5es HTTP. Uma fun\u00e7\u00e3o HTTP \u00e9 um bloco de c\u00f3digo empacotado como uma fun\u00e7\u00e3o que pode ser acionada ao visitar um URL. Isso \u00e9 exatamente o que precisamos para o nosso webhook.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para criar essa fun\u00e7\u00e3o, precisamos escrever uma fun\u00e7\u00e3o JavaScript que ser\u00e1 exportada como um m\u00f3dulo do Node.js. A fun\u00e7\u00e3o recebe argumentos espec\u00edficos do HTTP:\u00a0<code>request<\/code>\u00a0e\u00a0<code>response<\/code>.<\/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                                Java                            <\/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-Java\">\r\n                                <code id=\"code_0_content\" class=\"language-Java\">\r\n\r\n                                    exports.webhook = function(request, response) {  rn  \/\/ Handle event data herern  response.send({status:&quot;ok&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\">Com base no content-type da solicita\u00e7\u00e3o, o corpo da solicita\u00e7\u00e3o \u00e9 passado automaticamente e disponibilizado no par\u00e2metro\u00a0<code>body<\/code>\u00a0do objeto request.<\/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                                Java                            <\/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-Java\">\r\n                                <code id=\"code_0_content\" class=\"language-Java\">\r\n\r\n                                    exports.webhook = function(request, response) {  rn  let event = request.body.event; \/\/ deliveredrn  \/\/ Handle event data herern  \/\/ ...rn  response.send({status:&quot;ok&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\"><b>No entanto, isso n\u00e3o funciona para o tipo de conte\u00fado multipart\/form-data<\/b>. E, como j\u00e1 sabemos, a Mailgun envia alguns dados como multipart\/form-data. Podemos incluir uma biblioteca como o\u00a0<a href=\"https:\/\/github.com\/expressjs\/multer\" target=\"_tabs\" rel=\"noopener noreferrer\">Multer<\/a>\u00a0usando o\u00a0<code>require()<\/code>. No entanto, precisamos garantir que a depend\u00eancia esteja listada no arquivo\u00a0<b>package.json<\/b>.<\/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                                Java                            <\/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-Java\">\r\n                                <code id=\"code_0_content\" class=\"language-Java\">\r\n\r\n                                    const multer = require(&#039;multer&#039;);rnrnexports.webhook = function(request, response) {  rn  parser(request, response, function(){rn    console.log(request.body); \/\/ Our event datarn    \/\/ Handle event data herern    \/\/ ...rn    response.send({status:&quot;ok&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    <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                                Java                            <\/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-Java\">\r\n                                <code id=\"code_0_content\" class=\"language-Java\">\r\n\r\n                                    {rn  &quot;dependencies&quot;: {rn    &quot;multer&quot;: &quot;^1.3.0&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\">Em seguida, podemos publicar a fun\u00e7\u00e3o no\u00a0<a href=\"https:\/\/cloud.google.com\/functions\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Cloud Functions<\/a>. Uma maneira f\u00e1cil de fazer isso \u00e9 pelo painel do Cloud Functions.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Acesse o seu <a href=\"https:\/\/console.cloud.google.com\/start\" target=\"_tabs\" rel=\"noopener noreferrer\">Google Cloud Console<\/a> (se voc\u00ea ainda n\u00e3o tiver uma conta, crie uma).<\/li>\n\n\n\n<li>Ative o Cloud Functions no painel.<\/li>\n\n\n\n<li>Clique em \u201cCreate Function\u201d.<\/li>\n\n\n\n<li>Insira um nome para a sua fun\u00e7\u00e3o (por exemplo, &#8220;mailgun-webhook&#8221;).<\/li>\n\n\n\n<li>Na se\u00e7\u00e3o de gatilho, selecione \u201cHTTP trigger\u201d. Anote o URL; esse ser\u00e1 o URL do seu webhook.<\/li>\n\n\n\n<li>Copie o c\u00f3digo de manipula\u00e7\u00e3o de dados de evento para a se\u00e7\u00e3o i<i>ndex.js <\/i>da fun\u00e7\u00e3o Cloud.<\/li>\n\n\n\n<li>Copie o conte\u00fado do seu <b>package.json <\/b>e cole na se\u00e7\u00e3o <i>package.json<\/i>.<\/li>\n\n\n\n<li>Selecione ou crie um <i>Stage bucket<\/i>. O stage bucket \u00e9 simplesmente onde o c\u00f3digo \u00e9 preparado. Voc\u00ea pode usar qualquer coisa aqui.<\/li>\n\n\n\n<li>Em <i>Function to execute<\/i>, insira o nome da sua fun\u00e7\u00e3o (por exemplo, &#8220;webhook&#8221;).<\/li>\n\n\n\n<li>Salvar.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Agora voc\u00ea pode usar o URL da fun\u00e7\u00e3o na Mailgun como o URL do seu webhook.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Trabalhar com os webhooks da Mailgun \u00e9 f\u00e1cil. Existem muitas maneiras de usar os dados do evento para enriquecer seus aplicativos fora da Mailgun. Se, por exemplo, voc\u00ea permitir que seus usu\u00e1rios enviem e-mails do seu site por qualquer motivo e voc\u00ea usar a Mailgun, poder\u00e1 usar webhooks para fornecer an\u00e1lises para eles. Ou talvez voc\u00ea queira enviar suas an\u00e1lises de e-mail para outra plataforma. Ou talvez voc\u00ea queira receber notifica\u00e7\u00f5es sobre falhas na sua\u00a0<a href=\"https:\/\/slack.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Slack<\/a>\u00a0conta. Ou talvez nem isso; talvez voc\u00ea queira apenas an\u00e1lises mais detalhadas. Seja qual for o caso de uso, <b>os dados do evento est\u00e3o dispon\u00edveis para voc\u00ea.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para obter um exemplo do mundo real, confira a fonte do\u00a0<a href=\"https:\/\/github.com\/kehers\/suet\/blob\/master\/workers\/hooks\/index.js\" target=\"_tabs\" rel=\"noopener noreferrer\">arquivo de webhook do Suet<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><i>Quer experimentar os webhooks da Mailgun? Cadastre-se!<\/i><\/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_2aea5707596905a1c088f68ea22a9573\">\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_2aea5707596905a1c088f68ea22a9573\">\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\n\n\n<p class=\"wp-block-paragraph\"><i>E se voc\u00ea precisar de ajuda para come\u00e7ar a usar a Mailgun,\u00a0<\/i><a href=\"https:\/\/www.crowdcast.io\/e\/getting-started-with-mailgun?utm_source=mailgun&amp;utm_medium=blog&amp;utm_campaign=webhooks-1710\" target=\"_tabs\" rel=\"noopener noreferrer\"><i>confira este treinamento gratuito da Mailgun<\/i><\/a><i>! Chris Hammer, l\u00edder de nossa equipe de suporte ao cliente, orienta voc\u00ea pelo processo de configura\u00e7\u00e3o e ajuda a come\u00e7ar a enviar, receber e rastrear seus e-mails com a Mailgun.<\/i><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Saiba como configurar webhooks, lidar com dados de seus e-mails transacionais e proteger os dados do webhook neste guest post de um cliente da Mailgun.<\/p>\n","protected":false},"author":13,"featured_media":4555,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[22],"class_list":["post-23047","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-product"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Um guia pr\u00e1tico para usar os webhooks da Mailgun - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Saiba como configurar webhooks, lidar com dados de seus e-mails transacionais e proteger os dados do webhook neste guest post de um cliente da Mailgun.\" \/>\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\/product\/um-guia-para-usar-os-webhooks-da-mailgun\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Um guia pr\u00e1tico para usar os webhooks da Mailgun - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Saiba como configurar webhooks, lidar com dados de seus e-mails transacionais e proteger os dados do webhook neste guest post de um cliente da Mailgun.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/pt\/blog\/product\/um-guia-para-usar-os-webhooks-da-mailgun\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Product.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=\"7 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\\\/product\\\/um-guia-para-usar-os-webhooks-da-mailgun\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/product\\\/um-guia-para-usar-os-webhooks-da-mailgun\\\/\",\"name\":\"Um guia pr\u00e1tico para usar os webhooks da Mailgun - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/product\\\/um-guia-para-usar-os-webhooks-da-mailgun\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/product\\\/um-guia-para-usar-os-webhooks-da-mailgun\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Product.png\",\"datePublished\":\"2026-09-16T01:28:06+00:00\",\"description\":\"Saiba como configurar webhooks, lidar com dados de seus e-mails transacionais e proteger os dados do webhook neste guest post de um cliente da Mailgun.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/product\\\/um-guia-para-usar-os-webhooks-da-mailgun\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/product\\\/um-guia-para-usar-os-webhooks-da-mailgun\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/product\\\/um-guia-para-usar-os-webhooks-da-mailgun\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Product.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Product.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/product\\\/um-guia-para-usar-os-webhooks-da-mailgun\\\/#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\":\"Um guia pr\u00e1tico para usar os webhooks da 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":"Um guia pr\u00e1tico para usar os webhooks da Mailgun - Transactional Email API Service For Developers | Mailgun","description":"Saiba como configurar webhooks, lidar com dados de seus e-mails transacionais e proteger os dados do webhook neste guest post de um cliente da Mailgun.","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\/product\/um-guia-para-usar-os-webhooks-da-mailgun\/","og_locale":"pt_BR","og_type":"article","og_title":"Um guia pr\u00e1tico para usar os webhooks da Mailgun - Transactional Email API Service For Developers | Mailgun","og_description":"Saiba como configurar webhooks, lidar com dados de seus e-mails transacionais e proteger os dados do webhook neste guest post de um cliente da Mailgun.","og_url":"https:\/\/www.mailgun.com\/pt\/blog\/product\/um-guia-para-usar-os-webhooks-da-mailgun\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Product.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/pt\/blog\/product\/um-guia-para-usar-os-webhooks-da-mailgun\/","url":"https:\/\/www.mailgun.com\/pt\/blog\/product\/um-guia-para-usar-os-webhooks-da-mailgun\/","name":"Um guia pr\u00e1tico para usar os webhooks da Mailgun - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/product\/um-guia-para-usar-os-webhooks-da-mailgun\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/product\/um-guia-para-usar-os-webhooks-da-mailgun\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Product.png","datePublished":"2026-09-16T01:28:06+00:00","description":"Saiba como configurar webhooks, lidar com dados de seus e-mails transacionais e proteger os dados do webhook neste guest post de um cliente da Mailgun.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/product\/um-guia-para-usar-os-webhooks-da-mailgun\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/pt\/blog\/product\/um-guia-para-usar-os-webhooks-da-mailgun\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.mailgun.com\/pt\/blog\/product\/um-guia-para-usar-os-webhooks-da-mailgun\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Product.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Product.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/pt\/blog\/product\/um-guia-para-usar-os-webhooks-da-mailgun\/#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":"Um guia pr\u00e1tico para usar os webhooks da 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\/23047","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\/13"}],"version-history":[{"count":1,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/23047\/revisions"}],"predecessor-version":[{"id":23048,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/23047\/revisions\/23048"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/media\/4555"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/media?parent=23047"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog_category?post=23047"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}