{"id":19943,"date":"2025-01-07T00:00:00","date_gmt":"2025-01-07T00:00:00","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/verificar-emails-python-api-mailgun\/"},"modified":"2026-09-14T18:33:14","modified_gmt":"2026-09-14T18:33:14","slug":"verificar-emails-python-api-mailgun","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/verificar-emails-python-api-mailgun\/","title":{"rendered":"Verificaci\u00f3n de emails con Python 3.9+ y la API de Mailgun"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Tanto si env\u00edas emails transaccionales como newsletters o contenido promocional, mantener una lista de contactos limpia y verificada puede mejorar significativamente la entregabilidad, evitar que tus mensajes acaben en las carpetas de spam y proteger la reputaci\u00f3n de tu dominio. Las direcciones de email no v\u00e1lidas o mal escritas pueden causar tasas de rebote m\u00e1s altas, lo que se traduce en penalizaciones por parte de los proveedores de servicios de env\u00edo de emails y una menor interacci\u00f3n. En esta gu\u00eda aprender\u00e1s a verificar tus emails con la API de 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-7586\"><p class=\"h5 m-0\" id=\"toc-title-7586\">\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=\"#que-es-la-api-de-validacion-de-emails-para-envios-masivos-de-mailgun\">\u00bfQu\u00e9 es la API de validaci\u00f3n de emails para env\u00edos masivos de 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=\"#implementacion-de-la-validacion-masiva-de-emails-con-python-y-la-api-de-mailgun\">Implementaci\u00f3n de la validaci\u00f3n masiva de emails con Python y la API de 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=\"#configuracion-de-mailgun-para-la-validacion-masiva-de-emails\">Configuraci\u00f3n de Mailgun para la validaci\u00f3n masiva de emails<\/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=\"#configuracion-de-un-directorio-de-proyecto-y-dependencias\">Configuraci\u00f3n de un directorio de proyecto y dependencias<\/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=\"#creacion-de-un-proyecto-y-un-script-de-configuracion-de-python\">Creaci\u00f3n de un proyecto y un script de configuraci\u00f3n de Python<\/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=\"#preparacion-del-archivo-de-tu-lista-de-correo\">Preparaci\u00f3n del archivo de tu lista de correo<\/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=\"#creacion-de-un-trabajo-de-validacion-de-emails-masiva\">Creaci\u00f3n de un trabajo de validaci\u00f3n de emails masiva<\/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=\"#desarrollo-de-funciones-para-comprobar-el-estado-del-trabajo-y-descargar-los-resultados\">Desarrollo de funciones para comprobar el estado del trabajo y descargar los 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=\"#desarrollo-de-funciones-para-comprobar-el-estado-del-trabajo-y-descargar-los-resultados\">Desarrollo de funciones para comprobar el estado del trabajo y descargar los 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=\"#analisis-y-tratamiento-de-los-resultados-de-la-validacion\">An\u00e1lisis y tratamiento de los resultados de la validaci\u00f3n<\/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=\"#el-script-final\">El 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=\"#prueba-mediante-el-envio-de-una-solicitud-de-trabajo-de-validacion-de-emails-masiva\">Prueba mediante el env\u00edo de una solicitud de trabajo de validaci\u00f3n de emails masiva<\/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=\"#prueba-obteniendo-el-estado-del-trabajo-de-validacion-de-emails-masiva\">Prueba obteniendo el estado del trabajo de validaci\u00f3n de emails masiva<\/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=\"#integracion-de-la-validacion-masiva-de-emails-en-una-aplicacion-django\">Integraci\u00f3n de la validaci\u00f3n masiva de emails en una aplicaci\u00f3n 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=\"#en-resumen\">En resumen<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 es la API de validaci\u00f3n de emails para env\u00edos masivos de 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\">La API de validaci\u00f3n de emails para env\u00edos masivos de Mailgun<\/a> est\u00e1 dise\u00f1ada para que la verificaci\u00f3n de emails sea escalable y eficiente. Con ella, el equipo de desarrollo puede validar listas de contactos enteras, comprobando si existen problemas habituales como errores de sintaxis, emails desechables o direcciones con servidores de email inactivos. La API proporciona resultados detallados para cada email, lo que facilita tomar las medidas oportunas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este tutorial, aprender\u00e1s a integrar la API de validaci\u00f3n de emails para env\u00edos masivos de Mailgun en tus aplicaciones Python. Desde la configuraci\u00f3n de tu cuenta de Mailgun y el manejo seguro de credenciales hasta la escritura de c\u00f3digo que valida emails y procesa los resultados, esta gu\u00eda proporciona instrucciones paso a paso para verificar grandes listas de contactos de forma eficaz.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Implementaci\u00f3n de la validaci\u00f3n masiva de emails con Python y la API de Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de empezar con este tutorial, aseg\u00farate de tener lo siguiente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Conocimientos b\u00e1sicos de programaci\u00f3n en 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>Un <a href=\"https:\/\/signup.mailgun.com\/new\/signup\" target=\"_tabs\" rel=\"noopener noreferrer\">Cuenta de Mailgun<\/a>; es necesario tener una cuenta de pago para este tutorial<\/li>\n\n\n\n<li>Experiencia en el desarrollo de aplicaciones basadas en <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 utiliza el sistema operativo Windows. Aunque todas las instrucciones tambi\u00e9n deber\u00edan funcionar en Linux y macOS, aseg\u00farate de cambiar los delimitadores de ruta del sistema operativo o las referencias de sintaxis seg\u00fan sea necesario.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configuraci\u00f3n de Mailgun para la validaci\u00f3n masiva de emails<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para empezar, <a href=\"https:\/\/app.mailgun.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\">inicia sesi\u00f3n en tu cuenta de Mailgun<\/a> y dir\u00edgete al panel de control. Despl\u00e1zate hacia abajo y selecciona la opci\u00f3n <b>\u201cAPI keys\u201d<\/b>:<\/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\">Haz clic en <b>\u201cAdd new key\u201d<\/b> para a\u00f1adir una nueva clave 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\">Escribe una descripci\u00f3n (como \u201cBulk Email Validation API Key\u201d) y haz clic en <b>\u201cCreate Key\u201d<\/b>:<\/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\">Una vez creada la clave de API, copia la informaci\u00f3n de la clave, ya que la necesitar\u00e1s m\u00e1s adelante. Si te olvidas de copiar la informaci\u00f3n o pierdes la clave, no te preocupes; puedes eliminar tu clave de API y crear una nueva.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configuraci\u00f3n de un directorio de proyecto y dependencias<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Crea un directorio de proyecto en tu equipo y accede a dicho directorio. A continuaci\u00f3n, abre un terminal con la ruta apuntando al directorio actual del proyecto y ejecuta el siguiente comando para crear un entorno virtual de 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\">Activa el entorno virtual:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>venvScriptsactivate<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n, instala la biblioteca requests, que se utilizar\u00e1 para interactuar con los puntos de conexi\u00f3n de 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\">Creaci\u00f3n de un proyecto y un script de configuraci\u00f3n de Python<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez activado tu entorno virtual, crea un nuevo directorio dentro del proyecto llamado <code>standalone_python_scripts<\/code>, donde desarrollar\u00e1s los m\u00f3dulos de Python necesarios para llevar a cabo la validaci\u00f3n de emails masiva utilizando los puntos de conexi\u00f3n de Mailgun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este nuevo directorio, crea un nuevo archivo Python llamado <code>config.py<\/code> y pega el siguiente c\u00f3digo para configurar la aplicaci\u00f3n del script independiente de Python:<\/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=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\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 configuraci\u00f3n contiene las variables de configuraci\u00f3n necesarias para llevar a cabo la solicitud de validaci\u00f3n de emails masiva.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Configura una nueva variable de entorno, MAILGUN_API_KEY, en tu m\u00e1quina host ejecutando el siguiente 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\">Esto asigna la clave de API que generaste anteriormente durante la configuraci\u00f3n de la cuenta de Mailgun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si utilizas Linux o Mac, ejecuta el siguiente 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\"> Al almacenar la clave de API en una variable de entorno en lugar de incluirla en el c\u00f3digo fuente del archivo de configuraci\u00f3n, mantienes protegida la informaci\u00f3n confidencial.<\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Por ahora, deja los valores de las dem\u00e1s variables tal y como est\u00e1n. La variable LIST_NAME contiene el nombre identificador de la lista de correo que se va a validar. FILE_PATH contiene la ruta al archivo CSV de entrada que incluye la lista de emails a validar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Preparaci\u00f3n del archivo de tu lista de correo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora que el script de configuraci\u00f3n hace referencia a una ruta de archivo de lista de correo a trav\u00e9s de la variable FILE_PATH, necesitas una lista de correo real con direcciones de email para validarla. Crea un archivo llamado <code>mailing_list.csv<\/code> en el directorio <code>standalone_python_scripts directory<\/code> y pega unas cuantas direcciones de email de muestra para empezar:<\/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\">Las direcciones de email utilizadas aqu\u00ed no son v\u00e1lidas. Puedes a\u00f1adir otras v\u00e1lidas o no v\u00e1lidas con el mismo formato usando tu propia lista de direcciones de email.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Creaci\u00f3n de un trabajo de validaci\u00f3n de emails masiva<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Con la lista de correo en su sitio y la configuraci\u00f3n para el proceso de validaci\u00f3n lista, es el momento de establecer una funci\u00f3n para crear un trabajo de validaci\u00f3n de emails masiva con Mailgun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En el mismo directorio, crea un archivo de script de Python llamado <code>bulk_email_validation.py<\/code> y define una funci\u00f3n <code>create_bulk_validation_job<\/code> que admita dos par\u00e1metros, <code>list_name<\/code> (nombre de la lista de correo) y <code>file_path <\/code>(ruta al archivo que contiene los emails):<\/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=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\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\">La funci\u00f3n env\u00eda una solicitud POST a la API de Mailgun para iniciar el proceso de validaci\u00f3n de emails masiva. La solicitud incluye el archivo de direcciones de email que hay que validar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Desarrollo de funciones para comprobar el estado del trabajo y descargar los resultados<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora, escribe otra funci\u00f3n llamada <code>get_bulk_validation_status<\/code> en el mismo script <code>bulk_email_validation.py<\/code> que compruebe el estado del trabajo de validaci\u00f3n enviado. La respuesta incluye un enlace para descargar los resultados de la validaci\u00f3n en formatos CSV y JSON. En este tutorial, utilizar\u00e1s JSON para descargar y procesar posteriormente los resultados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para descargar los resultados de la validaci\u00f3n, la funci\u00f3n <code>get_bulk_validation_status<\/code> realiza una llamada a otra funci\u00f3n llamada <code>download_validation_results<\/code>. El resultado descargado se coloca dentro del directorio <code>validation_results<\/code> en forma de archivo JSON. Crea este directorio dentro del directorio <code>standalone_python_scripts<\/code>, y pega el siguiente c\u00f3digo definiendo estas dos funciones en <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=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\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\">La funci\u00f3n env\u00eda una solicitud POST a la API de Mailgun para iniciar el proceso de validaci\u00f3n de emails masiva. La solicitud incluye el archivo de direcciones de email que hay que validar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Desarrollo de funciones para comprobar el estado del trabajo y descargar los resultados<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora, escribe otra funci\u00f3n llamada <code>get_bulk_validation_status<\/code> en el mismo script <code>bulk_email_validation.py<\/code> que compruebe el estado del trabajo de validaci\u00f3n enviado. La respuesta incluye un enlace para descargar los resultados de la validaci\u00f3n en formatos CSV y JSON. En este tutorial, utilizar\u00e1s JSON para descargar y procesar posteriormente los resultados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para descargar los resultados de la validaci\u00f3n, la funci\u00f3n <code>get_bulk_validation_status<\/code> realiza una llamada a otra funci\u00f3n llamada <code>download_validation_results<\/code>. El resultado descargado se coloca dentro del directorio <code>validation_results<\/code> en forma de archivo JSON. Crea este directorio dentro del directorio <code>standalone_python_scripts<\/code>, y pega el siguiente c\u00f3digo definiendo estas dos funciones en <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=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\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\">An\u00e1lisis y tratamiento de los resultados de la validaci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez que hayas descargado y obtenido acceso a los resultados de la validaci\u00f3n, tienes que analizarlos y procesarlos. Este paso es crucial para identificar los emails entregables y los no entregables.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pega el siguiente c\u00f3digo para definir la funci\u00f3n en <code>bulk_email_validation.py<\/code> que realiza esta tarea:<\/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=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\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\">Ahora, define las instrucciones para llamar a estas funciones con el siguiente 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=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\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\">El script final<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En general, todo el script <code>bulk_email_validation.py<\/code> hace el trabajo duro de enviar una solicitud de validaci\u00f3n de emails masiva, consultar el estado de la solicitud de trabajo de validaci\u00f3n enviada y procesar los resultados. Una vez que hayas terminado con todos los cambios, tu script <code>bulk_email_validation.py<\/code> deber\u00eda verse as\u00ed <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\">A lo largo del script, el uso de bloques try&#8230;except garantiza que se controle cualquier error durante las llamadas a la API. Esto es especialmente importante para los entornos de producci\u00f3n donde pueden surgir problemas inesperados, como cuando tu aplicaci\u00f3n no puede comunicarse con los puntos de conexi\u00f3n del servicio de Mailgun o cuando intentas enviar una solicitud de trabajo de validaci\u00f3n con el mismo nombre de lista. Los mensajes de error y los comentarios en el c\u00f3digo fuente ayudan a explicar los otros escenarios que se controlan.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si vuelves a enviar la solicitud de trabajo de validaci\u00f3n con el mismo nombre de lista (aprender\u00e1s a ejecutar el script en las siguientes secciones), el script est\u00e1 equipado para manejar tambi\u00e9n tales escenarios mostrando el correspondiente mensaje de error con una descripci\u00f3n:<\/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\">Si experimentas un error de red entre tu aplicaci\u00f3n y el servicio de Mailgun, puedes implementar un mecanismo de reintento. Puedes crear el tuyo propio o usar una biblioteca como <a href=\"https:\/\/tenacity.readthedocs.io\/en\/latest\/\" target=\"_tabs\" rel=\"noopener noreferrer\">tenacity<\/a> para definir cu\u00e1ntas veces hay que reintentar la solicitud si falla debido a problemas temporales de conectividad. Tambi\u00e9n puedes implementar otros escenarios de tratamiento de errores seg\u00fan lo exija tu proyecto o tu negocio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Llegados a este punto, ya has terminado de configurar el proyecto y es el momento de ejecutarlo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prueba mediante el env\u00edo de una solicitud de trabajo de validaci\u00f3n de emails masiva<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para ejecutar el script y enviar la solicitud de trabajo de validaci\u00f3n de emails masiva, abre un terminal y ve al directorio <code>standalone_python_scripts<\/code>. Ejecuta el siguiente 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\">Deber\u00edas ver una salida que indique que la solicitud de trabajo se ha enviado con \u00e9xito al servicio de 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\">Prueba obteniendo el estado del trabajo de validaci\u00f3n de emails masiva<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A veces, en funci\u00f3n del volumen de direcciones de email a validar, el trabajo enviado tardar\u00e1 m\u00e1s o menos en completarse. Para obtener el estado de la solicitud de trabajo y procesar los resultados si la solicitud est\u00e1 completa, edita el c\u00f3digo config.py para actualizar la configuraci\u00f3n de COMMAND con el valor <code>get_job_status<\/code>. Una vez hecho esto, ejecuta el siguiente comando para llevar a cabo esta tarea:<\/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\">Deber\u00edas ver una salida que indique que el trabajo de validaci\u00f3n se ha completado, que los resultados se han descargado y que luego se procesan:<\/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 salida indica que de las 191 direcciones de email enviadas para su validaci\u00f3n, 178 est\u00e1n categorizadas como entregables y las 13 restantes no.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El script identifica las direcciones de email que hay que verificar analizando la respuesta de las API de Mailgun y mostrando la lista en la salida. Ahora te toca a ti decidir qu\u00e9 medidas tomar en funci\u00f3n de las necesidades de tu proyecto o de tu negocio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Integraci\u00f3n de la validaci\u00f3n masiva de emails en una aplicaci\u00f3n Django<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora que has aprendido estas t\u00e9cnicas, puedes optar por aplicarlas en tu aplicaci\u00f3n Django creando puntos de conexi\u00f3n para subir una lista de correo con direcciones de email de forma masiva y validarlas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Puedes consultar o clonar <a href=\"https:\/\/github.com\/rajkumarvenkatasamy\/bulk-email-validation-using-mailgun-and-python.git\" target=\"_tabs\" rel=\"noopener noreferrer\">este repositorio de GitHub<\/a> si quieres experimentar y seguir paso a paso. El directorio bulk_email_validation contiene el c\u00f3digo fuente del proyecto Django. Los siguientes son los archivos clave que intervienen en este proyecto:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El <a href=\"https:\/\/github.com\/rajkumarvenkatasamy\/bulk-email-validation-using-mailgun-and-python\/blob\/main\/requirements.txt\" target=\"_tabs\" rel=\"noopener noreferrer\">El archivo requirements.txt<\/a> contiene las dependencias necesarias para este proyecto Django.<\/li>\n\n\n\n<li>El <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\">El archivo config.py<\/a> contiene la configuraci\u00f3n relacionada con el servicio de Mailgun.<\/li>\n\n\n\n<li>El <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\">El archivo views.py<\/a> contiene la l\u00f3gica para procesar la solicitud y las respuestas relacionadas con los puntos de conexi\u00f3n de validaci\u00f3n de emails masiva.<\/li>\n\n\n\n<li>El <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\">El archivo serializers.py<\/a> contiene clases que ayudan a traducir datos entre objetos de Python y formatos como JSON, lo que facilita el env\u00edo o recepci\u00f3n de datos para las API de validaci\u00f3n masiva de emails con solo unas pocas l\u00edneas de c\u00f3digo.<\/li>\n\n\n\n<li>El <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\">El archivo urls.py<\/a> contiene los dos puntos de conexi\u00f3n relacionados con la validaci\u00f3n de emails masiva. Un punto de conexi\u00f3n sirve para enviar la solicitud de trabajo de validaci\u00f3n de emails masiva; el otro sirve para obtener el estado y procesar los resultados.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Las siguientes capturas de pantalla est\u00e1n pensadas para ayudarte a comprender los puntos de conexi\u00f3n que trata esta aplicaci\u00f3n Django y la salida que puede generar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La primera captura de pantalla muestra la solicitud POST con las opciones para subir el archivo de la lista de correo y establecer un nombre para dicha lista, junto con la respuesta recibida tras el env\u00edo correcto de la solicitud de trabajo de validaci\u00f3n de emails masiva:<\/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\">La segunda captura de pantalla indica la correcta recuperaci\u00f3n de la respuesta del trabajo de validaci\u00f3n tras su finalizaci\u00f3n:<\/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\">Puedes desarrollar una aplicaci\u00f3n frontend con cualquier tecnolog\u00eda frontend que desees y llamar a estos puntos de conexi\u00f3n de la aplicaci\u00f3n Django para cumplir con tu objetivo de validaci\u00f3n de emails masiva.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">En resumen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Este tutorial te ha ense\u00f1ado a integrar la API de validaci\u00f3n de emails para env\u00edos masivos de Mailgun en tus aplicaciones Python con el fin de garantizar la exactitud y la entregabilidad de tus listas de contactos. Desde la configuraci\u00f3n de tu cuenta de Mailgun, la obtenci\u00f3n de la clave de API y su gesti\u00f3n segura hasta la implementaci\u00f3n de la validaci\u00f3n de emails masiva, el env\u00edo de solicitudes POST y GET y el procesamiento de los resultados, ahora sabes c\u00f3mo automatizar el proceso de verificaci\u00f3n de emails. Tambi\u00e9n has explorado c\u00f3mo gestionar los emails no v\u00e1lidos, controlar los errores habituales e integrar la validaci\u00f3n de emails en aplicaciones web m\u00e1s grandes como Django. Todo el c\u00f3digo fuente presentado en este tutorial est\u00e1 disponible en <a href=\"https:\/\/github.com\/rajkumarvenkatasamy\/bulk-email-validation-using-mailgun-and-python\/tree\/main\" target=\"_tabs\" rel=\"noopener noreferrer\">este repositorio de GitHub<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al seguir estos pasos, puedes identificar de forma eficaz los emails entregables de tu gran lista de correo, lo que te permitir\u00e1 mejorar la calidad de tus campa\u00f1as de email, reducir las tasas de rebote y proteger tu reputaci\u00f3n como remitente. El uso de la potente API de validaci\u00f3n de emails para env\u00edos masivos de Mailgun no solo agiliza este proceso, sino que tambi\u00e9n garantiza que la entrega de tus emails sea m\u00e1s fiable y eficiente. A medida que contin\u00faas optimizando tu estrategia de email, consulta <a href=\"https:\/\/www.mailgun.com\/es\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Mailgun<\/a>, explora sus diversas ofertas de productos y util\u00edzalos para mejorar a\u00fan m\u00e1s tus campa\u00f1as de email y maximizar su impacto.<\/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_7affca8f33366967a1796555e2917bc1\">\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_7affca8f33366967a1796555e2917bc1\">\r\n                Obt\u00e9n asesoramiento de expertos            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">La entregabilidad requiere un cierto nivel de competencia. Si necesitas orientaci\u00f3n para navegar por las complejidades de la colocaci\u00f3n en la bandeja de entrada, pregunta por los servicios de entregabilidad de Sinch Mailgun. Ofrecemos expertos t\u00e9cnicos dedicados, informes peri\u00f3dicos, estrategias de entregabilidad personalizadas y acceso a herramientas \u00fatiles.<\/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>Aprende a integrar la API de validaci\u00f3n de emails para env\u00edos masivos de Mailgun con Python. Esta gu\u00eda cubre la configuraci\u00f3n, el uso seguro de la API y la verificaci\u00f3n eficiente de tu lista de contactos.<\/p>\n","protected":false},"author":19,"featured_media":3952,"menu_order":0,"template":"","meta":{"_acf_changed":false,"footnotes":""},"blog_category":[19],"class_list":["post-19943","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>Verificaci\u00f3n de emails con Python y la API de Mailgun paso a paso - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Los emails no v\u00e1lidos pueden perjudicar tu reputaci\u00f3n. Aprende a usar Python 3.9+ y la API de validaci\u00f3n de emails para env\u00edos masivos de Mailgun para verificar listas de contactos, mejorar la entregabilidad y proteger la reputaci\u00f3n del dominio.\" \/>\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\/es\/blog\/dev-life\/verificar-emails-python-api-mailgun\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Verificaci\u00f3n de emails con Python y la API de Mailgun paso a paso - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Los emails no v\u00e1lidos pueden perjudicar tu reputaci\u00f3n. Aprende a usar Python 3.9+ y la API de validaci\u00f3n de emails para env\u00edos masivos de Mailgun para verificar listas de contactos, mejorar la entregabilidad y proteger la reputaci\u00f3n del dominio.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/verificar-emails-python-api-mailgun\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-14T18:33:14+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\\\/es\\\/blog\\\/dev-life\\\/verificar-emails-python-api-mailgun\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/verificar-emails-python-api-mailgun\\\/\",\"name\":\"Verificaci\u00f3n de emails con Python y la API de Mailgun paso a paso - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/verificar-emails-python-api-mailgun\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/verificar-emails-python-api-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-14T18:33:14+00:00\",\"description\":\"Los emails no v\u00e1lidos pueden perjudicar tu reputaci\u00f3n. Aprende a usar Python 3.9+ y la API de validaci\u00f3n de emails para env\u00edos masivos de Mailgun para verificar listas de contactos, mejorar la entregabilidad y proteger la reputaci\u00f3n del dominio.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/verificar-emails-python-api-mailgun\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/verificar-emails-python-api-mailgun\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/verificar-emails-python-api-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\\\/es\\\/blog\\\/dev-life\\\/verificar-emails-python-api-mailgun\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Verificaci\u00f3n de emails con Python 3.9+ y la API de Mailgun\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Potentes API de email transaccional que te permiten enviar, recibir y hacer seguimiento de emails, creadas pensando en los desarrolladores. \u00a1Descubre m\u00e1s!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#\\\/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\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Verificaci\u00f3n de emails con Python y la API de Mailgun paso a paso - Transactional Email API Service For Developers | Mailgun","description":"Los emails no v\u00e1lidos pueden perjudicar tu reputaci\u00f3n. Aprende a usar Python 3.9+ y la API de validaci\u00f3n de emails para env\u00edos masivos de Mailgun para verificar listas de contactos, mejorar la entregabilidad y proteger la reputaci\u00f3n del dominio.","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\/es\/blog\/dev-life\/verificar-emails-python-api-mailgun\/","og_locale":"es_ES","og_type":"article","og_title":"Verificaci\u00f3n de emails con Python y la API de Mailgun paso a paso - Transactional Email API Service For Developers | Mailgun","og_description":"Los emails no v\u00e1lidos pueden perjudicar tu reputaci\u00f3n. Aprende a usar Python 3.9+ y la API de validaci\u00f3n de emails para env\u00edos masivos de Mailgun para verificar listas de contactos, mejorar la entregabilidad y proteger la reputaci\u00f3n del dominio.","og_url":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/verificar-emails-python-api-mailgun\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","article_modified_time":"2026-09-14T18:33:14+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\/es\/blog\/dev-life\/verificar-emails-python-api-mailgun\/","url":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/verificar-emails-python-api-mailgun\/","name":"Verificaci\u00f3n de emails con Python y la API de Mailgun paso a paso - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/verificar-emails-python-api-mailgun\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/verificar-emails-python-api-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-14T18:33:14+00:00","description":"Los emails no v\u00e1lidos pueden perjudicar tu reputaci\u00f3n. Aprende a usar Python 3.9+ y la API de validaci\u00f3n de emails para env\u00edos masivos de Mailgun para verificar listas de contactos, mejorar la entregabilidad y proteger la reputaci\u00f3n del dominio.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/verificar-emails-python-api-mailgun\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/es\/blog\/dev-life\/verificar-emails-python-api-mailgun\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/verificar-emails-python-api-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\/es\/blog\/dev-life\/verificar-emails-python-api-mailgun\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/es\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/es\/blog\/"},{"@type":"ListItem","position":3,"name":"Verificaci\u00f3n de emails con Python 3.9+ y la API de Mailgun"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/es\/#website","url":"https:\/\/www.mailgun.com\/es\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Potentes API de email transaccional que te permiten enviar, recibir y hacer seguimiento de emails, creadas pensando en los desarrolladores. \u00a1Descubre m\u00e1s!","publisher":{"@id":"https:\/\/www.mailgun.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/es\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/#\/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\/es\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/19943","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/users\/19"}],"version-history":[{"count":1,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/19943\/revisions"}],"predecessor-version":[{"id":19944,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/19943\/revisions\/19944"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media\/3952"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media?parent=19943"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog_category?post=19943"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}