{"id":20710,"date":"2026-09-15T04:47:42","date_gmt":"2026-09-15T04:47:42","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/duplo-opt-in-com-php-mailgun\/"},"modified":"2026-09-15T04:47:42","modified_gmt":"2026-09-15T04:47:42","slug":"duplo-opt-in-com-php-mailgun","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/pt\/blog\/email\/duplo-opt-in-com-php-mailgun\/","title":{"rendered":"Duplo opt-in via PHP com o Mailgun"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Criar um formul\u00e1rio de assinatura personalizado com o Mailgun pode ser muito simples. Recebo v\u00e1rias mensagens de pessoas me pedindo para escrever um tutorial sobre como fazer isso em PHP, ent\u00e3o aqui est\u00e1. Antes de falar sobre c\u00f3digo, vamos discutir brevemente algumas pr\u00e1ticas recomendadas. Se voc\u00ea j\u00e1 sabe tudo sobre duplo opt-in, pule o pr\u00f3ximo par\u00e1grafo e avance para a parte de engenharia usando o \u00edndice abaixo.<\/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-8727\"><p class=\"h5 m-0\" id=\"toc-title-8727\">\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=\"#o-que-e-duplo-opt-in-e-como-profissional-de-desenvolvimento-por-que-isso-importa\">O que \u00e9 duplo opt-in e, como profissional de desenvolvimento, por que isso importa?<\/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=\"#formulario-html-e-javascript\">Formul\u00e1rio HTML e Javascript<\/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=\"#funcoes-do-php\">Fun\u00e7\u00f5es do PHP<\/a><a class=\"scrollme link-body-color\" href=\"#logica-do-php\">L\u00f3gica do PHP<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">O que \u00e9 duplo opt-in e, como profissional de desenvolvimento, por que isso importa?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O processo de duplo opt-in \u00e9 uma forma de verificar se, quando uma pessoa deixa seus dados no formul\u00e1rio de assinatura da newsletter no seu site, ela realmente solicitou o cadastro. Para isso, pede-se que voc\u00ea reconhe\u00e7a e confirme que seu endere\u00e7o de e-mail foi adicionado a uma determinada lista de e-mails. Como isso funciona? Simplesmente enviando um e-mail para voc\u00ea e pedindo para confirmar se realmente deseja receber e-mails daquele remetente. Se n\u00e3o confirmar a assinatura (geralmente clicando em um link contido no e-mail de confirma\u00e7\u00e3o), voc\u00ea nunca receber\u00e1 um e-mail de marketing (ou semelhante) daquele remetente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Profissionais de marketing passaram a n\u00e3o gostar dessa pr\u00e1tica, pois ela adiciona uma etapa extra para alcan\u00e7ar o seu p\u00fablico. No entanto, \u00e9 importante entender que, sem esse processo, qualquer pessoa poderia ser alvo de spam n\u00e3o solicitado por e-mail.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sem o duplo opt-in, qualquer pessoa que saiba o seu endere\u00e7o de e-mail poderia assinar milhares de newsletters e listas de marketing em seu nome, sem o seu consentimento.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Na maioria dos pa\u00edses, isso \u00e9\u00a0<b>exigido por lei<\/b>,\u00a0mas, de qualquer forma, acredito que seja uma das pr\u00e1ticas recomendadas e protege o seu neg\u00f3cio contra problemas de entregabilidade e den\u00fancias de abuso de e-mail.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Formul\u00e1rio HTML e Javascript<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A primeira coisa que voc\u00ea precisar\u00e1 fazer \u00e9 criar um formul\u00e1rio para colocar em algum lugar no seu site. Esse formul\u00e1rio solicitar\u00e1 os dados das pessoas para que voc\u00ea possa salvar em um banco de dados ou, se compat\u00edvel, na pr\u00f3pria plataforma de e-mail. O Mailgun oferece suporte \u00e0 segunda op\u00e7\u00e3o (<a href=\"http:\/\/documentation.mailgun.com\/api-mailinglists.html\" target=\"_tabs\" rel=\"noopener noreferrer\">e muito mais ao usar par\u00e2metros de vari\u00e1vel personalizados<\/a>), ent\u00e3o voc\u00ea n\u00e3o precisa se preocupar em configurar um banco de dados para armazenar esses dados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O formul\u00e1rio far\u00e1 a postagem em um arquivo chamado\u00a0<code>contact.php<\/code>\u00a0e ter\u00e1 dois campos obrigat\u00f3rios. Voc\u00ea pode obviamente tornar o campo de nome opcional ou adicionar outros, mas, para o prop\u00f3sito deste artigo, vamos manter tudo simples!<\/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                                    \r\n    \r\n    \r\n    &lt;p&gt;\r\n        &lt;a href=&quot;#&quot;&gt;I&#039;ve read and agree to the Terms of Service &lt;\/a&gt;\r\n        \r\n    &lt;\/p&gt;\r\n    &lt;button type=&quot;submit&quot;&gt;Newsletter Signup&lt;\/button&gt;\r\n    &lt;p&gt;\r\n        &lt;span style=&quot;display: none&quot; id=&quot;pls&quot;&gt; Please review and tick the Terms of Service box&lt;\/span&gt;\r\n    &lt;\/p&gt;\r\n\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 uso do c\u00f3digo Javascript abaixo garantir\u00e1 que a caixa de sele\u00e7\u00e3o seja marcada antes da valida\u00e7\u00e3o (no envio), caso contr\u00e1rio, n\u00e3o daremos seguimento com o e-mail!<\/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                                      \r\n    var box = document.getElementById(&quot;chx&quot;);\r\n    var alrt = document.getElementById(&quot;pls&quot;);\r\n\r\nfunction check_the_box(){  \r\n    if(!box.checked) {\r\n        alrt.setAttribute(&quot;style&quot;,&quot;display: inline&quot;);\r\n            return false\r\n}\r\nelse {  \r\n    return true\r\n}\r\n}\r\n \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\">Fique \u00e0 vontade para adicionar algum estilo ao formul\u00e1rio. No momento, ele \u00e9 muito b\u00e1sico, mas funcional.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fun\u00e7\u00f5es do PHP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A parte interessante come\u00e7a aqui: um arquivo contendo todas as fun\u00e7\u00f5es necess\u00e1rias para fazer o formul\u00e1rio funcionar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aqui est\u00e1 uma breve lista de todas as fun\u00e7\u00f5es criadas e uma explica\u00e7\u00e3o do que elas fazem:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>SanitizeInputs()<\/b>: Essa fun\u00e7\u00e3o \u00e9 usada para limpar a entrada de qualquer caractere &#8220;prejudicial&#8221;<\/li>\n\n\n\n<li><b>SanitizeEmail()<\/b>: O mesmo que a fun\u00e7\u00e3o acima, mas, em vez disso, executa uma verifica\u00e7\u00e3o de regex no endere\u00e7o de e-mail. N\u00e3o queremos enviar e-mails para endere\u00e7os com erros de ortografia, n\u00e3o \u00e9 mesmo?<\/li>\n\n\n\n<li><b>SendConfirmationEmail()<\/b>: Envia um e-mail para um endere\u00e7o de e-mail especificado. No nosso caso, \u00e9 o endere\u00e7o de e-mail especificado pelo usu\u00e1rio<\/li>\n\n\n\n<li><b>MakeConfirmationHash()<\/b>: Cria um hash exclusivo baseado na concatena\u00e7\u00e3o de strings do endere\u00e7o de e-mail do usu\u00e1rio e uma string secreta. Essa string ser\u00e1 enviada como parte do URL que o usu\u00e1rio precisa clicar para confirmar se deseja receber e-mails do nosso site. Toda a grandiosidade de um duplo opt-in seguro.<\/li>\n\n\n\n<li><b>CheckConfirmationHash()<\/b>: Uma fun\u00e7\u00e3o que verifica se, quando o usu\u00e1rio clica no link de confirma\u00e7\u00e3o, o hash contido no URL \u00e9 v\u00e1lido. Isso \u00e9 muito importante para o procedimento de duplo opt-in, caso contr\u00e1rio, qualquer pessoa poderia verificar os endere\u00e7os de e-mail de outras.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Voc\u00ea pode alterar o texto do e-mail como desejar. Tenha em mente que voc\u00ea passar\u00e1 o hash secreto, o endere\u00e7o de e-mail e o nome do usu\u00e1rio de volta para o script como par\u00e2metros GET!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Alerta de depend\u00eancia: usei a biblioteca php oficial do mailgun dispon\u00edvel no GitHub<\/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                                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                                    sendMessage($domain, array(\r\n  &#039;from&#039;    =&gt; &#039;confirmation@&#039;.$domain,\r\n  &#039;to&#039;      =&gt; $recipientAddress,\r\n  &#039;subject&#039; =&gt; $subjectText,\r\n  &#039;html&#039;    =&gt; &#039;&lt;p&gt;Hello, please confirm you want to receive marketing emails from &#039;.$domain.&#039; by clicking on the below link &lt;p&gt;&lt;a href=&quot;$siteURL\/contact.php?c=&amp;apos;.$hashedUnique.&amp;apos;&amp;e=&amp;apos;.$recipientAddress.&amp;apos;&amp;n=&amp;apos;.$recipientName.&amp;apos;&quot;&gt;CONFIRMATION&lt;\/a&gt;&lt;\/p&gt;&lt;\/p&gt;&lt;p&gt; This email was sent to&#039;.$recipientName.&#039;, at the speed of a bullet, by Mailgun!&lt;\/a&gt;&#039;\r\n  ));\r\n}\r\n\r\n function MakeConfirmationHash($confEmail, $confCode) {\r\n    return md5($confEmail.$confCode);\r\n }\r\n\r\n function CheckConfirmationHash($confEmail, $confCode) {\r\n    global $uniqueKey;\r\n    if (md5($confEmail.$uniqueKey) === $confCode) { return TRUE; }\r\n        else { return FALSE; }\r\n }\r\n\r\nfunction AddMemberToList($recipientAddress,$recipientName) {\r\n    global $mailingList,$mgClient;\r\n    $result = $mgClient-&gt;post(&quot;lists\/$mailingList\/members&quot;, array(\r\n    &#039;address&#039;     =&gt; $recipientAddress,\r\n    &#039;name&#039;        =&gt; $recipientName,\r\n    &#039;description&#039; =&gt; &#039;Form Opt In&#039;,\r\n    &#039;subscribed&#039;  =&gt; true    \r\n));\r\n}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<h3 class=\"wp-block-heading\">L\u00f3gica do PHP<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Na se\u00e7\u00e3o de l\u00f3gica, vou explicar o racioc\u00ednio por tr\u00e1s do c\u00f3digo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quando o usu\u00e1rio insere o seu endere\u00e7o de e-mail e nome no campo e envia o formul\u00e1rio, acontece o seguinte:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>O script gera um c\u00f3digo exclusivo e o envia por e-mail para o usu\u00e1rio<\/li>\n\n\n\n<li>O usu\u00e1rio recebe um e-mail com um link de confirma\u00e7\u00e3o, contendo informa\u00e7\u00f5es sobre ele e um c\u00f3digo exclusivo: clicar no e-mail confirmar\u00e1 que ele concorda com a inclus\u00e3o de seu endere\u00e7o na nossa lista de e-mails.<\/li>\n\n\n\n<li>Clicar no URL envia de volta os detalhes do usu\u00e1rio, que s\u00e3o verificados com base no c\u00f3digo exclusivo, e atua como o gatilho para a adi\u00e7\u00e3o \u00e0 lista de e-mails no Mailgun.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">E \u00e9 isso, duplo opt-in respeitado e um trabalho bem-feito!<\/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                                    \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\">Diga se voc\u00ea gostou deste artigo compartilhando a sua opini\u00e3o na caixa de coment\u00e1rios abaixo ou no Twitter. Se adoraria ver este tutorial em uma linguagem de programa\u00e7\u00e3o diferente, \u00e9 s\u00f3 falar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bons envios!<\/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_c204988768fd14f5636765a702ff0aba\">\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_c204988768fd14f5636765a702ff0aba\">\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>Criar um formul\u00e1rio de assinatura personalizado com o Mailgun pode ser muito simples. Recebo v\u00e1rias mensagens de pessoas me pedindo para escrever um tutorial sobre como fazer isso em PHP, ent\u00e3o aqui est\u00e1.<\/p>\n","protected":false},"author":34,"featured_media":4074,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[20],"class_list":["post-20710","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-email"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Use o Mailgun para o duplo opt-in via PHP - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Criar cadastros de e-mail pode parecer f\u00e1cil, at\u00e9 voc\u00ea lidar com o GDPR e as pr\u00e1ticas recomendadas de reputa\u00e7\u00e3o. Saiba como usar o Mailgun e o PHP para simplificar o processo.\" \/>\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\/email\/duplo-opt-in-com-php-mailgun\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Use o Mailgun para o duplo opt-in via PHP - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Criar cadastros de e-mail pode parecer f\u00e1cil, at\u00e9 voc\u00ea lidar com o GDPR e as pr\u00e1ticas recomendadas de reputa\u00e7\u00e3o. Saiba como usar o Mailgun e o PHP para simplificar o processo.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/pt\/blog\/email\/duplo-opt-in-com-php-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-Email.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=\"4 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\\\/email\\\/duplo-opt-in-com-php-mailgun\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/duplo-opt-in-com-php-mailgun\\\/\",\"name\":\"Use o Mailgun para o duplo opt-in via PHP - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/duplo-opt-in-com-php-mailgun\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/duplo-opt-in-com-php-mailgun\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"datePublished\":\"2026-09-15T04:47:42+00:00\",\"description\":\"Criar cadastros de e-mail pode parecer f\u00e1cil, at\u00e9 voc\u00ea lidar com o GDPR e as pr\u00e1ticas recomendadas de reputa\u00e7\u00e3o. Saiba como usar o Mailgun e o PHP para simplificar o processo.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/duplo-opt-in-com-php-mailgun\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/duplo-opt-in-com-php-mailgun\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/duplo-opt-in-com-php-mailgun\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/duplo-opt-in-com-php-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\":\"Duplo opt-in via PHP com o 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":"Use o Mailgun para o duplo opt-in via PHP - Transactional Email API Service For Developers | Mailgun","description":"Criar cadastros de e-mail pode parecer f\u00e1cil, at\u00e9 voc\u00ea lidar com o GDPR e as pr\u00e1ticas recomendadas de reputa\u00e7\u00e3o. Saiba como usar o Mailgun e o PHP para simplificar o processo.","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\/email\/duplo-opt-in-com-php-mailgun\/","og_locale":"pt_BR","og_type":"article","og_title":"Use o Mailgun para o duplo opt-in via PHP - Transactional Email API Service For Developers | Mailgun","og_description":"Criar cadastros de e-mail pode parecer f\u00e1cil, at\u00e9 voc\u00ea lidar com o GDPR e as pr\u00e1ticas recomendadas de reputa\u00e7\u00e3o. Saiba como usar o Mailgun e o PHP para simplificar o processo.","og_url":"https:\/\/www.mailgun.com\/pt\/blog\/email\/duplo-opt-in-com-php-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-Email.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/duplo-opt-in-com-php-mailgun\/","url":"https:\/\/www.mailgun.com\/pt\/blog\/email\/duplo-opt-in-com-php-mailgun\/","name":"Use o Mailgun para o duplo opt-in via PHP - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/duplo-opt-in-com-php-mailgun\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/duplo-opt-in-com-php-mailgun\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","datePublished":"2026-09-15T04:47:42+00:00","description":"Criar cadastros de e-mail pode parecer f\u00e1cil, at\u00e9 voc\u00ea lidar com o GDPR e as pr\u00e1ticas recomendadas de reputa\u00e7\u00e3o. Saiba como usar o Mailgun e o PHP para simplificar o processo.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/duplo-opt-in-com-php-mailgun\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/pt\/blog\/email\/duplo-opt-in-com-php-mailgun\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/duplo-opt-in-com-php-mailgun\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/duplo-opt-in-com-php-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":"Duplo opt-in via PHP com o 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\/20710","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\/34"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/20710\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/media\/4074"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/media?parent=20710"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog_category?post=20710"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}