{"id":20157,"date":"2025-01-07T00:00:00","date_gmt":"2025-01-07T00:00:00","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/verificar-emails-com-python-e-api-do-mailgun\/"},"modified":"2026-09-14T22:07:52","modified_gmt":"2026-09-14T22:07:52","slug":"verificar-emails-com-python-e-api-do-mailgun","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/verificar-emails-com-python-e-api-do-mailgun\/","title":{"rendered":"Verificando e-mails usando Python 3.9+ e a API do Mailgun"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Quer voc\u00ea envie e-mails transacionais, newsletters ou conte\u00fado promocional, manter uma lista de e-mails limpa e verificada pode melhorar significativamente a entregabilidade, evitar que suas mensagens acabem em pastas de spam e proteger a reputa\u00e7\u00e3o do seu dom\u00ednio. Endere\u00e7os de e-mail inv\u00e1lidos ou digitados incorretamente podem levar a taxas de devolu\u00e7\u00e3o mais altas, resultando em penalidades de provedores de servi\u00e7os de e-mail e redu\u00e7\u00e3o do engajamento. Neste guia, voc\u00ea aprender\u00e1 como verificar seus e-mails com a API do Mailgun.<\/p>\n\n\n\r\n    <nav data-content-type=\"longform\" class=\"toc-block longform-spacings px-5 py-6 px-md-6 px-lg-7 py-md-7 bg-light fs-sm rounded-lg\" aria-labelledby=\"toc-title-2881\"><p class=\"h5 m-0\" id=\"toc-title-2881\">\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-a-api-de-validacao-de-e-mail-em-massa-do-mailgun\">O que \u00e9 a API de valida\u00e7\u00e3o de e-mail em massa 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=\"#implementando-a-validacao-de-e-mail-em-massa-com-python-e-a-api-do-mailgun\">Implementando a valida\u00e7\u00e3o de e-mail em massa com Python e 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\">03<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#configurando-o-mailgun-para-validacao-de-e-mail-em-massa\">Configurando o Mailgun para valida\u00e7\u00e3o de e-mail em massa<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">04<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#configurando-um-diretorio-de-projeto-e-dependencias\">Configurando um diret\u00f3rio de projeto e depend\u00eancias<\/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=\"#criando-um-projeto-python-e-um-script-de-configuracao\">Criando um projeto Python e um script de configura\u00e7\u00e3o<\/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=\"#preparando-o-arquivo-da-sua-lista-de-e-mails\">Preparando o arquivo da sua lista 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=\"#criando-um-job-de-validacao-em-massa\">Criando um job de valida\u00e7\u00e3o em massa<\/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=\"#desenvolvendo-funcoes-para-verificar-o-status-do-job-e-baixar-os-resultados\">Desenvolvendo fun\u00e7\u00f5es para verificar o status do job e baixar os resultados<\/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=\"#desenvolvendo-funcoes-para-verificar-o-status-do-job-e-baixar-os-resultados\">Desenvolvendo fun\u00e7\u00f5es para verificar o status do job e baixar os resultados<\/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=\"#analisando-e-lidando-com-resultados-de-validacao\">Analisando e lidando com resultados de valida\u00e7\u00e3o<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">11<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#o-script-final\">O script final<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">12<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#testando-ao-enviar-uma-solicitacao-de-job-de-validacao-de-e-mail-em-massa\">Testando ao enviar uma solicita\u00e7\u00e3o de job de valida\u00e7\u00e3o de e-mail em massa<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">13<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#testando-ao-buscar-o-status-do-job-de-validacao-de-e-mail-em-massa\">Testando ao buscar o status do job de valida\u00e7\u00e3o de e-mail em massa<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">14<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#integrando-a-validacao-de-e-mail-em-massa-em-um-aplicativo-django\">Integrando a valida\u00e7\u00e3o de e-mail em massa em um aplicativo Django<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">15<\/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\">O que \u00e9 a API de valida\u00e7\u00e3o de e-mail em massa do Mailgun?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/documentation.mailgun.com\/docs\/inboxready\/mailgun-validate\/bulk_valid_preview\/\" target=\"_tabs\" rel=\"noopener noreferrer\">A API de valida\u00e7\u00e3o de e-mail em massa do Mailgun<\/a> foi desenvolvida para tornar a verifica\u00e7\u00e3o de e-mails escal\u00e1vel e eficiente. Com ela, a equipe de desenvolvimento pode validar listas inteiras de endere\u00e7os de e-mail, verificando problemas comuns como erros de sintaxe, e-mails descart\u00e1veis ou endere\u00e7os com servidores de e-mail inativos. A API fornece resultados detalhados para cada e-mail, facilitando a tomada de a\u00e7\u00e3o adequada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Neste tutorial, voc\u00ea aprender\u00e1 como integrar a API de valida\u00e7\u00e3o de e-mail em massa do Mailgun aos seus aplicativos Python. Desde a configura\u00e7\u00e3o da sua conta do Mailgun e o manuseio seguro de credenciais at\u00e9 a programa\u00e7\u00e3o que valida e-mails e processa os resultados, este guia fornece instru\u00e7\u00f5es passo a passo para verificar grandes listas de e-mails de forma eficiente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Implementando a valida\u00e7\u00e3o de e-mail em massa com Python e a API do Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de come\u00e7ar a seguir este tutorial, certifique-se de ter o seguinte:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Um conhecimento b\u00e1sico de programa\u00e7\u00e3o em Python<\/li>\n\n\n\n<li><a href=\"https:\/\/www.python.org\/downloads\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Python<\/a> 3.9+<\/li>\n\n\n\n<li>Um <a href=\"https:\/\/signup.mailgun.com\/new\/signup\" target=\"_tabs\" rel=\"noopener noreferrer\">conta do Mailgun<\/a>; uma conta paga \u00e9 necess\u00e1ria para este tutorial<\/li>\n\n\n\n<li>Experi\u00eancia com desenvolvimento de aplicativos baseados no <a href=\"https:\/\/www.django-rest-framework.org\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Django REST framework<\/a><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Este tutorial usa o sistema operacional Windows. Embora todas as instru\u00e7\u00f5es tamb\u00e9m devam funcionar para Linux e macOS, certifique-se de alterar os delimitadores de caminho do sistema operacional ou as refer\u00eancias de sintaxe conforme necess\u00e1rio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configurando o Mailgun para valida\u00e7\u00e3o de e-mail em massa<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para come\u00e7ar, <a href=\"https:\/\/app.mailgun.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\">fa\u00e7a login na sua conta do Mailgun<\/a> e navegue at\u00e9 o painel. Role para baixo e selecione a op\u00e7\u00e3o \u201c<b>API keys<\/b>\u201d:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4069\" width=\"1958\" height=\"876\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.18.38_AM.png\" alt=\"API keys option scrfeen\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.18.38_AM.png 1958w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.18.38_AM-300x134.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.18.38_AM-768x344.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.18.38_AM-1024x458.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.18.38_AM-1536x687.png 1536w\" sizes=\"(max-width: 1958px) 100vw, 1958px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Clique em \u201c<b>Add new key<\/b>\u201d para adicionar uma nova chave de API:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4075\" width=\"1958\" height=\"522\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.18.48_AM.png\" alt=\"Add new key to add a new API key screen\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.18.48_AM.png 1958w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.18.48_AM-300x80.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.18.48_AM-768x205.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.18.48_AM-1024x273.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.18.48_AM-1536x409.png 1536w\" sizes=\"(max-width: 1958px) 100vw, 1958px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Digite uma descri\u00e7\u00e3o (como &#8220;Bulk Email Validation API Key&#8221;) e clique em \u201c<b>Create Key<\/b>\u201d:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4079\" width=\"1960\" height=\"790\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.18.56_AM.png\" alt=\"Create Key screen\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.18.56_AM.png 1960w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.18.56_AM-300x121.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.18.56_AM-768x310.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.18.56_AM-1024x413.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.18.56_AM-1536x619.png 1536w\" sizes=\"(max-width: 1960px) 100vw, 1960px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Assim que a chave de API for criada, copie as informa\u00e7\u00f5es da chave, pois voc\u00ea precisar\u00e1 delas mais tarde. Se voc\u00ea esquecer de copiar as informa\u00e7\u00f5es ou perder a chave, n\u00e3o se preocupe; voc\u00ea pode excluir sua chave de API e criar uma nova.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configurando um diret\u00f3rio de projeto e depend\u00eancias<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Crie um diret\u00f3rio de projeto na sua m\u00e1quina e mude para esse diret\u00f3rio. Em seguida, abra um terminal com um caminho definido para o diret\u00f3rio do projeto atual e execute o seguinte comando para criar um ambiente virtual Python para este tutorial:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>python -m venv venv<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ative o ambiente virtual:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>venvScriptsactivate<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em seguida, instale a biblioteca requests, que ser\u00e1 usada para interagir com os endpoints do Mailgun:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>pip install requests<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Criando um projeto Python e um script de configura\u00e7\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ap\u00f3s ativar seu ambiente virtual, crie um novo diret\u00f3rio dentro do diret\u00f3rio do projeto chamado <code>standalone_python_scripts<\/code>, onde voc\u00ea desenvolver\u00e1 os m\u00f3dulos Python necess\u00e1rios para realizar a valida\u00e7\u00e3o de e-mail em massa usando os endpoints do Mailgun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Neste novo diret\u00f3rio, crie um novo arquivo Python chamado <code>config.py<\/code> e cole o seguinte c\u00f3digo para configurar o aplicativo de script Python aut\u00f4nomo:<\/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                                Python                            <\/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-Python\">\r\n                                <code id=\"code_0_content\" class=\"language-Python\">\r\n\r\n                                    import osrnrn# Retrieve the API key from the environment variablernrnAPI_KEY = os.getenv(&quot;MAILGUN_API_KEY&quot;)rnrn# Mailgun API base URLrnrnMAILGUN_API_URL = &quot;https:\/\/api.mailgun.net\/v4\/address\/validate\/bulk&quot;rnrnLIST_NAME = &quot;bulk_mailing_list_validation_1&quot;rnrnFILE_PATH = &quot;mailing_list.csv&quot;rnrnCOMMAND = &quot;submit_job&quot; # Possible values are &quot;submit_job&quot; and &quot;get_job_status&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\">Este m\u00f3dulo de configura\u00e7\u00e3o cont\u00e9m as vari\u00e1veis de configura\u00e7\u00e3o necess\u00e1rias para realizar a solicita\u00e7\u00e3o de valida\u00e7\u00e3o de e-mail em massa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Configure uma nova vari\u00e1vel de ambiente, MAILGUN_API_KEY, na sua m\u00e1quina host executando o seguinte comando:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>SET MAILGUN_API_KEY=<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Isso atribui a chave de API que voc\u00ea gerou anteriormente durante a configura\u00e7\u00e3o da conta do Mailgun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se voc\u00ea usa Linux ou Mac, execute o seguinte comando:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>export MAILGUN_API_KEY=<\/code><\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-light\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> Ao armazenar a chave de API em uma vari\u00e1vel de ambiente em vez de codific\u00e1-la no arquivo de configura\u00e7\u00e3o, voc\u00ea mant\u00e9m as informa\u00e7\u00f5es confidenciais protegidas.<\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Deixe os valores das outras vari\u00e1veis como est\u00e3o por enquanto. A vari\u00e1vel LIST_NAME cont\u00e9m o nome identificador da sua lista de e-mails a ser validada. FILE_PATH cont\u00e9m o caminho para o arquivo CSV de entrada que cont\u00e9m a lista de e-mails a serem validados.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Preparando o arquivo da sua lista de e-mails<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Agora que o script de configura\u00e7\u00e3o se refere a um caminho de arquivo de lista de e-mails por meio da vari\u00e1vel FILE_PATH, voc\u00ea precisa de uma lista de e-mails real com endere\u00e7os de e-mail para validar. Crie um arquivo chamado <code>mailing_list.csv<\/code> no <code>standalone_python_scripts directory<\/code> e cole alguns exemplos de endere\u00e7os de e-mail para come\u00e7ar:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>email<br>dummy_email@dummydomain.com<br>test_email@testemaildomain.com<br>non_existent_email_id_123456789@gmail.com<br>hellojohnsemail123@gmail.com<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Os endere\u00e7os de e-mail usados aqui n\u00e3o s\u00e3o v\u00e1lidos. Voc\u00ea pode adicionar mais endere\u00e7os v\u00e1lidos ou inv\u00e1lidos no mesmo formato com a sua pr\u00f3pria lista desejada de endere\u00e7os de e-mail.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Criando um job de valida\u00e7\u00e3o em massa<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Com a lista de e-mails pronta e a configura\u00e7\u00e3o para o processo de valida\u00e7\u00e3o conclu\u00edda, \u00e9 hora de configurar uma fun\u00e7\u00e3o para criar um job de valida\u00e7\u00e3o de e-mail em massa com o Mailgun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No mesmo diret\u00f3rio, crie um arquivo de script Python chamado <code>bulk_email_validation.py<\/code> e defina uma fun\u00e7\u00e3o <code>create_bulk_validation_job<\/code> que aceita dois par\u00e2metros, <code>list_name<\/code> (nome da lista de e-mails) e <code>file_path <\/code>(caminho para o arquivo que cont\u00e9m os e-mails):<\/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                                Python                            <\/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-Python\">\r\n                                <code id=\"code_0_content\" class=\"language-Python\">\r\n\r\n                                    def create_bulk_validation_job(list_name, file_path):rn    &quot;&quot;&quot;rn    This function creates a bulk validation job using the Mailgun API.rnrn    :param list_name: The name of the mailing list for validation.rn    :param file_path: The path to the CSV file containing emails to validate.rn    :return: Response object containing the job details.rn    &quot;&quot;&quot;rn    url = f&quot;{MAILGUN_API_URL}\/{list_name}&quot;rnrn    try:rn        # Send a POST request with the file to Mailgun&#039;s APIrn        with open(file_path, &quot;rb&quot;) as file_data:rn            response = requests.post(rn                url, auth=(&quot;api&quot;, API_KEY), files={&quot;file&quot;: file_data}rn            )rnrn        # Check if the request was successfulrn        if response.status_code == 202:rn            logging.info(f&quot;Bulk validation job created successfully for {list_name}&quot;)rn        else:rn            logging.error(rn                f&quot;Error creating validation job: {response.status_code} {response.text}&quot;rn            )rnrn        return response.json()rnrn    except Exception as e:rn        logging.error(f&quot;An error occurred while creating bulk validation job: {str(e)}&quot;)rn        return Nonern\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\">A fun\u00e7\u00e3o envia uma solicita\u00e7\u00e3o POST para a API do Mailgun para iniciar o processo de valida\u00e7\u00e3o de e-mail em massa. A solicita\u00e7\u00e3o inclui o arquivo de endere\u00e7os de e-mail que precisam ser validados.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Desenvolvendo fun\u00e7\u00f5es para verificar o status do job e baixar os resultados<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Agora, escreva outra fun\u00e7\u00e3o chamada <code>get_bulk_validation_status<\/code> no mesmo script <code>bulk_email_validation.py<\/code> que verifica o status do job de valida\u00e7\u00e3o enviado. A resposta inclui um link para baixar os resultados da valida\u00e7\u00e3o nos formatos CSV e JSON. Neste tutorial, voc\u00ea usar\u00e1 JSON para baixar e processar ainda mais os resultados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para baixar os resultados da valida\u00e7\u00e3o, a fun\u00e7\u00e3o <code>get_bulk_validation_status<\/code> faz uma chamada para outra fun\u00e7\u00e3o chamada <code>download_validation_results<\/code>. O resultado baixado \u00e9 colocado dentro do diret\u00f3rio <code>validation_results<\/code> no formato de um arquivo JSON. V\u00e1 em frente e crie este diret\u00f3rio dentro do diret\u00f3rio <code>standalone_python_scripts<\/code>, em seguida, cole o seguinte c\u00f3digo que define essas duas fun\u00e7\u00f5es em <code>bulk_email_validation.py<\/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                                Python                            <\/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-Python\">\r\n                                <code id=\"code_0_content\" class=\"language-Python\">\r\n\r\n                                    def get_bulk_validation_status(list_name):rn    &quot;&quot;&quot;rn    This function checks the status of a bulk validation job and downloads the validation results.rnrn    :param list_name: The name of the mailing list for which the status is being checked.rn    :return: Validation results or None in case of failure.rn    &quot;&quot;&quot;rn    url = f&quot;{MAILGUN_API_URL}\/{list_name}&quot;rnrn    try:rn        # Send a GET request to Mailgun&#039;s API to fetch the job statusrn        response = requests.get(url, auth=(&quot;api&quot;, API_KEY))rnrn        # Check if the request was successfulrn        if response.status_code == 200:rn            logging.info(f&quot;Successfully retrieved validation status for {list_name}&quot;)rnrn            # Parse the JSON responsern            result = response.json()rnrn            # Fetch the download URL for JSON resultsrn            download_url = result.get(&quot;download_url&quot;, {}).get(&quot;json&quot;)rn            if download_url:rn                # Fetch and return the validation resultsrn                return download_validation_results(download_url)rn            else:rn                logging.info(&quot;Download URL not available.&quot;)rn                return Nonernrn        else:rn            logging.error(rn                f&quot;Error fetching job status: {response.status_code} {response.text}&quot;rn            )rn            return Nonernrn    except Exception as e:rn        logging.error(rn            f&quot;An error occurred while fetching bulk validation status: {str(e)}&quot;rn        )rn        return Nonernrndef download_validation_results(download_url):rn    &quot;&quot;&quot;rn    This function downloads and processes the bulk validation results from the provided URL.rnrn    :param download_url: The URL to download the validation results in JSON format.rn    :return: Parsed results or None in case of failure.rn    &quot;&quot;&quot;rn    try:rn        response = requests.get(download_url)rnrn        # Check if the request was successfulrn        if response.status_code == 200:rn            logging.info(&quot;Successfully downloaded validation results.&quot;)rnrn            with zipfile.ZipFile(io.BytesIO(response.content)) as zip_ref:rn                validation_results_path = os.path.join(rn                    os.getcwd(), &quot;validation_results&quot;rn                )rn                zip_ref.extractall(path=validation_results_path)rnrn            with zipfile.ZipFile(io.BytesIO(response.content)) as zip_ref:rn                for file in zip_ref.namelist():rn                    if file.endswith(&quot;.json&quot;):rn                        with zip_ref.open(file) as json_file:rn                            validation_results = json.load(json_file)rnrn            # Process the results (handle invalid emails, etc.)rn            process_validation_results(validation_results)rnrn            return validation_resultsrnrn        else:rn            logging.error(rn                f&quot;Error downloading results: {response.status_code} {response.text}&quot;rn            )rn            return Nonernrn    except Exception as e:rn        logging.error(rn            f&quot;An error occurred while downloading validation results: {str(e)}&quot;rn        )rn        return Nonern\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\">A fun\u00e7\u00e3o envia uma solicita\u00e7\u00e3o POST para a API do Mailgun para iniciar o processo de valida\u00e7\u00e3o de e-mail em massa. A solicita\u00e7\u00e3o inclui o arquivo de endere\u00e7os de e-mail que precisam ser validados.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Desenvolvendo fun\u00e7\u00f5es para verificar o status do job e baixar os resultados<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Agora, escreva outra fun\u00e7\u00e3o chamada <code>get_bulk_validation_status<\/code> no mesmo script <code>bulk_email_validation.py<\/code> que verifica o status do job de valida\u00e7\u00e3o enviado. A resposta inclui um link para baixar os resultados da valida\u00e7\u00e3o nos formatos CSV e JSON. Neste tutorial, voc\u00ea usar\u00e1 JSON para baixar e processar ainda mais os resultados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para baixar os resultados da valida\u00e7\u00e3o, a fun\u00e7\u00e3o <code>get_bulk_validation_status<\/code> faz uma chamada para outra fun\u00e7\u00e3o chamada <code>download_validation_results<\/code>. O resultado baixado \u00e9 colocado dentro do diret\u00f3rio <code>validation_results<\/code> no formato de um arquivo JSON. V\u00e1 em frente e crie este diret\u00f3rio dentro do diret\u00f3rio <code>standalone_python_scripts<\/code>, em seguida, cole o seguinte c\u00f3digo que define essas duas fun\u00e7\u00f5es em <code>bulk_email_validation.py<\/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                                Python                            <\/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-Python\">\r\n                                <code id=\"code_0_content\" class=\"language-Python\">\r\n\r\n                                    def get_bulk_validation_status(list_name):rn    &quot;&quot;&quot;rn    This function checks the status of a bulk validation job and downloads the validation results.rnrn    :param list_name: The name of the mailing list for which the status is being checked.rn    :return: Validation results or None in case of failure.rn    &quot;&quot;&quot;rn    url = f&quot;{MAILGUN_API_URL}\/{list_name}&quot;rnrn    try:rn        # Send a GET request to Mailgun&#039;s API to fetch the job statusrn        response = requests.get(url, auth=(&quot;api&quot;, API_KEY))rnrn        # Check if the request was successfulrn        if response.status_code == 200:rn            logging.info(f&quot;Successfully retrieved validation status for {list_name}&quot;)rnrn            # Parse the JSON responsern            result = response.json()rnrn            # Fetch the download URL for JSON resultsrn            download_url = result.get(&quot;download_url&quot;, {}).get(&quot;json&quot;)rn            if download_url:rn                # Fetch and return the validation resultsrn                return download_validation_results(download_url)rn            else:rn                logging.info(&quot;Download URL not available.&quot;)rn                return Nonernrn        else:rn            logging.error(rn                f&quot;Error fetching job status: {response.status_code} {response.text}&quot;rn            )rn            return Nonernrn    except Exception as e:rn        logging.error(rn            f&quot;An error occurred while fetching bulk validation status: {str(e)}&quot;rn        )rn        return Nonernrndef download_validation_results(download_url):rn    &quot;&quot;&quot;rn    This function downloads and processes the bulk validation results from the provided URL.rnrn    :param download_url: The URL to download the validation results in JSON format.rn    :return: Parsed results or None in case of failure.rn    &quot;&quot;&quot;rn    try:rn        response = requests.get(download_url)rnrn        # Check if the request was successfulrn        if response.status_code == 200:rn            logging.info(&quot;Successfully downloaded validation results.&quot;)rnrn            with zipfile.ZipFile(io.BytesIO(response.content)) as zip_ref:rn                validation_results_path = os.path.join(rn                    os.getcwd(), &quot;validation_results&quot;rn                )rn                zip_ref.extractall(path=validation_results_path)rnrn            with zipfile.ZipFile(io.BytesIO(response.content)) as zip_ref:rn                for file in zip_ref.namelist():rn                    if file.endswith(&quot;.json&quot;):rn                        with zip_ref.open(file) as json_file:rn                            validation_results = json.load(json_file)rnrn            # Process the results (handle invalid emails, etc.)rn            process_validation_results(validation_results)rnrn            return validation_resultsrnrn        else:rn            logging.error(rn                f&quot;Error downloading results: {response.status_code} {response.text}&quot;rn            )rn            return Nonernrn    except Exception as e:rn        logging.error(rn            f&quot;An error occurred while downloading validation results: {str(e)}&quot;rn        )rn        return Nonern\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\">Analisando e lidando com resultados de valida\u00e7\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Assim que tiver baixado e obtido acesso aos resultados da valida\u00e7\u00e3o, voc\u00ea precisar\u00e1 analis\u00e1-los e process\u00e1-los. Esta etapa \u00e9 crucial para identificar e-mails entreg\u00e1veis e n\u00e3o entreg\u00e1veis.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cole o seguinte c\u00f3digo para definir a fun\u00e7\u00e3o em <code>bulk_email_validation.py<\/code> que realiza esta tarefa descrita:<\/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                                Python                            <\/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-Python\">\r\n                                <code id=\"code_0_content\" class=\"language-Python\">\r\n\r\n                                    def process_validation_results(results):rn    &quot;&quot;&quot;rn    This function processes the validation results and handles invalid and risky emails.rnrn    :param results: The JSON object containing the validation results.rn    &quot;&quot;&quot;rn    try:rn        count_of_deliverable_addresses: int = 0rn        emails_tobe_verified = set()rnrn        # Extract the results summaryrn        logging.info(f&quot;Total email addresses validated: {len(results)}&quot;)rnrn        for result in results:rn            # Access data within each dictionaryrn            deliverable = (rn                result[&quot;result&quot;] == &quot;deliverable&quot;rn            )  # Check if result is deliverablern            undeliverable = result[&quot;result&quot;] != &quot;deliverable&quot;rn            risk = result[&quot;risk&quot;]rnrn            # Count the number of deliverable addressesrn            if deliverable:rn                count_of_deliverable_addresses += 1rnrn            # Count the number of undeliverable addresses and add them to the list for verificationrn            if undeliverable:rn                emails_tobe_verified.add(result[&quot;address&quot;])rnrn            # Count the number of risky addresses and add them to the list for verificationrn            if risk != &quot;low&quot;:rn                emails_tobe_verified.add(result[&quot;address&quot;])rnrn        # Log the results summaryrn        logging.info(f&quot;Found {count_of_deliverable_addresses} deliverable emails&quot;)rnrn        if len(emails_tobe_verified) &gt; 0:rn            logging.warning(rn                &quot;Found some emails that need to be verified because of its risky or undeliverable state.&quot;rn            )rn            logging.warning(rn                &quot;Total emails to be verified: {}&quot;.format(len(emails_tobe_verified))rn            )rn            logging.warning(f&quot;Emails to be verified: {&#039;, &#039;.join(emails_tobe_verified)}&quot;)rnrn    except Exception as e:rn        logging.error(rn            f&quot;An error occurred while processing validation results: {str(e)}&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\">Agora, defina as instru\u00e7\u00f5es para chamar essas fun\u00e7\u00f5es com 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                                Python                            <\/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-Python\">\r\n                                <code id=\"code_0_content\" class=\"language-Python\">\r\n\r\n                                    if __name__ == &quot;__main__&quot;:rnrn    if COMMAND == &quot;submit_job&quot;:rn        create_bulk_validation_job(LIST_NAME, FILE_PATH)rn    elif COMMAND == &quot;get_job_status&quot;:rn        get_bulk_validation_status(LIST_NAME)rn    else:rn        logging.error(&quot;Invalid command. Please use &#039;submit_job&#039; or &#039;get_job_status&#039;.&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<h2 class=\"wp-block-heading\">O script final<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">No geral, todo o script <code>bulk_email_validation.py<\/code> faz o trabalho pesado de postar uma solicita\u00e7\u00e3o de valida\u00e7\u00e3o de e-mail em massa, consultar o status da solicita\u00e7\u00e3o de job de valida\u00e7\u00e3o enviada e processar os resultados. Depois de concluir todas as altera\u00e7\u00f5es, seu script <code>bulk_email_validation.py<\/code> deve ser parecido com <a href=\"https:\/\/github.com\/rajkumarvenkatasamy\/bulk-email-validation-using-mailgun-and-python\/blob\/main\/standalone_python_scripts\/bulk_email_validation.py\" target=\"_tabs\" rel=\"noopener noreferrer\">esta<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em todo o script, o uso de blocos try&#8230;except garante que quaisquer erros durante as chamadas da API sejam tratados. Isso \u00e9 especialmente importante para ambientes de produ\u00e7\u00e3o onde podem surgir problemas inesperados, como quando seu aplicativo n\u00e3o consegue acessar os endpoints do servi\u00e7o do Mailgun ou quando voc\u00ea tenta enviar uma solicita\u00e7\u00e3o de job de valida\u00e7\u00e3o com o mesmo nome de lista. As mensagens de erro e os coment\u00e1rios no c\u00f3digo-fonte ajudam a explicar os v\u00e1rios outros cen\u00e1rios que s\u00e3o tratados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se voc\u00ea estiver reenviando a solicita\u00e7\u00e3o de job de valida\u00e7\u00e3o com o mesmo nome de lista (voc\u00ea aprender\u00e1 a executar o script nas se\u00e7\u00f5es seguintes), o script tamb\u00e9m est\u00e1 equipado para lidar com tais cen\u00e1rios, lan\u00e7ando a mensagem de erro correspondente com uma descri\u00e7\u00e3o:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>2024-09-28 07:34:39,081 - ERROR - create_bulk_validation_job - Error creating validation job: 409 {\"message\":\"List already exists.\"}<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se voc\u00ea encontrar um erro de rede entre seu aplicativo e o servi\u00e7o do Mailgun, poder\u00e1 implementar um mecanismo de repeti\u00e7\u00e3o. Voc\u00ea pode criar o seu pr\u00f3prio ou usar uma biblioteca como o <a href=\"https:\/\/tenacity.readthedocs.io\/en\/latest\/\" target=\"_tabs\" rel=\"noopener noreferrer\">tenacity<\/a> para definir quantas vezes repetir a solicita\u00e7\u00e3o se ela falhar devido a problemas tempor\u00e1rios de conectividade. Voc\u00ea tamb\u00e9m pode implementar outros cen\u00e1rios de tratamento de erros conforme as demandas do seu projeto ou neg\u00f3cio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Neste ponto, voc\u00ea terminou de configurar o projeto e \u00e9 hora de execut\u00e1-lo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testando ao enviar uma solicita\u00e7\u00e3o de job de valida\u00e7\u00e3o de e-mail em massa<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para executar o script a fim de enviar a solicita\u00e7\u00e3o de job de valida\u00e7\u00e3o em massa, abra um terminal e mude para o diret\u00f3rio <code>standalone_python_scripts<\/code>. Execute o seguinte comando:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>python bulk_email_validation.py<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voc\u00ea deve ver uma sa\u00edda indicando que a solicita\u00e7\u00e3o de job foi enviada com sucesso para o servi\u00e7o do Mailgun:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>2024-09-28 19:47:34,012 - INFO - create_bulk_validation_job - Bulk validation job created successfully for bulk_mailing_list_validation_1<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testando ao buscar o status do job de valida\u00e7\u00e3o de e-mail em massa<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c0s vezes, dependendo do volume de endere\u00e7os de e-mail a serem validados, o job enviado levar\u00e1 tempos variados para ser conclu\u00eddo. Para obter o status da solicita\u00e7\u00e3o de job e processar os resultados se a solicita\u00e7\u00e3o estiver conclu\u00edda, edite o c\u00f3digo config.py para atualizar a configura\u00e7\u00e3o COMMAND para o valor <code>get_job_status<\/code>. Depois de conclu\u00eddo, execute o seguinte comando para realizar esta tarefa:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>python bulk_email_validation.py<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voc\u00ea deve ver uma sa\u00edda indicando que o job de valida\u00e7\u00e3o foi conclu\u00eddo, os resultados foram baixados e, em seguida, processados:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>2024-09-28 19:48:07,723 - INFO - get_bulk_validation_status - Successfully retrieved validation status for bulk_mailing_list_validation_1<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>2024-09-28 19:48:08,375 - INFO - download_validation_results - Successfully downloaded validation results.<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>2024-09-28 19:48:08,378 - INFO - process_validation_results - Total email addresses validated: 191<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>2024-09-28 19:48:08,378 - INFO - process_validation_results - Found 178 deliverable emails<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>2024-09-28 19:48:08,378 - WARNING - process_validation_results - Found some emails that need to be verified because of its risky or undeliverable state.<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>2024-09-28 19:48:08,378 - WARNING - process_validation_results - Total emails to be verified: 13<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>2024-09-28 19:48:08,378 - WARNING - process_validation_results - Emails to be verified: <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>dummy_email@dummydomain1.com, dummy_email@dummydomain2.com, hellojohnsemail123@gmail.com, dummy_email@dummydomain3.com, non_existent_email_id_123456789@gmail.com, dummy_email@dummydomain.com, dummy_email@dummydomain4.com, dummy_email@dummydomain5.com, dummy_email@dummydomain6.com, dummy_email@dummydomain7.com, dummy_email@dummydomain8.com, test_email@testemaildomain.com, electronix84@gmail.com<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esta sa\u00edda indica que, dos 191 endere\u00e7os de e-mail enviados para valida\u00e7\u00e3o, 178 s\u00e3o categorizados como entreg\u00e1veis, e os 13 restantes n\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O script identifica os endere\u00e7os de e-mail a serem verificados analisando a resposta das APIs do Mailgun e exibindo a lista na sa\u00edda. Agora cabe a voc\u00ea decidir qual curso de a\u00e7\u00e3o tomar com base nas necessidades do seu projeto ou neg\u00f3cio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Integrando a valida\u00e7\u00e3o de e-mail em massa em um aplicativo Django<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Agora que voc\u00ea aprendeu essas t\u00e9cnicas, pode optar por aplic\u00e1-las em seu aplicativo Django criando endpoints para fazer o upload de uma lista de e-mails com endere\u00e7os de e-mail em massa e valid\u00e1-los.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voc\u00ea pode consultar ou clonar <a href=\"https:\/\/github.com\/rajkumarvenkatasamy\/bulk-email-validation-using-mailgun-and-python.git\" target=\"_tabs\" rel=\"noopener noreferrer\">este reposit\u00f3rio do GitHub<\/a> se quiser experimentar e acompanhar. O diret\u00f3rio bulk_email_validation cont\u00e9m o c\u00f3digo-fonte do projeto Django. A seguir est\u00e3o os principais arquivos envolvidos neste projeto:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A <a href=\"https:\/\/github.com\/rajkumarvenkatasamy\/bulk-email-validation-using-mailgun-and-python\/blob\/main\/requirements.txt\" target=\"_tabs\" rel=\"noopener noreferrer\">arquivo requirements.txt<\/a> cont\u00e9m as depend\u00eancias necess\u00e1rias para este projeto Django.<\/li>\n\n\n\n<li>A <a href=\"https:\/\/github.com\/rajkumarvenkatasamy\/bulk-email-validation-using-mailgun-and-python\/blob\/main\/bulk_email_validation\/app\/config.py\" target=\"_tabs\" rel=\"noopener noreferrer\">arquivo config.py<\/a> cont\u00e9m as configura\u00e7\u00f5es relacionadas ao servi\u00e7o do Mailgun.<\/li>\n\n\n\n<li>A <a href=\"https:\/\/github.com\/rajkumarvenkatasamy\/bulk-email-validation-using-mailgun-and-python\/blob\/main\/bulk_email_validation\/app\/views.py\" target=\"_tabs\" rel=\"noopener noreferrer\">arquivo views.py<\/a> cont\u00e9m a l\u00f3gica para processar as solicita\u00e7\u00f5es e respostas relacionadas aos endpoints de valida\u00e7\u00e3o de e-mail em massa.<\/li>\n\n\n\n<li>A <a href=\"https:\/\/github.com\/rajkumarvenkatasamy\/bulk-email-validation-using-mailgun-and-python\/blob\/main\/bulk_email_validation\/app\/serializers.py\" target=\"_tabs\" rel=\"noopener noreferrer\">arquivo serializers.py<\/a> cont\u00e9m classes que ajudam a traduzir dados entre objetos Python e formatos como JSON, facilitando o envio ou recebimento de dados para APIs de valida\u00e7\u00e3o de e-mail em massa com apenas algumas linhas de c\u00f3digo.<\/li>\n\n\n\n<li>A <a href=\"https:\/\/github.com\/rajkumarvenkatasamy\/bulk-email-validation-using-mailgun-and-python\/blob\/main\/bulk_email_validation\/urls.py\" target=\"_tabs\" rel=\"noopener noreferrer\">arquivo urls.py<\/a> cont\u00e9m os dois endpoints relacionados \u00e0 valida\u00e7\u00e3o de e-mail em massa. Um endpoint serve para enviar a solicita\u00e7\u00e3o do job de valida\u00e7\u00e3o de e-mail em massa; o outro \u00e9 para obter o status e processar os resultados.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">As capturas de tela abaixo t\u00eam como objetivo ajudar voc\u00ea a entender os endpoints com os quais este aplicativo Django lida e as sa\u00eddas que ele pode gerar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A primeira captura de tela indica a solicita\u00e7\u00e3o POST com op\u00e7\u00f5es para fazer o upload do arquivo de lista de e-mails e definir um nome para a lista de e-mails, juntamente com a resposta recebida ap\u00f3s o envio bem-sucedido da solicita\u00e7\u00e3o do job de valida\u00e7\u00e3o de e-mail em massa:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4082\" width=\"1980\" height=\"892\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.19.13_AM.png\" alt=\"validation job response after its completion:\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.19.13_AM.png 1980w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.19.13_AM-300x135.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.19.13_AM-768x346.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.19.13_AM-1024x461.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.19.13_AM-1536x692.png 1536w\" sizes=\"(max-width: 1980px) 100vw, 1980px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A segunda captura de tela indica a recupera\u00e7\u00e3o bem-sucedida da resposta do job de valida\u00e7\u00e3o ap\u00f3s sua conclus\u00e3o:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4083\" width=\"1964\" height=\"1156\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.19.20_AM.png\" alt=\"POST request  Screen\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.19.20_AM.png 1964w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.19.20_AM-300x177.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.19.20_AM-768x452.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.19.20_AM-1024x603.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2025-01-07_at_10.19.20_AM-1536x904.png 1536w\" sizes=\"(max-width: 1964px) 100vw, 1964px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Voc\u00ea pode ter um aplicativo de frontend desenvolvido com qualquer tecnologia de frontend de sua prefer\u00eancia e chamar esses endpoints do aplicativo Django para atingir seu objetivo de valida\u00e7\u00e3o de e-mail em massa.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Este tutorial ensinou como integrar a API de valida\u00e7\u00e3o de e-mail em massa do Mailgun aos seus aplicativos Python para garantir a precis\u00e3o e a entregabilidade das suas listas de e-mails. Desde a configura\u00e7\u00e3o da sua conta do Mailgun, a obten\u00e7\u00e3o da chave de API e o manuseio seguro, at\u00e9 a implementa\u00e7\u00e3o da valida\u00e7\u00e3o em massa, o envio de solicita\u00e7\u00f5es POST e GET, al\u00e9m do processamento dos resultados, agora voc\u00ea sabe como automatizar o processo de verifica\u00e7\u00e3o de e-mail. Voc\u00ea tamb\u00e9m explorou como gerenciar e-mails inv\u00e1lidos, lidar com erros comuns e integrar a valida\u00e7\u00e3o de e-mail em aplicativos da web maiores como o Django. Todo o c\u00f3digo-fonte apresentado para este tutorial est\u00e1 dispon\u00edvel em <a href=\"https:\/\/github.com\/rajkumarvenkatasamy\/bulk-email-validation-using-mailgun-and-python\/tree\/main\" target=\"_tabs\" rel=\"noopener noreferrer\">este reposit\u00f3rio do GitHub<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Seguindo estas etapas, voc\u00ea pode identificar efetivamente os e-mails entreg\u00e1veis da sua grande lista de e-mails, melhorando assim a qualidade das suas campanhas de e-mail, reduzindo as taxas de devolu\u00e7\u00e3o e protegendo a reputa\u00e7\u00e3o do remetente. O uso da poderosa API de valida\u00e7\u00e3o de e-mail em massa do Mailgun n\u00e3o apenas simplifica esse processo, mas tamb\u00e9m garante que sua entrega de e-mail seja mais confi\u00e1vel e eficiente. \u00c0 medida que voc\u00ea continua a otimizar sua estrat\u00e9gia de e-mail, confira <a href=\"https:\/\/www.mailgun.com\/pt\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Mailgun<\/a>, explore as suas diversas ofertas de produtos e utilize-as para melhorar ainda mais suas campanhas de e-mail e maximizar o impacto delas.<\/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_f1678aa66b39443d8541d024b2592798\">\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_f1678aa66b39443d8541d024b2592798\">\r\n                Obtenha aconselhamento de especialistas            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">A entregabilidade requer um certo n\u00edvel de compet\u00eancia. Se voc\u00ea precisar de orienta\u00e7\u00e3o para navegar pelas complexidades da entrega na caixa de entrada, pergunte sobre os Deliverability Services do Sinch Mailgun. Fornecemos especialistas t\u00e9cnicos dedicados, relat\u00f3rios regulares, estrat\u00e9gias personalizadas de entregabilidade e acesso a ferramentas \u00fateis.<\/div>\r\n                            <\/div>\r\n        \r\n        <div class=\"text-start mt-5\"><a href=\"https:\/\/www.mailgun.com\/solutions\/email-deliverability-service\/\"  class=\"btn btn-secondary\" >Talk to a strategist<\/a><\/div>\r\n    <\/aside>\r\n\r\n","protected":false},"excerpt":{"rendered":"<p>Aprenda a integrar a API de valida\u00e7\u00e3o de e-mail em massa do Mailgun com Python. Este guia abrange a configura\u00e7\u00e3o, o uso seguro da API e a verifica\u00e7\u00e3o eficiente de listas de e-mails.<\/p>\n","protected":false},"author":19,"featured_media":3952,"menu_order":0,"template":"","meta":{"_acf_changed":false,"footnotes":""},"blog_category":[19],"class_list":["post-20157","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>Verificar e-mails com Python e a API do Mailgun com este guia passo a passo - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"E-mails inv\u00e1lidos podem prejudicar sua reputa\u00e7\u00e3o. Aprenda a usar Python 3.9+ e a API de valida\u00e7\u00e3o de e-mail em massa do Mailgun para verificar listas de e-mails, melhorar a entregabilidade e proteger a reputa\u00e7\u00e3o do dom\u00ednio.\" \/>\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\/verificar-emails-com-python-e-api-do-mailgun\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Verificar e-mails com Python e a API do Mailgun com este guia passo a passo - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"E-mails inv\u00e1lidos podem prejudicar sua reputa\u00e7\u00e3o. Aprenda a usar Python 3.9+ e a API de valida\u00e7\u00e3o de e-mail em massa do Mailgun para verificar listas de e-mails, melhorar a entregabilidade e proteger a reputa\u00e7\u00e3o do dom\u00ednio.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/verificar-emails-com-python-e-api-do-mailgun\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-14T22:07:52+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=\"10 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\\\/verificar-emails-com-python-e-api-do-mailgun\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/verificar-emails-com-python-e-api-do-mailgun\\\/\",\"name\":\"Verificar e-mails com Python e a API do Mailgun com este guia passo a passo - 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\\\/verificar-emails-com-python-e-api-do-mailgun\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/verificar-emails-com-python-e-api-do-mailgun\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"datePublished\":\"2025-01-07T00:00:00+00:00\",\"dateModified\":\"2026-09-14T22:07:52+00:00\",\"description\":\"E-mails inv\u00e1lidos podem prejudicar sua reputa\u00e7\u00e3o. Aprenda a usar Python 3.9+ e a API de valida\u00e7\u00e3o de e-mail em massa do Mailgun para verificar listas de e-mails, melhorar a entregabilidade e proteger a reputa\u00e7\u00e3o do dom\u00ednio.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/verificar-emails-com-python-e-api-do-mailgun\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/verificar-emails-com-python-e-api-do-mailgun\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/verificar-emails-com-python-e-api-do-mailgun\\\/#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\\\/verificar-emails-com-python-e-api-do-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\":\"Verificando e-mails usando Python 3.9+ e 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":"Verificar e-mails com Python e a API do Mailgun com este guia passo a passo - Transactional Email API Service For Developers | Mailgun","description":"E-mails inv\u00e1lidos podem prejudicar sua reputa\u00e7\u00e3o. Aprenda a usar Python 3.9+ e a API de valida\u00e7\u00e3o de e-mail em massa do Mailgun para verificar listas de e-mails, melhorar a entregabilidade e proteger a reputa\u00e7\u00e3o do dom\u00ednio.","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\/verificar-emails-com-python-e-api-do-mailgun\/","og_locale":"pt_BR","og_type":"article","og_title":"Verificar e-mails com Python e a API do Mailgun com este guia passo a passo - Transactional Email API Service For Developers | Mailgun","og_description":"E-mails inv\u00e1lidos podem prejudicar sua reputa\u00e7\u00e3o. Aprenda a usar Python 3.9+ e a API de valida\u00e7\u00e3o de e-mail em massa do Mailgun para verificar listas de e-mails, melhorar a entregabilidade e proteger a reputa\u00e7\u00e3o do dom\u00ednio.","og_url":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/verificar-emails-com-python-e-api-do-mailgun\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","article_modified_time":"2026-09-14T22:07:52+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":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/verificar-emails-com-python-e-api-do-mailgun\/","url":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/verificar-emails-com-python-e-api-do-mailgun\/","name":"Verificar e-mails com Python e a API do Mailgun com este guia passo a passo - 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\/verificar-emails-com-python-e-api-do-mailgun\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/verificar-emails-com-python-e-api-do-mailgun\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","datePublished":"2025-01-07T00:00:00+00:00","dateModified":"2026-09-14T22:07:52+00:00","description":"E-mails inv\u00e1lidos podem prejudicar sua reputa\u00e7\u00e3o. Aprenda a usar Python 3.9+ e a API de valida\u00e7\u00e3o de e-mail em massa do Mailgun para verificar listas de e-mails, melhorar a entregabilidade e proteger a reputa\u00e7\u00e3o do dom\u00ednio.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/verificar-emails-com-python-e-api-do-mailgun\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/verificar-emails-com-python-e-api-do-mailgun\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/verificar-emails-com-python-e-api-do-mailgun\/#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\/verificar-emails-com-python-e-api-do-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":"Verificando e-mails usando Python 3.9+ e 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\/20157","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\/19"}],"version-history":[{"count":1,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/20157\/revisions"}],"predecessor-version":[{"id":20158,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/20157\/revisions\/20158"}],"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=20157"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog_category?post=20157"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}