{"id":17560,"date":"2026-08-17T15:25:50","date_gmt":"2026-08-17T15:25:50","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\/"},"modified":"2026-08-28T08:25:49","modified_gmt":"2026-08-28T08:25:49","slug":"crear-flujos-de-trabajo-de-api-para-emails-transaccionales","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\/","title":{"rendered":"Mejores pr\u00e1cticas de email transaccional para desarrolladores"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u00bfHas recibido un email de notificaci\u00f3n instant\u00e1nea cuando compraste algo en l\u00ednea? Eso es esencialmente lo que es un  <a href=\"https:\/\/www.mailgun.com\/blog\/email\/what-is-transactional-email-basics\/\">mensaje transaccional<\/a> es. Los mensajes transaccionales son emails o notificaciones automatizados que recibes cuando te registras en un servicio, haces una compra o restableces una contrase\u00f1a. Tambi\u00e9n incluyen alertas de fraude, recordatorios de carrito abandonado y actualizaciones bancarias y de entrega. A diferencia de los emails de marketing, estos confirman acciones y te mantienen informado, lo que genera confianza y mejora la interacci\u00f3n del usuario.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este art\u00edculo, aprender\u00e1s a automatizar mensajes transaccionales desde tu aplicaci\u00f3n mediante flujos de trabajo de API para mejorar la experiencia del cliente.\u00a0<\/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-2740\"><p class=\"h5 m-0\" id=\"toc-title-2740\">Table of contents<\/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=\"#por-que-el-email-transaccional-es-importante-para-la-experiencia-del-cliente\">\u00bfPor qu\u00e9 el email transaccional es importante para la experiencia del cliente?<\/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=\"#como-se-crea-un-flujo-de-trabajo-de-api-para-automatizar-el-email-transaccional\">\u00bfC\u00f3mo se crea un flujo de trabajo de API para automatizar el email transaccional?<\/a><a class=\"scrollme link-body-color\" href=\"#configurar-un-nuevo-proyecto-de-python\">Configurar un nuevo proyecto de Python<\/a><a class=\"scrollme link-body-color\" href=\"#obtener-una-clave-de-api\">Obtener una clave de API<\/a><a class=\"scrollme link-body-color\" href=\"#importar-modulos-e-inicializar\">Importar m\u00f3dulos e inicializar<\/a><a class=\"scrollme link-body-color\" href=\"#enviar-un-email-usando-la-api-de-mailgun\">Enviar un email usando 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=\"#mejores-practicas-automatizar-emails-de-registro-de-cuenta\">Mejores pr\u00e1cticas: Automatizar emails de registro de cuenta<\/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=\"#mejores-practicas-automatizar-emails-de-confirmacion-de-opt-in-doble\">Mejores pr\u00e1cticas: Automatizar emails de confirmaci\u00f3n de opt in doble<\/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=\"#mejores-practicas-automatizar-emails-para-restablecer-la-contrasena\">Mejores pr\u00e1cticas: Automatizar emails para restablecer la contrase\u00f1a<\/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=\"#que-sigue-despues-de-implementar-estos-flujos-de-trabajo\">\u00bfQu\u00e9 sigue despu\u00e9s de implementar estos flujos de trabajo?<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">\u00bfPor qu\u00e9 el email transaccional es importante para la experiencia del cliente?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A diferencia de los env\u00edos masivos <a href=\"https:\/\/www.mailgun.com\/blog\/deliverability\/transactional-emails-vs-marketing-emails\/\" target=\"_tabs\" rel=\"noopener noreferrer\">emails de marketing<\/a>, los mensajes transaccionales son personalizados, oportunos y esperados porque son muy relevantes para la actividad del usuario. Estos mensajes son individuales y contienen informaci\u00f3n directamente relacionada con las actividades del usuario. <\/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\"> \u00bfSab\u00edas que? El 74% de los consumidores prefiere recibir mensajes transaccionales por email, y el 71% incluso revisar\u00eda su carpeta de spam si no los recibiera.<a href=\"https:\/\/www.mailgun.com\/es\/recursos\/estudio\/email-experiencia-del-cliente\/\"> Obt\u00e9n m\u00e1s informaci\u00f3n en nuestro informe sobre el email y la experiencia del cliente.<\/a>\u00a0\u00a0<\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Los mensajes transaccionales oportunos \u2013 como las confirmaciones de pedido y las alertas de cuenta \u2013 <a href=\"https:\/\/www.mailgun.com\/es\/blog\/email\/email-transaccional-heroe-anonimo\/\" target=\"_tabs\" rel=\"noopener noreferrer\">aumenta la satisfacci\u00f3n del cliente<\/a>, mejoran la transparencia y fortalecen la confianza al abordar de manera eficiente las interacciones de los clientes y posibles fraudes. Tambi\u00e9n ayudan a los clientes al ofrecer opciones de autoservicio y reducir la carga de trabajo de la asistencia al cliente. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> A diferencia de los emails promocionales que a menudo pasan desapercibidos, los emails transaccionales se esperan con impaciencia y a menudo se abren al instante; los usuarios incluso emprenden la b\u00fasqueda del tesoro en sus carpetas de spam para encontrarlos. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfC\u00f3mo se crea un flujo de trabajo de API para automatizar el email transaccional?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En este tutorial, aprender\u00e1s a enviar emails transaccionales desde tu aplicaci\u00f3n mediante la configuraci\u00f3n de flujos de trabajo sencillos con <a href=\"https:\/\/www.mailgun.com\/es\/\" target=\"_tabs\" rel=\"noopener noreferrer\"><u>las API de Mailgun<\/u><\/a>. Mailgun es una plataforma de env\u00edo de emails que te permite enviar y hacer un seguimiento de los emails. Simplifica la automatizaci\u00f3n de emails transaccionales con API fiables y f\u00e1ciles de usar.\u00a0\u00a0Usar\u00e1s Mailgun para automatizar mensajes transaccionales con Python en los siguientes escenarios:\u00a0<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Registro de cuenta de usuario\u00a0<\/li>\n\n\n\n<li>Opt in doble para suscripciones a la newsletter\u00a0<\/li>\n\n\n\n<li>Restablecer contrase\u00f1a\u00a0<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de empezar, aseg\u00farate de tener lo siguiente:\u00a0<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.python.org\/\" target=\"_tabs\" rel=\"noopener noreferrer\"><u>Python<\/u><\/a> 3.9 o superior\u00a0<\/li>\n\n\n\n<li>Una cuenta de Mailgun (la <a href=\"https:\/\/signup.mailgun.com\/new\/signup\" target=\"_tabs\" rel=\"noopener noreferrer\"><u>prueba gratuita de 30 d\u00edas<\/u><\/a> es suficiente para este tutorial)\u00a0<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Configurar un nuevo proyecto de Python<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Para empezar, crea un directorio para tu proyecto de Python y a\u00f1ade un archivo .env vac\u00edo en \u00e9l.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de continuar, es una buena pr\u00e1ctica crear y activar un nuevo <a href=\"https:\/\/docs.python.org\/3\/library\/venv.html\" target=\"_tabs\" rel=\"noopener noreferrer\"><u>entorno virtual<\/u><\/a> para aislar tu proyecto y evitar conflictos de dependencias.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez que tu entorno virtual est\u00e9 activo, instala las bibliotecas necesarias (requests y python-dotenv) ejecutando lo siguiente:\u00a0<\/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=\"Copy to clipboard\" data-clipboard-success-label=\"Copied!\" data-clipboard-error-label=\"Unable to copy\" data-tooltip=\"Copy to clipboard\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copy to clipboard\">\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 \r\npip install requests python-dotenv \r\n``` \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">La biblioteca requests te permite hacer llamadas a la API, y python-dotenv te ayuda a almacenar de forma segura tu clave de API fuera de tu c\u00f3digo.\u00a0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Obtener una clave de API<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Para hacer llamadas a la API de Mailgun, necesitas una <a href=\"https:\/\/help.mailgun.com\/hc\/en-us\/articles\/203380100-Where-can-I-find-my-API-keys-and-SMTP-credentials\" target=\"_tabs\" rel=\"noopener noreferrer\"><u>clave de API<\/u><\/a> de tu cuenta de Mailgun.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inicia sesi\u00f3n en tu cuenta de Mailgun y ve a la p\u00e1gina de  <a href=\"https:\/\/app.mailgun.com\/settings\/api_security\" target=\"_tabs\" rel=\"noopener noreferrer\"><b><u>Seguridad de la API<\/u><\/b><\/a> . Puedes encontrar esto en el men\u00fa desplegable bajo tu nombre en la esquina superior derecha:\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Crea una clave de API y luego c\u00f3piala:\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Gu\u00e1rdala de forma segura pegando la clave en el archivo .env de tu proyecto:\u00a0<\/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=\"Copy to clipboard\" data-clipboard-success-label=\"Copied!\" data-clipboard-error-label=\"Unable to copy\" data-tooltip=\"Copy to clipboard\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copy to clipboard\">\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 \r\nMAILGUN_API_KEY=&quot;Your API Key Here&quot; \r\n``` \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Cuando uses Mailgun, toma nota de tus <b>dominios de env\u00edo<\/b> en el <a href=\"https:\/\/app.mailgun.com\/mg\/dashboard\" target=\"_tabs\" rel=\"noopener noreferrer\"><u>panel de control<\/u><\/a>:\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si est\u00e1s en un plan gratuito, ver\u00e1s un dominio sandbox, que usar\u00e1s en el punto de conexi\u00f3n de la API y como direcci\u00f3n de email de \u00abremitente\u00bb (from) al enviar emails a trav\u00e9s de las API de Mailgun. El dominio sandbox suele verse as\u00ed: <code>.mailgun.org<\/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\"> Si quieres enviar emails usando un dominio personalizado, tendr\u00e1s que pasar a un plan superior de pago. El plan gratuito te limita al dominio sandbox y te permite enviar emails hasta a cinco direcciones verificadas, lo cual es \u00fatil a la hora de hacer pruebas y desarrollo mientras integras la API de Mailgun en tu sistema. Puedes a\u00f1adir estas direcciones de email a <a href=\"https:\/\/help.mailgun.com\/hc\/en-us\/articles\/217531258-Authorized-Recipients\"><b>Destinatarios autorizados<\/b><\/a> en los ajustes de la cuenta.\u00a0<\/div>\r\n    <\/div>\r\n\n\n\n<h3 class=\"wp-block-heading\">Importar m\u00f3dulos e inicializar<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Para automatizar los emails transaccionales, empieza creando un archivo main.py en el directorio de tu proyecto y a\u00f1adiendo el siguiente c\u00f3digo:\u00a0<\/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=\"Copy to clipboard\" data-clipboard-success-label=\"Copied!\" data-clipboard-error-label=\"Unable to copy\" data-tooltip=\"Copy to clipboard\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copy to clipboard\">\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 \r\nimport requests \r\n\r\nimport logging \r\n\r\nimport os \r\n\r\nfrom dotenv import load_dotenv \r\n\r\nlogging.basicConfig(level=logging.INFO)\u202f # Set log level \r\n\r\nload_dotenv()\u202f # For reading the API key from the `.env` file \r\n\r\n# Sandbox API URL format: https:\/\/api.mailgun.net\/v3\/sandbox.mailgun.org\/messages \r\n\r\nMAILGUN_API_URL = &quot;https:\/\/api.mailgun.net\/v3\/YOUR_DOMAIN_NAME\/messages&quot; \r\n\r\nFROM_EMAIL_ADDRESS = &quot;Sender Name &quot; \r\n``` \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">La funci\u00f3n <code>load_dotenv()<\/code>, de la biblioteca <code>python-dotenv <\/code>, carga las variables de entorno de tu archivo .env en tu c\u00f3digo Python. Esta es una de las mejores pr\u00e1cticas para almacenar y acceder de forma segura a informaci\u00f3n sensible como credenciales y claves de API.\u00a0\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MAILGUN_API_URL establece la URL de la API para tu script de Python, mientras que FROM_EMAIL_ADDRESS especifica la direcci\u00f3n de email del remitente (ambas deben usar tu dominio de env\u00edo de emails o el dominio sandbox mencionado anteriormente).\u00a0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Enviar un email usando la API de Mailgun<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">El siguiente c\u00f3digo te muestra c\u00f3mo enviar un email a una sola direcci\u00f3n usando la API de Mailgun. Deber\u00edas a\u00f1adir este c\u00f3digo al archivo main.py que creaste antes, debajo de la inicializaci\u00f3n:\u00a0<\/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=\"Copy to clipboard\" data-clipboard-success-label=\"Copied!\" data-clipboard-error-label=\"Unable to copy\" data-tooltip=\"Copy to clipboard\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copy to clipboard\">\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                                    \r\n```python \r\ndef _send_email(to_address: str, subject: str, message: str): \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202fSend single email to the given email address using Mailgun API. \r\n\r\n\u202f\u202f\u202f\u202f:param to_address: \r\n\r\n\u202f\u202f\u202f\u202f:param subject: \r\n\r\n\u202f\u202f\u202f\u202f:param message: \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202ftry: \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202fapi_key = os.getenv(&quot;MAILGUN_API_KEY&quot;)\u202f # Get API key from the `.env` file \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202fresp = requests.post(MAILGUN_API_URL, auth=(&quot;api&quot;, api_key), \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202fdata={&quot;from&quot;: FROM_EMAIL_ADDRESS, \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f&quot;to&quot;: to_address, &quot;subject&quot;: subject, &quot;html&quot;: message}) \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202fif resp.status_code == 200:\u202f # Success \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202flogging.info(f&quot;Successfully sent an email to &#039;{to_address}&#039; via Mailgun API.&quot;) \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202felse: \u202f # Error \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202flogging.error(f&quot;Could not send the email, reason: {resp.text}&quot;) \r\n\r\n\u202f\u202f\u202f\u202fexcept Exception as ex: \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202flogging.exception(f&quot;Mailgun error: {ex}&quot;) \r\n``` \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">La funci\u00f3n <code>_send_email()<\/code> toma tres argumentos: <code>to_address<\/code>, <code>subject<\/code> y <code>message<\/code>. <code>to_address<\/code> es el email del destinatario, mientras que subject y message definen el asunto y el contenido del email, respectivamente. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La funci\u00f3n lee la clave de API de Mailgun desde el archivo .env, que luego se usa para autenticar la llamada a la API a la MAILGUN_API_URL especificada. Esta clave identifica tu cuenta de forma exclusiva, lo que permite a Mailgun verificar tu solicitud. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para asegurarte de que el email se env\u00eda correctamente, debes usar tu clave de API \u00fanica; la direcci\u00f3n de email de \u00abremitente\u00bb (from) debe estar asociada a tu dominio v\u00e1lido o al dominio sandbox de Mailgun. De lo contrario, la llamada a la API fallar\u00e1 y devolver\u00e1 un error. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Los datos del email se env\u00edan usando el m\u00e9todo HTTP POST a trav\u00e9s de la llamada requests.post(). Si la llamada a la API es exitosa, el email se pone en cola para su entrega y la API devuelve un estado HTTP 200 OK. Si se produce un error, la API proporciona un mensaje de error junto con un c\u00f3digo de estado HTTP adecuado. Ambos escenarios son registrados por esta funci\u00f3n para tu referencia. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Todas las automatizaciones de emails transaccionales de las siguientes secciones se basan en la funci\u00f3n <code>_send_email() <\/code> para enviar emails a trav\u00e9s de la API de Mailgun. <\/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\"> La llamada a la API de Mailgun retorna inmediatamente despu\u00e9s de recibir tu solicitud HTTP, lo que indica que el email se ha puesto en cola para su entrega.\u00a0<\/div><div class=\"content-body mt-3\">Con esta configuraci\u00f3n, ya est\u00e1s listo para automatizar tus emails transaccionales para varios escenarios.\u00a0<\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Mejores pr\u00e1cticas: Automatizar emails de registro de cuenta<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El registro de cuenta de usuario es uno de los casos de uso m\u00e1s importantes para los emails transaccionales, ya que sirve como punto de entrada del usuario en tu sistema. Las primeras impresiones importan, y esta interacci\u00f3n inicial es una oportunidad para generar confianza y establecer una relaci\u00f3n positiva con el usuario. Un email de felicitaci\u00f3n oportuno en el momento del registro no solo confirma el \u00e9xito del proceso, sino que tambi\u00e9n le asegura al usuario que su cuenta est\u00e1 lista para usarse.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para lograr esto, tu sistema deber\u00eda enviar inmediatamente un email de confirmaci\u00f3n automatizado para que el usuario sepa que su registro fue exitoso.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed tienes un ejemplo de c\u00f3mo implementar esto:\u00a0<\/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=\"Copy to clipboard\" data-clipboard-success-label=\"Copied!\" data-clipboard-error-label=\"Unable to copy\" data-tooltip=\"Copy to clipboard\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copy to clipboard\">\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 \r\ndef _notify_registration(user_name: str, user_email: str): \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202fNotify user on successful registration using `_send_email` \r\n\r\n\u202f\u202f\u202f\u202f:param user_name: \r\n\r\n\u202f\u202f\u202f\u202f:param user_email: \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202f# Use your own formatted HTML message here, with an appropriate link \r\n\r\n\u202f\u202f\u202f\u202fregistration_msg = f&#039;Dear {user_name},&lt;br \/&gt;&lt;br \/&gt; You have successfully registered on our site.&#039; \r\n\r\n\u202f\u202f\u202f\u202f_send_email(user_email, &quot;Registration successful&quot;, registration_msg) \r\n\r\ndef register_user(user_name: str, user_email: str): \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202fRegister the user and notify the user on successful registration. \r\n\r\n\u202f\u202f\u202f\u202f:param user_name: \r\n\r\n\u202f\u202f\u202f\u202f:param user_email: \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202f# Actual code to register the user \r\n\r\n\u202f\u202f\u202f\u202flogging.info(f&quot;Sending registration email to the user: {user_name}...&quot;) \r\n\r\n\u202f\u202f\u202f\u202f_notify_registration(user_name, user_email) \r\n``` \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">La primera funci\u00f3n, <code>_notify_registration()<\/code>, es responsable de enviar una notificaci\u00f3n por email a un usuario que acaba de registrarse. Toma dos par\u00e1metros: user_name y user_email. Dentro de esta funci\u00f3n, se construye un mensaje HTML sencillo usando una <a href=\"https:\/\/docs.python.org\/3\/tutorial\/inputoutput.html#formatted-string-literals\" target=\"_tabs\" rel=\"noopener noreferrer\"><u>f-string<\/u><\/a>, lo que permite una f\u00e1cil inserci\u00f3n del nombre del usuario en el mensaje. Luego, esta funci\u00f3n llama a la funci\u00f3n previamente comentada <code>_send_email()<\/code> para enviar el email.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00a0La segunda funci\u00f3n stub, <code>register_user()<\/code>, sugiere el punto de entrada principal para el proceso de registro de usuario dentro de tu sistema. Tambi\u00e9n toma <code>user_name<\/code> y <code>user_email<\/code> como par\u00e1metros. En la vida real, normalmente tendr\u00eda m\u00e1s par\u00e1metros u objetos &#8216;usuario&#8217; con m\u00e1s detalles. Esta funci\u00f3n se encarga de gestionar el proceso de registro. Como se muestra aqu\u00ed, registra el env\u00edo del email y llama a la funci\u00f3n <code> _notify_registration()<\/code> para iniciar el email de confirmaci\u00f3n automatizado tras completar el registro de usuario.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El registro de usuario act\u00faa como un evento disparador para este email transaccional, y puedes automatizarlo usando el flujo de trabajo de API que se muestra arriba. Tambi\u00e9n es una gran oportunidad para informar a los usuarios sobre tus servicios y caracter\u00edsticas clave.\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\"> La API de Mailgun te permite crear y personalizar <a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/sending-messages\/#templates\">plantillas HTML<\/a>, d\u00e1ndote la flexibilidad de dise\u00f1ar emails transaccionales visualmente atractivos con contenido enriquecido.\u00a0<\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Mejores pr\u00e1cticas: Automatizar emails de confirmaci\u00f3n de opt in doble<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando un usuario se suscribe a tu newsletter, en lugar de a\u00f1adirlo inmediatamente a tu lista de suscriptores, puedes enviar un email pidi\u00e9ndole que confirme su suscripci\u00f3n. Este proceso, llamado confirmaci\u00f3n de opt in doble, es un requisito legal en algunos pa\u00edses para el cumplimiento normativo.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed, la suscripci\u00f3n del usuario act\u00faa como disparador, y puedes automatizar la confirmaci\u00f3n de opt in doble con el siguiente c\u00f3digo:\u00a0<\/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=\"Copy to clipboard\" data-clipboard-success-label=\"Copied!\" data-clipboard-error-label=\"Unable to copy\" data-tooltip=\"Copy to clipboard\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copy to clipboard\">\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 \r\ndef _notify_subscription(user_name: str, user_email: str): \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202fDouble opt-in confirmation for user subscription. \r\n\r\n\u202f\u202f\u202f\u202f:param user_name: \r\n\r\n\u202f\u202f\u202f\u202f:param user_email: \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202f# Use your own formatted HTML message here, with an appropriate link \r\n\r\n\u202f\u202f\u202f\u202fsubscription_msg = f&#039;Dear {user_name},&lt;br \/&gt;&lt;br \/&gt; Please confirm your subscription to our newsletter by clicking &#039; \\ \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202ff&#039;this link: &lt;a href=&quot;https:\/\/example.com\/confirm-subscription?id=abcdef1234567xyz&quot;&gt;&#039; \\ \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202ff&#039;https:\/\/example.com\/confirm-subscription?id=abcdef1234567xyz&lt;\/a&gt;&#039; \r\n\r\n\u202f\u202f\u202f\u202f_send_email(user_email, &quot;Confirm subscription&quot;, subscription_msg) \r\n\r\ndef subscribe_user(user_name: str, user_email: str): \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202fSubscribe user and send opt-in confirmation message. \r\n\r\n\u202f\u202f\u202f\u202f:param user_name: \r\n\r\n\u202f\u202f\u202f\u202f:param user_email: \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202f# Code to subscribe user with pending confirmation \r\n\r\n\u202f\u202f\u202f\u202flogging.info(f&quot;Sending subscription confirmation email to the user: {user_name}...&quot;) \r\n\r\n\u202f\u202f\u202f\u202f_notify_subscription(user_name, user_email) \r\n``` \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">La primera funci\u00f3n, <code>_notify_subscription()<\/code>, es responsable de enviar un email de confirmaci\u00f3n de opt in doble a un usuario que ha solicitado suscribirse a una newsletter. Toma dos par\u00e1metros: user_name y user_email. Dentro de esta funci\u00f3n, se construye un mensaje HTML usando una f-string, que incluye el nombre del usuario y un enlace de confirmaci\u00f3n falso. De nuevo, esta funci\u00f3n llama a la funci\u00f3n <code>_send_email()<\/code> para enviar el email.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La segunda funci\u00f3n stub, <code>subscribe_user()<\/code>, es el punto de entrada principal para el proceso de suscripci\u00f3n del usuario. Tambi\u00e9n toma user_name y user_email como par\u00e1metros. Esta funci\u00f3n normalmente gestiona el proceso de suscripci\u00f3n inicial, probablemente almacenando la informaci\u00f3n del usuario con un estado &#8216;pendiente&#8217;. Al final, registra el env\u00edo del email y luego llama a la funci\u00f3n <code>_notify_subscription()<\/code> para crear y enviar el email de confirmaci\u00f3n de opt in doble.\u00a0<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mejores pr\u00e1cticas: Automatizar emails para restablecer la contrase\u00f1a<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u00bfAlguna vez has necesitado iniciar sesi\u00f3n, solo para darte cuenta de que hab\u00edas olvidado tu contrase\u00f1a y tener que hacer clic en el enlace \u00abolvid\u00e9 mi contrase\u00f1a\u00bb? Hacer clic en ese enlace act\u00faa como disparador de un email que esperas con impaciencia.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed tienes un c\u00f3digo de ejemplo que demuestra c\u00f3mo automatizar este tipo de email transaccional:\u00a0<\/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=\"Copy to clipboard\" data-clipboard-success-label=\"Copied!\" data-clipboard-error-label=\"Unable to copy\" data-tooltip=\"Copy to clipboard\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copy to clipboard\">\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 \r\ndef _notify_password_reset(user_name: str, user_email: str): \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202fSend password reset email to the user \r\n\r\n\u202f\u202f\u202f\u202f:param user_name: \r\n\r\n\u202f\u202f\u202f\u202f:param user_email: \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202f# Use your own formatted HTML message here \r\n\r\n\u202f\u202f\u202f\u202fregistration_msg = f&#039;Dear {user_name},&lt;br \/&gt;&lt;br \/&gt; Please use the following link to reset your password: &#039; \\ \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202ff&#039;&lt;a href=&quot;https:\/\/example.com\/password-reset?token=lmnopqr7654321abc&quot;&gt;&#039; \\ \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202ff&#039;https:\/\/example.com\/password-reset?token=lmnopqr7654321abc&lt;\/a&gt;&#039; \r\n\r\n\u202f\u202f\u202f\u202f_send_email(user_email, &quot;Reset password&quot;, registration_msg) \r\n\r\ndef reset_user_password(user_name: str, user_email: str): \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202fInitiate password-reset and notify user \r\n\r\n\u202f\u202f\u202f\u202f:param user_name: \r\n\r\n\u202f\u202f\u202f\u202f:param user_email: \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202f# Password reset code for the user \r\n\r\n\u202f\u202f\u202f\u202flogging.info(f&quot;Sending password reset email to the user: {user_name}...&quot;) \r\n\r\n\u202f\u202f\u202f\u202f_notify_password_reset(user_name, user_email) \r\n``` \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">La funci\u00f3n <code>_notify_password_reset()<\/code> se encarga de crear y enviar al usuario un email para restablecer la contrase\u00f1a. Toma el nombre del usuario y la direcci\u00f3n de email como entradas. Dentro de la funci\u00f3n, se crea un mensaje HTML usando una f-string, que incluye el nombre del usuario y una URL \u00fanica para restablecer la contrase\u00f1a. La funci\u00f3n luego usa la funci\u00f3n <code>_send_email()<\/code> para entregar este mensaje a la bandeja de entrada del usuario.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La funci\u00f3n <code>reset_user_password()<\/code> trabaja junto a ella como punto de partida cuando un usuario quiere restablecer su contrase\u00f1a. Tambi\u00e9n requiere el nombre del usuario y su email como entradas. Esta funci\u00f3n normalmente har\u00eda algo de trabajo en segundo plano para configurar el restablecimiento de contrase\u00f1a (no se muestra en este c\u00f3digo). A continuaci\u00f3n, registra el env\u00edo del email y llama a <code>_notify_password_reset()<\/code> para enviar las instrucciones para restablecer.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">De forma similar a los dos casos de uso anteriores, este par de funciones demuestra un enfoque modular para gestionar el restablecimiento de contrase\u00f1as. Al mantener separados los procesos de notificaci\u00f3n y del disparador, este dise\u00f1o hace que el sistema sea m\u00e1s f\u00e1cil de mantener y permite futuras mejoras en el flujo de trabajo para restablecer la contrase\u00f1a.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Puedes llamar a estas funciones desde la funci\u00f3n principal como demostraci\u00f3n, as\u00ed:\u00a0<\/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=\"Copy to clipboard\" data-clipboard-success-label=\"Copied!\" data-clipboard-error-label=\"Unable to copy\" data-tooltip=\"Copy to clipboard\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copy to clipboard\">\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 \r\n# Demo of automated transactional emails \r\n\r\nif __name__ == &quot;__main__&quot;: \r\n\r\n\u202f\u202f\u202f\u202fregister_user(&quot;Kirstin&quot;,\u202f &quot;Kirstin &quot;) \r\n\r\n\u202f\u202f\u202f\u202fsubscribe_user(&quot;Jakkie&quot;,\u202f &quot;Jakkie &quot;) \r\n\r\n\u202f\u202f\u202f\u202freset_user_password(&quot;Manish&quot;,\u202f &quot;Manish &quot;) \r\n``` \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Estos tres ejemplos muestran c\u00f3mo automatizar los emails transaccionales dentro de tu sistema. Cada uno sigue un patr\u00f3n similar:\u00a0<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Se crea una funci\u00f3n espec\u00edfica para un tipo particular de notificaci\u00f3n (registro, suscripci\u00f3n o restablecer contrase\u00f1a), cuyo disparador es el evento o flujo de trabajo correspondiente.\u00a0<\/li>\n\n\n\n<li>La funci\u00f3n prepara un mensaje de email relevante.\u00a0<\/li>\n\n\n\n<li>Se llama a una funci\u00f3n de utilidad separada (usando la API de Mailgun) para enviar realmente el email.\u00a0<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Este enfoque garantiza que los emails transaccionales se env\u00eden autom\u00e1ticamente en momentos clave, como cuando un usuario se registra, se suscribe o solicita restablecer su contrase\u00f1a.\u00a0\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\"> Puedes encontrar todo el c\u00f3digo de este tutorial en <a href=\"https:\/\/github.com\/manishh\/gifts-giveaways\/tree\/master\/python\/mailgun-transactional-emails\">este repositorio de GitHub<\/a>. Para obtener a\u00fan m\u00e1s informaci\u00f3n, consulta <a href=\"https:\/\/www.mailgun.com\/blog\/email\/the-benefits-of-email-automation\/\">los ocho beneficios de la automatizaci\u00f3n de emails para mejorar la experiencia del cliente.<\/a>\u00a0<\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 sigue despu\u00e9s de implementar estos flujos de trabajo?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En este art\u00edculo, desglosamos el poder de los emails transaccionales en la comunicaci\u00f3n con el usuario. A diferencia de los emails de marketing, estos mensajes tienen como disparador acciones espec\u00edficas (como una compra o restablecer la contrase\u00f1a) y ofrecen informaci\u00f3n crucial y oportuna que mantiene a los usuarios interactuando e informados.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n cubrimos c\u00f3mo automatizar estos emails usando flujos de trabajo de API, gui\u00e1ndote a trav\u00e9s de la configuraci\u00f3n de funciones para cosas como emails de bienvenida, confirmaciones de suscripci\u00f3n y restablecer contrase\u00f1as. Esta automatizaci\u00f3n garantiza que tus emails lleguen a las bandejas de entrada justo cuando tus usuarios los necesitan.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00bfListo para optimizar tus emails transaccionales? Con las s\u00f3lidas API y las herramientas de seguimiento de Mailgun, puedes automatizar mensajes y mejorar la experiencia del usuario f\u00e1cilmente de principio a fin, pero no conf\u00edes solo en nuestra palabra, compru\u00e9balo t\u00fa mismo. <\/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_abee6fc972bae36a071ccbd9a997f528\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                Reg\u00edstrate            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_abee6fc972bae36a071ccbd9a997f528\">\r\n                Empezar es facil\u00edsimo. Y gratis.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">Descubre todo lo que puedes lograr con la mejor plataforma de entrega de emails del mundo.<\/div>\r\n                            <\/div>\r\n        \r\n        <div class=\"text-start mt-5\"><a href=\"https:\/\/signup.mailgun.com\/new\/signup\"  class=\"btn btn-secondary\" >Get started<\/a><\/div>\r\n    <\/aside>\r\n\r\n","protected":false},"excerpt":{"rendered":"<p>Mant\u00e9n a los clientes informados con emails transaccionales que generen confianza. Aprende c\u00f3mo potenciar tu automatizaci\u00f3n de emails con los flujos de trabajo de la API de Mailgun para una experiencia del cliente impecable.\u00a0<\/p>\n","protected":false},"author":11,"featured_media":3952,"menu_order":0,"template":"","meta":{"_acf_changed":false,"footnotes":""},"blog_category":[19],"class_list":["post-17560","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>Mejores pr\u00e1cticas de email transaccional para desarrolladores, con ejemplos de c\u00f3digo - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Mejores pr\u00e1cticas de email transaccional para desarrolladores: configuraci\u00f3n segura de API, manejo de errores y c\u00f3digo Python para los flujos de trabajo de registro, opt in y restablecer contrase\u00f1a.\" \/>\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\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mejores pr\u00e1cticas de email transaccional para desarrolladores, con ejemplos de c\u00f3digo - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Mejores pr\u00e1cticas de email transaccional para desarrolladores: configuraci\u00f3n segura de API, manejo de errores y c\u00f3digo Python para los flujos de trabajo de registro, opt in y restablecer contrase\u00f1a.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-28T08:25:49+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=\"8 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\\\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\\\/\",\"name\":\"Mejores pr\u00e1cticas de email transaccional para desarrolladores, con ejemplos de c\u00f3digo - 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\\\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"datePublished\":\"2026-08-17T15:25:50+00:00\",\"dateModified\":\"2026-08-28T08:25:49+00:00\",\"description\":\"Mejores pr\u00e1cticas de email transaccional para desarrolladores: configuraci\u00f3n segura de API, manejo de errores y c\u00f3digo Python para los flujos de trabajo de registro, opt in y restablecer contrase\u00f1a.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\\\/#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\\\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\\\/#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\":\"Mejores pr\u00e1cticas de email transaccional para desarrolladores\"}]},{\"@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":"Mejores pr\u00e1cticas de email transaccional para desarrolladores, con ejemplos de c\u00f3digo - Transactional Email API Service For Developers | Mailgun","description":"Mejores pr\u00e1cticas de email transaccional para desarrolladores: configuraci\u00f3n segura de API, manejo de errores y c\u00f3digo Python para los flujos de trabajo de registro, opt in y restablecer contrase\u00f1a.","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\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\/","og_locale":"es_ES","og_type":"article","og_title":"Mejores pr\u00e1cticas de email transaccional para desarrolladores, con ejemplos de c\u00f3digo - Transactional Email API Service For Developers | Mailgun","og_description":"Mejores pr\u00e1cticas de email transaccional para desarrolladores: configuraci\u00f3n segura de API, manejo de errores y c\u00f3digo Python para los flujos de trabajo de registro, opt in y restablecer contrase\u00f1a.","og_url":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","article_modified_time":"2026-08-28T08:25:49+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":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\/","url":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\/","name":"Mejores pr\u00e1cticas de email transaccional para desarrolladores, con ejemplos de c\u00f3digo - 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\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","datePublished":"2026-08-17T15:25:50+00:00","dateModified":"2026-08-28T08:25:49+00:00","description":"Mejores pr\u00e1cticas de email transaccional para desarrolladores: configuraci\u00f3n segura de API, manejo de errores y c\u00f3digo Python para los flujos de trabajo de registro, opt in y restablecer contrase\u00f1a.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/es\/blog\/dev-life\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\/#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\/crear-flujos-de-trabajo-de-api-para-emails-transaccionales\/#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":"Mejores pr\u00e1cticas de email transaccional para desarrolladores"}]},{"@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\/17560","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":3,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/17560\/revisions"}],"predecessor-version":[{"id":17585,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/17560\/revisions\/17585"}],"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=17560"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog_category?post=17560"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}