{"id":25207,"date":"2026-09-16T21:30:31","date_gmt":"2026-09-16T21:30:31","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/enviar-emails-con-python\/"},"modified":"2026-09-16T21:30:31","modified_gmt":"2026-09-16T21:30:31","slug":"enviar-emails-con-python","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/enviar-emails-con-python\/","title":{"rendered":"Enviar emails con Python 3 y la API de Mailgun"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Si quieres optimizar tu estrategia para enviar emails mediante programaci\u00f3n, est\u00e1s en buenas manos. Nuestro equipo de desarrollo tiene la experiencia que necesitas para empezar. Sigue leyendo para descubrir los detalles sobre c\u00f3mo integrar Python 3 con la potente API de email de Mailgun, con consejos, orientaci\u00f3n y optimizaciones a lo largo del proceso.<\/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-1360\"><p class=\"h5 m-0\" id=\"toc-title-1360\">\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=\"#primeros-pasos-que-necesitas-para-este-tutorial\">Primeros pasos: qu\u00e9 necesitas para este tutorial<\/a><a class=\"scrollme link-body-color\" href=\"#requisitos-previos\">Requisitos previos<\/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=\"#configurar-un-nuevo-proyecto-de-python\">Configurar un nuevo proyecto de Python<\/a><a class=\"scrollme link-body-color\" href=\"#como-obtener-una-clave-de-api-con-mailgun\">C\u00f3mo obtener una clave de API con 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=\"#importaciones-e-inicializacion\">Importaciones e inicializaci\u00f3n<\/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=\"#enviar-emails-individuales-mediante-la-api-de-mailgun\">Enviar emails individuales mediante 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\">05<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#envio-masivo-de-email-con-la-api-de-mailgun\">Env\u00edo masivo de email con la API de Mailgun<\/a><a class=\"scrollme link-body-color\" href=\"#como-puedo-enviar-varios-emails-personalizados\">\u00bfC\u00f3mo puedo enviar varios emails personalizados?\u00a0<\/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=\"#funciones-adicionales-de-la-api-de-email-de-mailgun\">Funciones adicionales de la API de email de Mailgun<\/a><a class=\"scrollme link-body-color\" href=\"#enviar-emails-en-html-con-archivos-adjuntos\">Enviar emails en HTML con archivos adjuntos<\/a><a class=\"scrollme link-body-color\" href=\"#entrega-y-seguimiento-de-emails\">Entrega y seguimiento de emails<\/a><a class=\"scrollme link-body-color\" href=\"#plantillas-de-email\">Plantillas de email<\/a><a class=\"scrollme link-body-color\" href=\"#pruebas-de-email\">Pruebas de email\u00a0<\/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=\"#bibliotecas-de-email-alternativas-de-python\">Bibliotecas de email alternativas de Python\u00a0<\/a><a class=\"scrollme link-body-color\" href=\"#smtplib\">smtplib\u00a0<\/a><a class=\"scrollme link-body-color\" href=\"#yagmail\">Yagmail\u00a0<\/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=\"#autenticacion-y-seguridad\">Autenticaci\u00f3n y seguridad\u00a0<\/a><a class=\"scrollme link-body-color\" href=\"#gestion-de-errores\">Gesti\u00f3n de errores\u00a0<\/a><a class=\"scrollme link-body-color\" href=\"#entregabilidad-de-emails\">Entregabilidad de emails\u00a0<\/a><a class=\"scrollme link-body-color\" href=\"#autentica-tu-email\">Autentica tu email\u00a0<\/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=\"#empieza-a-enviar-con-python-3-y-la-api-de-email-de-mailgun\">Empieza a enviar con Python 3 y la\u00a0API de email de\u00a0Mailgun<\/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=\"#preguntas-frecuentes\">Preguntas frecuentes<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Primeros pasos: qu\u00e9 necesitas para este tutorial<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A la hora de enviar un email, tienes dos opciones: manual o mediante programaci\u00f3n. Cuando hablamos de <a href=\"https:\/\/www.mailgun.com\/blog\/email\/what-is-transactional-email-basics\/\" target=\"_tabs\" rel=\"noopener noreferrer\">emails transaccionales<\/a> en concreto, hacerlo mediante programaci\u00f3n es la mejor opci\u00f3n. En lugar de enviar actualizaciones importantes por email o notificaciones de forma manual, puedes utilizar scripts de email automatizados para ahorrar tiempo y reducir errores.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Los scripts (peque\u00f1os programas que automatizan tareas) ofrecen una forma m\u00e1s eficiente de realizar env\u00edos masivos de email, programar mensajes o ejecutarse directamente desde tu aplicaci\u00f3n. Algunos casos de uso para enviar emails mediante scripts automatizados incluyen los siguientes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Enviar emails de bienvenida para el registro de usuarios<\/li>\n\n\n\n<li>Enviar notificaciones y alertas desde aplicaciones, como informar a los usuarios sobre el uso de su servicio o avisar al personal de administraci\u00f3n cuando los recursos del servidor son escasos<\/li>\n\n\n\n<li>Enviar informes, como un informe semanal sobre nuevos clientes<\/li>\n\n\n\n<li>Enviar campa\u00f1as de marketing (por ejemplo, para promocionar nuevos productos o servicios)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">En este tutorial, aprender\u00e1s a enviar emails utilizando scripts de Python 3 y la API de Mailgun.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Requisitos previos<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Para seguir este tutorial sobre Python 3 y la API de email, necesitar\u00e1s lo siguiente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Python 3.9 o superior. Python suele describirse como la navaja suiza de los lenguajes de programaci\u00f3n y ofrece una amplia gama de capacidades. Adem\u00e1s de sus m\u00faltiples usos, Python es excelente para escribir diversos scripts.<\/li>\n\n\n\n<li>Una cuenta de Mailgun. Mailgun es una plataforma de env\u00edo de emails que te permite enviar y hacer el seguimiento de los emails. <!-- -->Si a\u00fan no eres usuario de Mailgun, puedes seguir este tutorial utilizando <a href=\"https:\/\/signup.mailgun.com\/new\/signup\" target=\"_tabs\" rel=\"noopener noreferrer\">nuestra prueba gratuita<\/a>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Configurar un nuevo proyecto de Python<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Empecemos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Empieza creando un directorio adecuado para tu proyecto de Python y a\u00f1ade un archivo .env vac\u00edo en su interior. Antes de continuar, considera crear y activar un nuevo <a href=\"https:\/\/docs.python.org\/3\/library\/venv.html\" target=\"_tabs\" rel=\"noopener noreferrer\">entorno virtual<\/a> antes de instalar las bibliotecas de Python necesarias para este tutorial. Esto a\u00edsla tu proyecto, lo que evita conflictos de dependencias.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para instalar las bibliotecas necesarias (requests y python-dotenv) mediante pip en tu entorno virtual, ejecuta el siguiente comando:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">pip install requests python-dotenv<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La biblioteca requests te permite hacer llamadas a la API, mientras que la biblioteca python-dotenv te permite almacenar la clave de API fuera de tu c\u00f3digo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">C\u00f3mo obtener una clave de API con Mailgun<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n, obtendr\u00e1s una clave de API de tu cuenta de Mailgun, que utilizar\u00e1s para realizar llamadas a la API de Mailgun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inicia sesi\u00f3n en tu cuenta de Mailgun y crea una clave de API en la <a href=\"https:\/\/app.mailgun.com\/settings\/api_security\" target=\"_tabs\" rel=\"noopener noreferrer\">p\u00e1gina \u00abSeguridad de la API\u00bb<\/a>, a la que se puede acceder mediante un men\u00fa desplegable debajo de tu nombre en la esquina superior derecha.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4967\" width=\"1208\" height=\"732\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2024-05-15_at_8.20.19_PM.png\" alt=\"New API key location in Mailgun\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2024-05-15_at_8.20.19_PM.png 1208w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2024-05-15_at_8.20.19_PM-300x182.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2024-05-15_at_8.20.19_PM-768x465.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2024-05-15_at_8.20.19_PM-1024x621.png 1024w\" sizes=\"(max-width: 1208px) 100vw, 1208px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Copia y pega esta clave de API en el archivo .env de tu proyecto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MAILGUN_API_KEY=\u00bbTu clave de API aqu\u00ed\u00bb<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mientras est\u00e1s en Mailgun, anota tus dominios de env\u00edo desde el panel de control.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si tienes un plan gratuito, ver\u00e1s un dominio sandbox, que se utilizar\u00e1 en el punto de conexi\u00f3n de la API, as\u00ed como en la direcci\u00f3n de email del remitente al enviar emails a trav\u00e9s de la API de Mailgun. El dominio sandbox sigue el formato .<a href=\"http:\/\/mailgun.org\/\" target=\"_tabs\" rel=\"noopener noreferrer\">mailgun.org<\/a>, como se muestra a continuaci\u00f3n.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4968\" width=\"1392\" height=\"194\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/image2-4.png\" alt=\"Sandbox domain in Mailgun\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/image2-4.png 1392w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/image2-4-300x42.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/image2-4-768x107.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/image2-4-1024x143.png 1024w\" sizes=\"(max-width: 1392px) 100vw, 1392px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Tendr\u00e1s que pasar a un plan superior de pago si necesitas utilizar un dominio de email personalizado para enviar emails a trav\u00e9s de Mailgun. El plan gratuito solo permite el dominio sandbox y puedes enviar emails a un m\u00e1ximo de cinco direcciones verificadas. Sin embargo, este plan gratuito es \u00fatil durante la fase de desarrollo al integrar la API de Mailgun en tu sistema.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Importaciones e inicializaci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n, crea el archivo main.py en el directorio de tu proyecto y copia y pega este 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                                    ```python import jsonrnimport requestsrnimport loggingrnrnimport osrnfrom dotenv import load_dotenvrnrnlogging.basicConfig(level=logging.INFO) # set log levelrnload_dotenv() # for reading API key from `.env` file.rnrn# Sandbox API URL format: https:\/\/api.mailgun.net\/v3\/sandbox&lt;ID&gt;.mailgun.org\/messagesrnMAILGUN_API_URL = &quot;https:\/\/api.mailgun.net\/v3\/YOUR_DOMAIN_NAME\/messages&quot;rnFROM_EMAIL_ADDRESS = &quot;Sender Name &lt;SENDER_EMAIL_ID&gt;&quot;\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\">Utiliza el registro est\u00e1ndar de Python y lo configura al nivel INFO con este 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                                    ```pythonrnlogging.basicConfig(level=logging.INFO)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\">La funci\u00f3n load_dotenv() procede de la biblioteca python-dotenv y se utiliza para cargar las variables de entorno desde el archivo .env en tu c\u00f3digo de Python. Es una de las mejores pr\u00e1cticas almacenar y leer informaci\u00f3n sensible como credenciales y claves de API del archivo .env.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MAILGUN_API_URL establece la URL de la API para tu script de Python e indica el ID del email del remitente. Ambos deben utilizar tu dominio de env\u00edo de emails o el dominio sandbox mencionado anteriormente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Enviar emails individuales mediante la API de Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos primero la forma m\u00e1s sencilla de utilizar la API de Mailgun: enviar un solo email. Puedes usarla para casos puntuales, como enviar un recordatorio o un email de seguimiento a tu cliente de gran valor. Esto tambi\u00e9n te permitir\u00e1 hacer un seguimiento de la entrega del email.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Copia y pega el c\u00f3digo siguiente en tu archivo main.py, despu\u00e9s de las importaciones y la inicializaci\u00f3n:<\/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                                    ```pythonrndef send_single_email(to_address: str, subject: str, message: str):rn\u00a0\u00a0\u00a0\u00a0try:rn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0api_key = os.getenv(&quot;MAILGUN_API_KEY&quot;)\u00a0 # get API-Key from the `.env` filernrn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0resp = requests.post(MAILGUN_API_URL, auth=(&quot;api&quot;, api_key),rn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data={&quot;from&quot;: FROM_EMAIL_ADDRESS,rn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;to&quot;: to_address, &quot;subject&quot;: subject, &quot;text&quot;: message})rn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if resp.status_code == 200:\u00a0 # successrn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logging.info(f&quot;Successfully sent an email to &#039;{to_address}&#039; via Mailgun API.&quot;)rn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else:\u00a0 # errorrn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logging.error(f&quot;Could not send the email, reason: {resp.text}&quot;)rnrn\u00a0\u00a0\u00a0\u00a0except Exception as ex:rn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logging.exception(f&quot;Mailgun error: {ex}&quot;)rnrnif __name__ == &quot;__main__&quot;:rn\u00a0\u00a0\u00a0\u00a0send_single_email(&quot;Manish &lt;manish@exanple.com&gt;&quot;, &quot;Single email test&quot;, &quot;Testing Mailgun API for a single email&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\">Esta funci\u00f3n <b>send_single_email(&#8230;) <\/b> toma tres argumentos: <b>to_address<\/b>, <b>subject<\/b> y<b> message<\/b>. <b>to_address<\/b> corresponde a una \u00fanica direcci\u00f3n de email y las otras dos corresponden al asunto y al contenido del email.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El c\u00f3digo lee la clave de API de Mailgun desde el archivo .env y la utiliza para realizar una llamada a la API, lo que establece\u00a0una conexi\u00f3n segura con la API_URL especificada. Esta clave de API act\u00faa como un identificador \u00fanico, lo que permite a Mailgun autenticar la llamada a la API y verificar qui\u00e9n est\u00e1 utilizando sus servicios.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Debes utilizar tu clave de API \u00fanica para garantizar la correcta autenticaci\u00f3n. La direcci\u00f3n de email del remitente utilizada en esta llamada a la API tambi\u00e9n debe estar asociada a tu dominio v\u00e1lido o al dominio sandbox de Mailgun. En caso contrario, la llamada fallar\u00e1 con un mensaje de error.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Los par\u00e1metros de datos se env\u00edan a trav\u00e9s del m\u00e9todo HTTP POST al punto de conexi\u00f3n de la API con la llamada requests.post(&#8230;).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando la llamada a la API tiene \u00e9xito, tu email se a\u00f1adir\u00e1 a la cola de entrega y la API devolver\u00e1 un estado HTTP 200 (OK). En caso de error, la API devolver\u00e1 un mensaje de error con un c\u00f3digo de estado HTTP adecuado. Este fragmento de c\u00f3digo registra ambos casos adecuadamente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">if __name__ == \u00ab__main__\u00bb muestra c\u00f3mo se puede llamar a esta funci\u00f3n en tu script.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al ejecutar este script en tu terminal se mostrar\u00e1 lo siguiente:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4969\" width=\"800\" height=\"160\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/undefined_-_Imgur.gif\" alt=\"Python script running in terminal\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Env\u00edo masivo de email con la API de Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Aunque puedes utilizar la funci\u00f3n send_single_email(&#8230;) en un bucle para enviar emails a m\u00faltiples destinatarios, no es el m\u00e9todo m\u00e1s eficaz debido a los retrasos de E\/S de la red. Este enfoque tambi\u00e9n puede verse afectado por <a href=\"text=In%2520email%2520terms%252C%2520rate%2520limiting,send%2520during%2520that%2520time%2520frame.\" target=\"_tabs\" rel=\"noopener noreferrer\">la limitaci\u00f3n de velocidad de la API.<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En su lugar, utiliza <a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/sending-messages\/#batch-sending\" target=\"_tabs\" rel=\"noopener noreferrer\">Env\u00edo por lotes<\/a> para enviar emails a m\u00faltiples destinatarios. El siguiente fragmento de c\u00f3digo muestra c\u00f3mo utilizarlo en tu script de Python.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Copia y pega la funci\u00f3n send_batch_emails(&#8230;) en tu archivo main.py, despu\u00e9s de la funci\u00f3n send_single_email(&#8230;) y modifica la parte __main__ como se muestra a continuaci\u00f3n:<\/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                                    ```pythonrndef send_batch_emails(recipients: dict, subject: str, message: str):rn\u00a0\u00a0\u00a0\u00a0try:rn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0api_key = os.getenv(&quot;MAILGUN_API_KEY&quot;)\u00a0 # get API-Key from the `.env` filernrn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0to_address = list(recipients.keys())\u00a0 # get only email addressesrn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0recipients_json = json.dumps(recipients)\u00a0 \u00a0 # for API callrnrn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logging.info(f&quot;Sending email to {len(to_address)} IDs...&quot;)rn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0resp = requests.post(MAILGUN_API_URL, auth=(&quot;api&quot;, api_key),rn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data={&quot;from&quot;: FROM_EMAIL_ADDRESS,rn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;to&quot;: to_address, &quot;subject&quot;: subject, &quot;text&quot;: message,rn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;recipient-variables&quot;: recipients_json})rn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if resp.status_code == 200:\u00a0 # successrn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logging.info(f&quot;Successfully sent email to {len(recipients)} recipients via Mailgun API.&quot;)rn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else: \u00a0 # errorrn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logging.error(f&quot;Could not send emails, reason: {resp.text}&quot;)rn\u00a0\u00a0\u00a0\u00a0except Exception as ex:rn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logging.exception(f&quot;Mailgun error: {ex}&quot;)rnrnif __name__ == &quot;__main__&quot;:rn\u00a0\u00a0\u00a0\u00a0# send_single_email(&quot;Manish &lt;manish@exanple.com&gt;&quot;, &quot;Single email test&quot;, &quot;Testing Mailgun API for a single email&quot;)rn\u00a0\u00a0\u00a0\u00a0_recipients = {&quot;manish@example.com&quot;: {&quot;name&quot;: &quot;Manish&quot;, &quot;id&quot;: 1},rn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;jakkie@example.com&quot;: {&quot;name&quot;: &quot;Jakkie&quot;, &quot;id&quot;: 2},rn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;elzet@example.com&quot;: {&quot;name&quot;: &quot;Elzet&quot;, &quot;id&quot;: 3}}rnrn\u00a0\u00a0\u00a0\u00a0send_batch_emails(_recipients, &quot;Hi, %recipient.name%!&quot;, &quot;Testing Mailgun API. This email is sent via Mailgun API.&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<h3 class=\"wp-block-heading\">\u00bfC\u00f3mo puedo enviar varios emails personalizados?\u00a0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">El env\u00edo por lotes utiliza un par\u00e1metro especial llamado Recipient Variables que te permite enviar emails personalizados a m\u00faltiples destinatarios en una sola llamada a la API. Al utilizar Recipient Variables con el env\u00edo por lotes, te aseguras de que Mailgun env\u00eda emails individuales a cada destinatario en el campo \u00abPara\u00bb. Sin \u00e9l, cada destinatario ver\u00e1 todas las direcciones de email del resto en el campo \u00abPara\u00bb.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed tienes una de estas variables de destinatario, con las direcciones de email como claves y los correspondientes \u00abname\u00bb e \u00abid\u00bb como valores:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{\u00abmanish@example.com\u00bb: {\u00abname\u00bb: \u00abManish\u00bb, \u00abid\u00bb: 1},<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00abjakkie@example.com\u00bb: {\u00abname\u00bb: \u00abJakkie\u00bb, \u00abid\u00bb: 2},<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00abelzet@example.com\u00bb: {\u00abname\u00bb: \u00abElzet\u00bb, \u00abid\u00bb: 3}}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La funci\u00f3n send_batch_emails(&#8230;) tiene tres par\u00e1metros: recipients, subject y message. Ten en cuenta que recipients es un objeto de diccionario que representa la variable de destinatario explicada anteriormente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Primero, el c\u00f3digo extrae las direcciones de email de este diccionario utilizando to_address = list(recipients.keys()) y, a continuaci\u00f3n, convierte el diccionario a JSON para el uso de la API con la llamada recipients_json = json.dumps(recipients).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La variable recipients_json se pasa en la llamada a la API para el campo recipient-variables, que se utiliza para personalizar el asunto y el contenido del email. El asunto se especifica de la siguiente manera:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00ab\u00a1Hola, %recipient.name%!\u00bb<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La API de Mailgun sustituye correctamente el nombre de cada destinatario desde el JSON al enviar los emails con %recipient.name%. As\u00ed, en el ejemplo anterior, Manish, Jakkie y Elzet recibir\u00e1n l\u00edneas de asunto personalizadas: \u00ab\u00a1Hola, Manish!\u00bb , \u00ab\u00a1Hola, Jakkie!\u00bb y \u00ab\u00a1Hola, Elzet!\u00bb. De manera similar, puedes personalizar el contenido del email utilizando cualquier valor %recipient.KEY-NAME%.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El resto del c\u00f3digo send_batch_emails(&#8230;) es similar al de la funci\u00f3n send_single_email(&#8230;), salvo que se env\u00eda a m\u00faltiples destinatarios en una sola llamada a la API.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al ejecutar este script se mostrar\u00e1 lo siguiente:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4970\" width=\"800\" height=\"160\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/undefined_-_Imgur__1_.gif\" alt=\"Python script running in terminal\" \/><\/figure>\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\"> Ten en cuenta lo siguiente: el n\u00famero m\u00e1ximo de destinatarios permitidos en una sola llamada a la API de env\u00edo por lotes de Mailgun es de mil. Puedes encontrar m\u00e1s informaci\u00f3n sobre la <a href='https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/sending-messages\/#batch-sending'>API de env\u00edo por lotes<\/a> aqu\u00ed.<\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Este es un ejemplo de c\u00f3mo aparecer\u00e1 este email en la bandeja de entrada del destinatario:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4971\" width=\"1428\" height=\"344\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/image5-2.png\" alt=\"Email sent using Mailgun API\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/image5-2.png 1428w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/image5-2-300x72.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/image5-2-768x185.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/image5-2-1024x247.png 1024w\" sizes=\"(max-width: 1428px) 100vw, 1428px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Funciones adicionales de la API de email de Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La API de Mailgun ofrece varias funciones adicionales para facilitarte la vida.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Enviar emails en HTML con archivos adjuntos<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La API de Mailgun te permite <a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/sending-messages\/#send-with-attachments\" target=\"_tabs\" rel=\"noopener noreferrer\">enviar emails con archivos adjuntos<\/a>, ya sea con contenido de texto o HTML. Puedes utilizar el mismo punto de conexi\u00f3n de la API (https:\/\/api.mailgun.net\/v3\/YOUR_DOMAIN_NAME\/messages) con un \u00abattachment\u00bb adicional que se pasa al par\u00e1metro files, como se muestra a continuaci\u00f3n:<\/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                                    ```pythonrnfiles = {&#039;attachment&#039;: open(&#039;weekly-report.csv&#039;, &#039;rb&#039;)} \u00a0 \u00a0 # file you want to attachrnresp = requests.post(MAILGUN_API_URL, auth=(&quot;api&quot;, api_key), files=files,rn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data={&quot;from&quot;: FROM_EMAIL_ADDRESS,rn\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;to&quot;: to_address, &quot;subject&quot;: subject, &quot;text&quot;: message})rn```\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<h3 class=\"wp-block-heading\">Entrega y seguimiento de emails<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Mailgun proporciona <a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/tracking-messages\/\" target=\"_tabs\" rel=\"noopener noreferrer\">un seguimiento detallado de los emails<\/a>, lo que incluye saber cu\u00e1ndo se entregan o se abren los emails, si se hace clic en los enlaces, si hay un rebote en los emails, si se solicita la baja o si los emails se marcan como spam. Estos datos est\u00e1n disponibles mediante el panel de control y a trav\u00e9s de la API.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mailgun tambi\u00e9n guarda los emails de forma permanente si no se pueden entregar (rebote definitivo) o si un destinatario se da de baja o marca el email como spam. En estos casos, Mailgun no volver\u00e1 a intentar enviar emails a esos destinatarios.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Plantillas de email<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La API de Mailgun te permite <a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/sending-messages\/#templates\" target=\"_tabs\" rel=\"noopener noreferrer\">crear plantillas en HTML<\/a> para estandarizar el dise\u00f1o de tus emails y hacerlos m\u00e1s atractivos con dise\u00f1os predefinidos y contenido est\u00e1ndar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Puedes encontrar las plantillas en la barra lateral izquierda, en el men\u00fa de env\u00edos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pruebas de email\u00a0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Mailgun\u00a0tambi\u00e9n proporciona herramientas de pruebas de email para ayudarte a garantizar que tus mensajes se vean y funcionen como esperas. Con<a href=\"https:\/\/www.mailgun.com\/es\/productos\/inspeccionar\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noreferrer noopener\">\u00a0Inspeccionar<\/a>, puedes comprobar autom\u00e1ticamente si hay problemas como enlaces rotos, im\u00e1genes que faltan o disparadores de spam. El<a href=\"https:\/\/www.mailgun.com\/es\/funciones\/previsualizacion-de-email\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noreferrer noopener\">\u00a0Previsualizaci\u00f3n de emails<\/a>\u00a0te permite ver c\u00f3mo se procesar\u00e1 tu email\u00a0en diferentes clientes y dispositivos, mientras que<a href=\"https:\/\/www.mailgun.com\/es\/funciones\/accesibilidad-del-email\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noreferrer noopener\">\u00a0Accesibilidad del email<\/a>\u00a0las pruebas ayudan a confirmar que tu contenido cumple las normas de accesibilidad. Puedes obtener m\u00e1s informaci\u00f3n sobre el  <a href=\"https:\/\/www.mailgun.com\/es\/soluciones\/software-de-pruebas-de-email\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noreferrer noopener\">software de pruebas de email<\/a>\u00a0 de Mailgun e integrar estas comprobaciones en tu flujo de trabajo al crear emails con la API.\u00a0<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bibliotecas de email alternativas de Python\u00a0<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de recurrir a una API de email dedicada,\u00a0merece la pena conocer las herramientas nativas que proporciona Python para enviar emails, junto con algunas opciones ligeras de terceros.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Python incluye dos m\u00f3dulos principales para el email basado en SMTP:\u00a0smtplib\u00a0y email.\u00a0\u00a0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">smtplib\u00a0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">El m\u00f3dulo\u00a0smtplib\u00a0gestiona las sesiones SMTP y te permite conectarte a un servidor SMTP mediante SMTP_SSL() para TLS impl\u00edcito (normalmente en el puerto 465) o\u00a0SMTP() con\u00a0starttls() para TLS oportunista (normalmente en el puerto 587). La autenticaci\u00f3n se maneja con un nombre de usuario y una contrase\u00f1a est\u00e1ndar.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El paquete email\u00a0se encarga de\u00a0la creaci\u00f3n de los mensajes.\u00a0EmailMessage\u00a0ofrece una API moderna y de alto nivel, mientras que\u00a0MIMEText\u00a0y\u00a0MIMEMultipart\u00a0ofrecen asistencia para texto sin formato, HTML y cargas \u00fatiles multiparte.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este c\u00f3digo crea un email sencillo y lo env\u00eda de forma segura a trav\u00e9s de un servidor SMTP usando 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                                    from\u00a0email.message\u00a0import EmailMessage\u00a0\r\nimport smtplib\u00a0\r\n\u00a0\r\nmsg =\u00a0EmailMessage()\u00a0\r\nmsg[&quot;From&quot;] = &quot;you@example.com&quot;\u00a0\r\nmsg[&quot;To&quot;] = &quot;friend@example.com&quot;\u00a0\r\nmsg[&quot;Subject&quot;] = &quot;Hello&quot;\u00a0\r\nmsg.set_content(&quot;Sent with Python!&quot;)\u00a0\r\n\u00a0\r\nwith\u00a0smtplib.SMTP(&quot;smtp.example.com&quot;, 587) as smtp:\u00a0\r\n\u00a0\u00a0\u00a0\u00a0smtp.starttls()\u00a0\r\n\u00a0\u00a0\u00a0\u00a0smtp.login(&quot;username&quot;, &quot;password&quot;)\u00a0\r\n\u00a0\u00a0\u00a0\u00a0smtp.send_message(msg)\u00a0\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<h3 class=\"wp-block-heading\">Yagmail\u00a0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Varias bibliotecas de terceros reducen a\u00fan m\u00e1s el c\u00f3digo repetitivo.\u00a0Yagmail\u00a0proporciona una abstracci\u00f3n centrada en Gmail para enviar mensajes y adjuntos con una configuraci\u00f3n m\u00ednima.\u00a0python-emails\u00a0a\u00f1ade\u00a0funciones de nivel superior, como el procesamiento de plantillas, la composici\u00f3n estructurada de mensajes y la firma DKIM.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por norma general, evita incrustar credenciales en el c\u00f3digo.\u00a0Utiliza el m\u00f3dulo\u00a0getpass() de Python para introducir contrase\u00f1as de forma segura, almacena las claves de API en variables de entorno y siempre\u00a0transmite\u00a0los emails a trav\u00e9s de conexiones cifradas con TLS.\u00a0<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Autenticaci\u00f3n y seguridad\u00a0<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Es\u00a0importante tener\u00a0en cuenta algunas\u00a0mejores pr\u00e1cticas\u00a0y consejos al enviar emails mediante programaci\u00f3n.\u00a0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Gesti\u00f3n de errores\u00a0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando tu script utiliza una API de terceros como\u00a0Mailgun\u00a0para enviar emails, debes gestionar los posibles errores relacionados con fallos en la red o en la API y las respuestas de la API que indican errores para garantizar que tu script funciona sin problemas, puede detectar problemas como claves de API o URL no v\u00e1lidas y sabe cu\u00e1ndo la API\u00a0de Mailgun no env\u00eda los emails. Sin una gesti\u00f3n de errores, tu script podr\u00eda fallar de forma inadvertida, lo que dar\u00eda lugar a emails no entregados.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Los fragmentos de c\u00f3digo\u00a0anteriores incluyen todo lo necesario\u00a0para gestionar los errores que puedan producirse. En primer lugar, comprueban el c\u00f3digo de estado de la respuesta (resp.status_code). Si\u00a0no se realiza correctamente (HTTP 200),\u00a0registran\u00a0el mensaje de error para que puedas depurar el problema.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tanto la funci\u00f3n\u00a0send_single_email(\u2026) como\u00a0send_batch_emails(\u2026) utilizan tambi\u00e9n un bloque try-except para garantizar que cualquier excepci\u00f3n se capture y se registre correctamente.\u00a0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Entregabilidad de emails\u00a0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La entregabilidad del email significa garantizar que tus emails llegan a la bandeja de entrada del destinatario y no a la carpeta de spam. Necesitas una buena reputaci\u00f3n como remitente para conseguir una entregabilidad alta. Cuando hablamos de desarrollar el env\u00edo mediante programaci\u00f3n, hay un par de cosas espec\u00edficas que podemos analizar para mejorar la entregabilidad de los emails, incluida la\u00a0autenticaci\u00f3n y la\u00a0optimizaci\u00f3n\u00a0de los emails para que sean responsive.\u00a0\u00a0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Autentica tu email\u00a0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Utiliza SPF, DKIM y DMARC para\u00a0validar\u00a0tu identidad como remitente. Env\u00eda emails solo a suscriptores verificados que hayan aceptado recibirlos y elimina regularmente a los suscriptores inactivos y a quienes marcan tus emails como spam.\u00a0<\/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\"> <p class=\"mb-0\">DMARC se est\u00e1 convirtiendo en un\u00a0requisito del sector. Obt\u00e9n m\u00e1s informaci\u00f3n sobre por qu\u00e9 y qu\u00e9 hace este est\u00e1ndar de autenticaci\u00f3n en nuestra publicaci\u00f3n sobre la <a href=\"https:\/\/www.mailgun.com\/blog\/deliverability\/dmarc-insights-from-dmarcian\/\">perspectiva de DMARC<\/a>.<\/p><\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Empieza a enviar con Python 3 y la\u00a0API de email de\u00a0Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En este art\u00edculo, has aprendido a enviar emails mediante un script de Python y la API de Mailgun. Tambi\u00e9n has aprendido sobre funciones de Mailgun como el seguimiento de emails y las plantillas, y sobre la importancia de la gesti\u00f3n de errores, optimizar la entregabilidad y enviar emails responsive.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Las personas apasionadas por los emails ayudan a otras apasionadas por los emails. Puedes encontrar el c\u00f3digo que hemos analizado en este tutorial en <a href=\"https:\/\/github.com\/manishh\/gifts-giveaways\/tree\/master\/python\/mailgun-api-demo\" target=\"_tabs\" rel=\"noopener noreferrer\">este repositorio de GitHub<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00bfTe ha resultado \u00fatil? Si es as\u00ed, aseg\u00farate de suscribirte a nuestra newsletter para recibir m\u00e1s tutoriales, anuncios e informaci\u00f3n del sector.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Preguntas frecuentes<\/h2>\n\n\n    <div data-content-type=\"longform\" id=\"accordion-id-block_dc5c76f1127f54677c81654f3d9440b4\" class=\"accordion accordion-longform d-flex flex-column gap-3 my-3\">\r\n\r\n        \n\r\n\r\n<div class=\"accordion-item py-2 border-bottom\">\r\n    <div\r\n        id=\"title-block_ec67525c267f2c3f541d339c0bb457c1_3277\"\r\n        class=\"accordion-header pb-3\">\r\n\r\n        <button\r\n            class=\"accordion-button fs-5 collapsed\"\r\n            type=\"button\"\r\n            data-bs-toggle=\"collapse\"\r\n            data-bs-target=\"#accordion-collapse-block_ec67525c267f2c3f541d339c0bb457c1_3277\"\r\n            aria-expanded=\"false\"\r\n            aria-controls=\"accordion-collapse-block_ec67525c267f2c3f541d339c0bb457c1_3277\">\r\n            \u00bfC\u00f3mo env\u00edo emails mediante el m\u00f3dulo smtplib de Python con TLS y SSL?         <\/button>\r\n    <\/div>\r\n    <div\r\n        id=\"accordion-collapse-block_ec67525c267f2c3f541d339c0bb457c1_3277\"\r\n        class=\"accordion-collapse collapse\"\r\n        aria-labelledby=\"title-block_ec67525c267f2c3f541d339c0bb457c1_3277\">\r\n        <div class=\"accordion-body pb-3\">\r\n            \n\n<p class=\"wp-block-paragraph\">Utiliza TLS (STARTTLS) en el puerto 587 cuando quieras pasar una conexi\u00f3n simple a cifrada y SSL (TLS impl\u00edcito) en el puerto 465 cuando la conexi\u00f3n se inicie cifrada.\u00a0<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>TLS (STARTTLS):\u00a0<\/strong>smtplib.SMTP(host, 587) \u2192\u00a0starttls() \u2192\u00a0login() \u2192\u00a0send_message()\u00a0<\/li>\n\n\n\n<li><strong>SSL (TLS impl\u00edcito):\u00a0<\/strong>smtplib.SMTP_SSL(host, 465) \u2192\u00a0login() \u2192\u00a0send_message()\u00a0<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">En ambos casos, redacta el mensaje (por ejemplo, con\u00a0EmailMessage) y env\u00edalo con\u00a0smtp.send_message(msg). Autentica siempre la conexi\u00f3n utilizando las credenciales SMTP (nombre de usuario\/contrase\u00f1a) proporcionadas por tu proveedor.\u00a0<\/p>\n\n\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\n\n\r\n\r\n<div class=\"accordion-item py-2 border-bottom\">\r\n    <div\r\n        id=\"title-block_a9dec92176d935dfe12f0dc5cb47b885_4208\"\r\n        class=\"accordion-header pb-3\">\r\n\r\n        <button\r\n            class=\"accordion-button fs-5 collapsed\"\r\n            type=\"button\"\r\n            data-bs-toggle=\"collapse\"\r\n            data-bs-target=\"#accordion-collapse-block_a9dec92176d935dfe12f0dc5cb47b885_4208\"\r\n            aria-expanded=\"false\"\r\n            aria-controls=\"accordion-collapse-block_a9dec92176d935dfe12f0dc5cb47b885_4208\">\r\n            \u00bfCu\u00e1les son las diferencias entre EmailMessage, MIMEText y MIMEMultipart al redactar mensajes?        <\/button>\r\n    <\/div>\r\n    <div\r\n        id=\"accordion-collapse-block_a9dec92176d935dfe12f0dc5cb47b885_4208\"\r\n        class=\"accordion-collapse collapse\"\r\n        aria-labelledby=\"title-block_a9dec92176d935dfe12f0dc5cb47b885_4208\">\r\n        <div class=\"accordion-body pb-3\">\r\n            \n\n<ul class=\"wp-block-list\">\n<li><strong>EmailMessage:<\/strong> API moderna y de alto nivel. La mejor opci\u00f3n predeterminada para la mayor\u00eda de los casos de uso. Facilita configurar encabezados, a\u00f1adir texto sin formato, a\u00f1adir alternativas HTML (add_alternative()) y adjuntar archivos con menos c\u00f3digo repetitivo.\u00a0<\/li>\n\n\n\n<li><strong>MIMEText:<\/strong> bloque de creaci\u00f3n de nivel inferior para una sola parte de texto (texto sin formato o HTML). Es \u00fatil cuando deseas un control expl\u00edcito sobre una \u00fanica parte del cuerpo del mensaje.\u00a0<\/li>\n\n\n\n<li><strong>MIMEMultipart: <\/strong>contenedor para combinar varias partes MIME (texto + HTML + adjuntos). Es com\u00fan en ejemplos m\u00e1s antiguos;\u00a0los archivos y las partes de\u00a0MIMEText se adjuntan\u00a0manualmente.\u00a0<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Si\u00a0est\u00e1s\u00a0empezando desde cero, elige\u00a0EmailMessage\u00a0a menos que necesites compatibilidad con patrones antiguos de creaci\u00f3n MIME.\u00a0<\/p>\n\n\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\n\n\r\n\r\n<div class=\"accordion-item py-2 border-bottom\">\r\n    <div\r\n        id=\"title-block_6d5ea8bbcbbcc9777f8b5377eaddec11_9681\"\r\n        class=\"accordion-header pb-3\">\r\n\r\n        <button\r\n            class=\"accordion-button fs-5 collapsed\"\r\n            type=\"button\"\r\n            data-bs-toggle=\"collapse\"\r\n            data-bs-target=\"#accordion-collapse-block_6d5ea8bbcbbcc9777f8b5377eaddec11_9681\"\r\n            aria-expanded=\"false\"\r\n            aria-controls=\"accordion-collapse-block_6d5ea8bbcbbcc9777f8b5377eaddec11_9681\">\r\n            \u00bfC\u00f3mo puedo usar variables de entorno y el m\u00f3dulo getpass() para gestionar las credenciales de forma segura?         <\/button>\r\n    <\/div>\r\n    <div\r\n        id=\"accordion-collapse-block_6d5ea8bbcbbcc9777f8b5377eaddec11_9681\"\r\n        class=\"accordion-collapse collapse\"\r\n        aria-labelledby=\"title-block_6d5ea8bbcbbcc9777f8b5377eaddec11_9681\">\r\n        <div class=\"accordion-body pb-3\">\r\n            \n\n<p class=\"wp-block-paragraph\">Utiliza variables de entorno para las credenciales en aplicaciones desplegadas (CI\/CD, contenedores, servidores) y\u00a0getpass() para scripts locales interactivos.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Las variables\u00a0de entorno mantienen los secretos fuera del control de fuentes y los registros. Almacena valores como nombres de usuario\/contrase\u00f1as SMTP o claves de API\u00a0como SMTP_USER, SMTP_PASS, MAILGUN_API_KEY, etc. y l\u00e9elos en tiempo de ejecuci\u00f3n.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">getpass.getpass() solicita una contrase\u00f1a de forma segura sin mostrarla en el terminal, algo \u00fatil para scripts r\u00e1pidos o pruebas locales.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un patr\u00f3n com\u00fan\u00a0es:\u00a0leer primero desde env\u00a0y\u00a0recurrir a\u00a0getpass() solo si falta.\u00a0<\/p>\n\n\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\n\n\r\n\r\n<div class=\"accordion-item py-2 border-bottom\">\r\n    <div\r\n        id=\"title-block_465bc26faf8c469e20e7ec1768295135_6798\"\r\n        class=\"accordion-header pb-3\">\r\n\r\n        <button\r\n            class=\"accordion-button fs-5 collapsed\"\r\n            type=\"button\"\r\n            data-bs-toggle=\"collapse\"\r\n            data-bs-target=\"#accordion-collapse-block_465bc26faf8c469e20e7ec1768295135_6798\"\r\n            aria-expanded=\"false\"\r\n            aria-controls=\"accordion-collapse-block_465bc26faf8c469e20e7ec1768295135_6798\">\r\n            \u00bfQu\u00e9 ventajas proporciona Yagmail sobre smtplib para quienes usan Gmail?         <\/button>\r\n    <\/div>\r\n    <div\r\n        id=\"accordion-collapse-block_465bc26faf8c469e20e7ec1768295135_6798\"\r\n        class=\"accordion-collapse collapse\"\r\n        aria-labelledby=\"title-block_465bc26faf8c469e20e7ec1768295135_6798\">\r\n        <div class=\"accordion-body pb-3\">\r\n            \n\n<p class=\"wp-block-paragraph\">Yagmail\u00a0est\u00e1 dise\u00f1ado espec\u00edficamente para flujos de trabajo de Gmail, por lo que reduce el c\u00f3digo repetitivo de SMTP y facilita las tareas comunes en Gmail.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Principales ventajas para quienes usan Gmail:\u00a0<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Menos c\u00f3digo:<\/strong> configuraci\u00f3n m\u00ednima para enviar mensajes, HTML y archivos adjuntos.\u00a0<\/li>\n\n\n\n<li><strong>Ergonom\u00eda orientada a Gmail: <\/strong>una API m\u00e1s amigable para redactar mensajes y gestionar archivos adjuntos.\u00a0<\/li>\n\n\n\n<li><strong>Iteraci\u00f3n m\u00e1s r\u00e1pida: <\/strong>es ideal para scripts y herramientas internas en las que deseas que el \u00abenv\u00edo de emails\u00bb sea sencillo y sin tener que gestionar manualmente las partes MIME.\u00a0<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Si\u00a0solo env\u00edas estrictamente a trav\u00e9s de Gmail y quieres menos piezas m\u00f3viles que la combinaci\u00f3n pura y dura de\u00a0smtplib\u00a0y creaci\u00f3n de MIME,\u00a0Yagmail\u00a0suele ser la v\u00eda m\u00e1s r\u00e1pida.\u00a0<\/p>\n\n\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\n\n\r\n\r\n<div class=\"accordion-item py-2 border-bottom\">\r\n    <div\r\n        id=\"title-block_534d33d57f06514e4fa00f5e2ade775b_6672\"\r\n        class=\"accordion-header pb-3\">\r\n\r\n        <button\r\n            class=\"accordion-button fs-5 collapsed\"\r\n            type=\"button\"\r\n            data-bs-toggle=\"collapse\"\r\n            data-bs-target=\"#accordion-collapse-block_534d33d57f06514e4fa00f5e2ade775b_6672\"\r\n            aria-expanded=\"false\"\r\n            aria-controls=\"accordion-collapse-block_534d33d57f06514e4fa00f5e2ade775b_6672\">\r\n            \u00bfC\u00f3mo implemento la firma DKIM y el procesamiento de plantillas con la biblioteca python-emails?         <\/button>\r\n    <\/div>\r\n    <div\r\n        id=\"accordion-collapse-block_534d33d57f06514e4fa00f5e2ade775b_6672\"\r\n        class=\"accordion-collapse collapse\"\r\n        aria-labelledby=\"title-block_534d33d57f06514e4fa00f5e2ade775b_6672\">\r\n        <div class=\"accordion-body pb-3\">\r\n            \n\n<p class=\"wp-block-paragraph\">Con python-emails,\u00a0normalmente\u00a0tienes que hacer lo siguiente:\u00a0<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Procesar una plantilla (a menudo HTML y texto) usando los\u00a0asistentes para plantillas de la\u00a0biblioteca\u00a0(o pasar el contenido preprocesado desde tu propio motor de plantillas).\u00a0<\/li>\n\n\n\n<li>Adjuntar la configuraci\u00f3n DKIM mediante el selector y la clave privada DKIM de tu\u00a0dominio\u00a0antes de enviar.\u00a0<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">En la pr\u00e1ctica,\u00a0har\u00e1s lo siguiente:\u00a0<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Crear un objeto de email (asunto\/de\/para)\u00a0<\/li>\n\n\n\n<li>Proporcionar los cuerpos de texto\/HTML procesados (y, de forma opcional, las variables de las plantillas)\u00a0<\/li>\n\n\n\n<li>Configurar la firma DKIM con:\u00a0\n<ul class=\"wp-block-list\">\n<li>un selector (por ejemplo,\u00a0mailgun\u00a0o default)\u00a0<\/li>\n\n\n\n<li>tu dominio de firma\u00a0<\/li>\n\n\n\n<li>la clave privada DKIM (cargada de forma segura desde variables de entorno o un gestor de secretos)\u00a0<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Para la producci\u00f3n, mant\u00e9n la clave privada DKIM fuera del c\u00f3digo fuente (variables de entorno o archivos secretos montados) y\u00a0valida\u00a0la firma comprobando los encabezados del mensaje en un buz\u00f3n que muestre los resultados de DKIM-Signature y autenticaci\u00f3n.\u00a0<\/p>\n\n\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\n\r\n\r\n\r\n\r\n\r\n    <\/div>\r\n\r\n    \r\n\n\n    <div data-content-type=\"longform\" class=\"longform-spacings\">\r\n        <div class=\"cta bg-primary rounded-lg px-5 py-6 p-md-7 px-md-6\">\r\n                    <div class=\"form-subscription\">\r\n                            <div class=\"h4 mb-3\">\r\n                    \u00a1Mantenme informado\/a! Recibe excelentes recursos en tu bandeja de entrada cada semana.                <\/div>\r\n                                    <form accept-charset=\"UTF-8\" action=\"\" enctype=\"multipart\/form-data\" data-form-subscription method=\"POST\" style=\"max-width: 400px;\">\r\n                <div class=\"row justify-content-between align-items-top g-2\">\r\n                    <div class=\"col-10\">\r\n                        <input type=\"email\" name=\"email\" class=\"form-control\" placeholder=\"Email\" autocomplete=\"email\" required>\r\n                        <div data-fs=\"error\" role=\"alert\" class=\"invalid-feedback\">\r\n                            Please complete this required field.                        <\/div>\r\n                    <\/div>\r\n                                            <div class=\"col-12 order-last mt-3 fs-xxs\" data-fs=\"acceptance\" style=\"display:none;\">\r\n                            \r\n                                <div class=\"form-check\">\r\n                                    <input id=\"formSubscriptionAcceptance-terms-3970\" class=\"form-check-input\"\r\n                                        type=\"checkbox\" name=\"terms\">\r\n                                    <label for=\"formSubscriptionAcceptance-terms-3970\" class=\"form-check-label text-body-color\">\r\n                                        He le\u00eddo y acepto los T\u00e9rminos de Servicio.                                        <span class=\"hs-form-required\">*<\/span>\r\n                                    <\/label>\r\n                                <\/div>\r\n\r\n                            \r\n                                <div class=\"form-check\">\r\n                                    <input id=\"formSubscriptionAcceptance-privacy-8121\" class=\"form-check-input\"\r\n                                        type=\"checkbox\" name=\"privacy\">\r\n                                    <label for=\"formSubscriptionAcceptance-privacy-8121\" class=\"form-check-label text-body-color\">\r\n                                        He le\u00eddo y acepto la Pol\u00edtica de Privacidad.                                        <span class=\"hs-form-required\">*<\/span>\r\n                                    <\/label>\r\n                                <\/div>\r\n\r\n                                                    <\/div>\r\n                    \r\n                                            <div class=\"col-12 order-last fs-xxs mb-0 mt-2 text-body-color\">\r\n                            Env\u00edame la newsletter de Mailjet. Acepto expresamente recibir la newsletter y s\u00e9 que puedo darme de baja f\u00e1cilmente en cualquier momento.                        <\/div>\r\n                    \r\n                    <div class=\"col-2\">\r\n                        <button type=\"submit\" value=\"Submit\" aria-label=\"Submit\" class=\"btn btn-secondary btn-icon\">\r\n                            <svg aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/layout\/chevron-right.svg\"><\/svg>\r\n                        <\/button>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <input type=\"hidden\" name=\"formSubscriptionRecaptchaToken\" data-fs=\"recaptcha-token\">\r\n                <input type=\"hidden\" name=\"customListID\" value=\"\">\r\n\r\n            <\/form>\r\n            <div data-fs=\"message-success\" style=\"display: none;\">\r\n                <p class=\"mb-0 mt-2 text-body-color\">\r\n                    \u00a1Consulta mensualmente tu bandeja de entrada para recibir la newsletter de Mailjet!                <\/p>\r\n            <\/div>\r\n        <\/div>\r\n        <\/div>\r\n    <\/div>\r\n","protected":false},"excerpt":{"rendered":"<p>\u00bfBuscas optimizar tu proceso de env\u00edo de emails con Python 3? Hemos reunido a nuestros especialistas en Python para ofrecerte una gu\u00eda. En este tutorial analizaremos c\u00f3mo enviar emails mediante programaci\u00f3n utilizando Python 3 y la API de email de Sinch Mailgun.<\/p>\n","protected":false},"author":11,"featured_media":4843,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[23],"class_list":["post-25207","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-it-and-engineering"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Gu\u00eda sobre API de email en Python: env\u00eda emails con Mailgun - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Aprende a integrar el env\u00edo de emails mediante programaci\u00f3n con nuestro tutorial paso a paso utilizando Python y la API de email de Mailgun. \u00a1Empieza a enviar emails sin esfuerzo hoy mismo!\" \/>\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\/it-and-engineering\/enviar-emails-con-python\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gu\u00eda sobre API de email en Python: env\u00eda emails con Mailgun - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Aprende a integrar el env\u00edo de emails mediante programaci\u00f3n con nuestro tutorial paso a paso utilizando Python y la API de email de Mailgun. \u00a1Empieza a enviar emails sin esfuerzo hoy mismo!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/enviar-emails-con-python\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.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=\"13 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\\\/it-and-engineering\\\/enviar-emails-con-python\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/enviar-emails-con-python\\\/\",\"name\":\"Gu\u00eda sobre API de email en Python: env\u00eda emails con Mailgun - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/enviar-emails-con-python\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/enviar-emails-con-python\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"datePublished\":\"2026-09-16T21:30:31+00:00\",\"description\":\"Aprende a integrar el env\u00edo de emails mediante programaci\u00f3n con nuestro tutorial paso a paso utilizando Python y la API de email de Mailgun. \u00a1Empieza a enviar emails sin esfuerzo hoy mismo!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/enviar-emails-con-python\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/enviar-emails-con-python\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/enviar-emails-con-python\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/enviar-emails-con-python\\\/#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\":\"Enviar emails con Python 3 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":"Gu\u00eda sobre API de email en Python: env\u00eda emails con Mailgun - Transactional Email API Service For Developers | Mailgun","description":"Aprende a integrar el env\u00edo de emails mediante programaci\u00f3n con nuestro tutorial paso a paso utilizando Python y la API de email de Mailgun. \u00a1Empieza a enviar emails sin esfuerzo hoy mismo!","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\/it-and-engineering\/enviar-emails-con-python\/","og_locale":"es_ES","og_type":"article","og_title":"Gu\u00eda sobre API de email en Python: env\u00eda emails con Mailgun - Transactional Email API Service For Developers | Mailgun","og_description":"Aprende a integrar el env\u00edo de emails mediante programaci\u00f3n con nuestro tutorial paso a paso utilizando Python y la API de email de Mailgun. \u00a1Empieza a enviar emails sin esfuerzo hoy mismo!","og_url":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/enviar-emails-con-python\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"13 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/enviar-emails-con-python\/","url":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/enviar-emails-con-python\/","name":"Gu\u00eda sobre API de email en Python: env\u00eda emails con Mailgun - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/enviar-emails-con-python\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/enviar-emails-con-python\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","datePublished":"2026-09-16T21:30:31+00:00","description":"Aprende a integrar el env\u00edo de emails mediante programaci\u00f3n con nuestro tutorial paso a paso utilizando Python y la API de email de Mailgun. \u00a1Empieza a enviar emails sin esfuerzo hoy mismo!","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/enviar-emails-con-python\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/enviar-emails-con-python\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/enviar-emails-con-python\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/enviar-emails-con-python\/#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":"Enviar emails con Python 3 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\/25207","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\/11"}],"version-history":[{"count":1,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/25207\/revisions"}],"predecessor-version":[{"id":25209,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/25207\/revisions\/25209"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media\/4843"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media?parent=25207"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog_category?post=25207"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}