{"id":20321,"date":"2026-09-14T23:34:00","date_gmt":"2026-09-14T23:34:00","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api-2\/"},"modified":"2026-09-14T23:34:00","modified_gmt":"2026-09-14T23:34:00","slug":"how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/es\/blog\/email\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\/","title":{"rendered":"C\u00f3mo enviar emails transaccionales en una aplicaci\u00f3n NodeJS usando la API de Mailgun"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">No solo puedes conseguir una potente reactivaci\u00f3n basada en disparadores, acciones y patrones, sino que tambi\u00e9n puedes comunicar informaci\u00f3n importante <strong><em>autom\u00e1ticamente<\/em><\/strong> entre tu plataforma y un cliente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es muy probable que, como desarrollador\/a, alguna vez tengas que enviar emails transaccionales automatizados (si no lo has hecho ya), como:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Emails de confirmaci\u00f3n<\/li>\n\n\n\n<li>Recordatorios de contrase\u00f1a<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u2026 y muchos otros tipos de notificaciones.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este tutorial aprenderemos <strong>c\u00f3mo enviar emails transaccionales usando la API de Mailgun y una biblioteca auxiliar de NodeJS<\/strong>. <\/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-1566\"><p class=\"h5 m-0\" id=\"toc-title-1566\">\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=\"#cubriremos-diferentes-escenarios\">Cubriremos diferentes escenarios:<\/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=\"#enviar-emails-smtp-frente-a-api\">Enviar emails: SMTP frente a API\u00a0<\/a><a class=\"scrollme link-body-color\" href=\"#primeros-pasos-con-tu-aplicacion-de-node-js\">Primeros pasos con tu aplicaci\u00f3n de Node.js<\/a><a class=\"scrollme link-body-color\" href=\"#paso-1-inicializacion-del-proyecto\">Paso 1: Inicializaci\u00f3n del proyecto<\/a><a class=\"scrollme link-body-color\" href=\"#paso-2-configurar-una-aplicacion-sencilla-de-expressjs\">Paso 2: Configurar una aplicaci\u00f3n sencilla de ExpressJS<\/a><a class=\"scrollme link-body-color\" href=\"#paso-3-crear-la-vista-y-los-archivos-de-javascript\">Paso 3: Crear la vista y los archivos de JavaScript:<\/a><a class=\"scrollme link-body-color\" href=\"#paso-4-ejecutar-la-aplicacion\">Paso 4: Ejecutar la aplicaci\u00f3n<\/a><a class=\"scrollme link-body-color\" href=\"#entender-como-funciona-la-aplicacion\">Entender c\u00f3mo funciona la aplicaci\u00f3n<\/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=\"#ejemplos-practicos-enviar-emails-con-la-api-de-node-js-de-mailgun\">Ejemplos pr\u00e1cticos: enviar emails con la API de Node.js de Mailgun\u00a0<\/a><a class=\"scrollme link-body-color\" href=\"#enviar-un-unico-email-transaccional\">Enviar un \u00fanico email transaccional\u00a0<\/a><a class=\"scrollme link-body-color\" href=\"#anadir-direcciones-de-email-a-una-lista\">A\u00f1adir direcciones de email a una lista\u00a0<\/a><a class=\"scrollme link-body-color\" href=\"#enviar-una-factura-con-un-adjunto\">Enviar una factura con un adjunto\u00a0<\/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=\"#dar-los-ultimos-toques-a-tu-remitente-de-emails-en-node-js\">Dar los \u00faltimos toques a tu remitente de emails en Node.js<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Cubriremos diferentes escenarios:<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Enviar un \u00fanico email transaccional<\/li>\n\n\n\n<li>Enviar una newsletter a una lista de contactos<\/li>\n\n\n\n<li>A\u00f1adir direcciones de email a una lista<\/li>\n\n\n\n<li>Enviar una factura a una \u00fanica direcci\u00f3n de email<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Enviar emails: SMTP frente a API\u00a0<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A la hora de enviar emails desde una aplicaci\u00f3n de Node.js, puedes usar un cliente SMTP directo o una API de email. Tradicionalmente, se sol\u00eda usar una biblioteca como Nodemailer para configurar una conexi\u00f3n directa a un servidor SMTP. Aunque el protocolo SMTP te da control, tiene varios inconvenientes, como una configuraci\u00f3n compleja y una mala entregabilidad.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El uso de una API, como en el caso de Mailgun, simplifica todo el proceso. En lugar de gestionar el protocolo subyacente, puedes realizar una sencilla solicitud HTTP. La s\u00f3lida infraestructura de Mailgun gestiona la comunicaci\u00f3n SMTP por ti para ofrecer una mejor entregabilidad y funcionalidades integradas, como anal\u00edticas y validaci\u00f3n de emails.\u00a0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Primeros pasos con tu aplicaci\u00f3n de Node.js<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Esta secci\u00f3n te guiar\u00e1 para configurar tu proyecto y poner en marcha tu aplicaci\u00f3n.\u00a0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Paso 1: Inicializaci\u00f3n del proyecto<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Suponemos que has instalado NodeJS y sabes c\u00f3mo usar su entorno.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lo primero que haremos ser\u00e1 generar un archivo <code>package.json<\/code> en un directorio nuevo (<code>\/mailgun_nodetut<\/code>, en mi caso). Este archivo contiene detalles <strong>como el nombre del proyecto y las dependencias requeridas<\/strong>.\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                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"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-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    {\r\n  &quot;name&quot;: &quot;mailgun-node-tutorial&quot;,\r\n  &quot;version&quot;: &quot;0.0.1&quot;,\r\n  &quot;private&quot;: true,\r\n  &quot;scripts&quot;: {\r\n    &quot;start&quot;: &quot;node app.js&quot;\r\n  },\r\n  &quot;dependencies&quot;: {\r\n    &quot;express&quot;: &quot;4&quot;,\r\n    &quot;jade&quot;: &quot;*&quot;,\r\n    &quot;mailgun-js&quot;: &quot;0.5&quot;\r\n  }\r\n}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Como puedes ver, usaremos <code>expressjs<\/code> para la estructura de nuestra aplicaci\u00f3n web, <code>jade<\/code> como lenguaje de plantillas y, por \u00faltimo, una biblioteca para Node aportada por la comunidad de la mano de <a href=\"https:\/\/www.npmjs.org\/~bojand\" target=\"_blank\" rel=\"noreferrer noopener\">bojand<\/a>.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En la misma carpeta donde has creado el archivo <code>package.json<\/code>, crea otras dos: <code>views\/ js\/\u00a0<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Todo listo; solo tienes que iniciar sesi\u00f3n en <a href=\"https:\/\/signup.mailgun.com\/new\/signup\" target=\"_blank\" rel=\"noreferrer noopener\">Mailgun<\/a> (es gratis, por si a\u00fan no lo has hecho) y obt\u00e9n tu clave de API en la primera p\u00e1gina del panel de control.\u00a0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Paso 2: Configurar una aplicaci\u00f3n sencilla de ExpressJS<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Guarda el siguiente c\u00f3digo como <code>app.js<\/code> en el directorio ra\u00edz de tu aplicaci\u00f3n (donde se encuentra <code>package.json<\/code>)\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                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"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-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    \/\/We&#039;re using the express framework and the mailgun-js wrapper\r\nvar express = require(&#039;express&#039;);\r\nvar Mailgun = require(&#039;mailgun-js&#039;);\r\n\/\/init express\r\nvar app = express();\r\n\r\n\/\/Your api key, from Mailgun\u2019s Control Panel\r\nvar api_key = &#039;MAILGUN-API-KEY&#039;;\r\n\r\n\/\/Your domain, from the Mailgun Control Panel\r\nvar domain = &#039;YOUR-DOMAIN.com&#039;;\r\n\r\n\/\/Your sending email address\r\nvar from_who = &#039;your@email.com&#039;;\r\n\r\n\/\/Tell express to fetch files from the \/js directory\r\napp.use(express.static(__dirname + &#039;\/js&#039;));\r\n\/\/We&#039;re using the Jade templating language because it&#039;s fast and neat\r\napp.set(&#039;view engine&#039;, &#039;jade&#039;)\r\n\r\n\/\/Do something when you&#039;re landing on the first page\r\napp.get(&#039;\/&#039;, function(req, res) {\r\n\/\/render the index.jade file - input forms for humans\r\nres.render(&#039;index&#039;, function(err, html) {\r\nif (err) {\r\n\/\/ log any error to the console for debug\r\nconsole.log(err); \r\n}\r\nelse { \r\n\/\/no error, so send the html to the browser\r\nres.send(html)\r\n};\r\n});\r\n});\r\n\r\n\/\/ Send a message to the specified email address when you navigate to \/submit\/someaddr@email.com\r\n\/\/ The index redirects here\r\napp.get(&#039;\/submit\/:mail&#039;, function(req,res) {\r\n\r\n\/\/We pass the api_key and domain to the wrapper, or it won&#039;t be able to identify + send emails\r\nvar mailgun = new Mailgun({apiKey: api_key, domain: domain});\r\n\r\nvar data = {\r\n\/\/Specify email data\r\nfrom: from_who,\r\n\/\/The email to contact\r\nto: req.params.mail,\r\n\/\/Subject and text data  \r\nsubject: &#039;Hello from Mailgun&#039;,\r\nhtml: &#039;Hello, This is not a plain-text email, I wanted to test some spicy Mailgun sauce in NodeJS! &lt;a href=&quot;http:\/\/0.0.0.0:3030\/validate?&amp;apos; + req.params.mail + &amp;apos;&quot;&gt;Click here to add your email address to a mailing list&lt;\/a&gt;&#039;\r\n}\r\n\r\n\/\/Invokes the method to send emails given the above data with the helper library\r\nmailgun.messages().send(data, function (err, body) {\r\n\/\/If there is an error, render the error page\r\nif (err) {\r\nres.render(&#039;error&#039;, { error : err});\r\nconsole.log(&quot;got an error: &quot;, err);\r\n}\r\n\/\/Else we can greet    and leave\r\nelse {\r\n\/\/Here &quot;submitted.jade&quot; is the view file for this landing page \r\n\/\/We pass the variable &quot;email&quot; from the url parameter in an object rendered by Jade\r\nres.render(&#039;submitted&#039;, { email : req.params.mail });\r\nconsole.log(body);\r\n}\r\n});\r\n\r\n});\r\n\r\napp.get(&#039;\/validate\/:mail&#039;, function(req,res) {\r\nvar mailgun = new Mailgun({apiKey: api_key, domain: domain});\r\n\r\nvar members = [\r\n{\r\naddress: req.params.mail\r\n}\r\n];\r\n\/\/For the sake of this tutorial you need to create a mailing list on Mailgun.com\/cp\/lists and put its address below\r\nmailgun.lists(&#039;NAME@MAILINGLIST.COM&#039;).members().add({ members: members, subscribed: true }, function (err, body) {\r\nconsole.log(body);\r\nif (err) {\r\nres.send(&quot;Error - check console&quot;);\r\n}\r\nelse {\r\nres.send(&quot;Added to mailing list&quot;);\r\n}\r\n});\r\n\r\n})\r\n\r\napp.get(&#039;\/invoice\/:mail&#039;, function(req,res){\r\n\/\/Which file to send? I made an empty invoice.txt file in the root directory\r\n\/\/We required the path module here..to find the full path to attach the file!\r\nvar path = require(&quot;path&quot;);\r\nvar fp = path.join(__dirname, &#039;invoice.txt&#039;);\r\n\/\/Settings\r\nvar mailgun = new Mailgun({apiKey: api_key, domain: domain});\r\n\r\nvar data = {\r\nfrom: from_who,\r\nto: req.params.mail,\r\nsubject: &#039;An invoice from your friendly hackers&#039;,\r\ntext: &#039;A fake invoice should be attached, it is just an empty text file after all&#039;,\r\nattachment: fp\r\n};\r\n\r\n\/\/Sending the email with attachment109    mailgun.messages().send(data, function (error, body) {\r\nif (error) {\r\nres.render(&#039;error&#039;, {error: error});\r\n}\r\nelse {\r\nres.send(&quot;Attachment is on its way&quot;);\r\nconsole.log(&quot;attachment sent&quot;, fp);\r\n}\r\n});\r\n})\r\n\r\napp.listen(3030);\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\">Paso 3: Crear la vista y los archivos de JavaScript:<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Guarda el siguiente c\u00f3digo como <code>index.jade<\/code> en el directorio <code>\/views<\/code><\/em><\/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                                HTML                            <\/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-markup\">\r\n                                <code id=\"code_0_content\" class=\"language-markup\">\r\n\r\n                                    doctype html\r\nhtml\r\nhead\r\ntitle Mailgun Transactional demo in NodeJS\r\nbody\r\np Welcome to a Mailgun form\r\nform(id=&quot;mgform&quot;)\r\nlabel(for=&quot;mail&quot;) Email\r\ninput(type=&quot;text&quot; id=&quot;mail&quot; placeholder=&quot;Youremail@address.com&quot;)\r\nbutton(value=&quot;bulk&quot; onclick=&quot;mgform.hid=this.value&quot;) Send transactional\r\nbutton(value=&quot;list&quot; onclick=&quot;mgform.hid=this.value&quot;) Add to list\r\nbutton(value=&quot;inv&quot; onclick=&quot;mgform.hid=this.value&quot;) Send invoice\r\nscript(type=&quot;text\/javascript&quot; src=&quot;main.js&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\"><i>Guarda el siguiente c\u00f3digo como\u00a0<\/i><i><code>error.jade<\/code><\/i><i>\u00a0en el directorio \/views<\/i><\/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                                HTML                            <\/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-markup\">\r\n                                <code id=\"code_0_content\" class=\"language-markup\">\r\n\r\n                                    doctype html\r\nhtml\r\nhead\r\ntitle Mailgun Transactional\r\nbody\r\np Well that&#039;s awkward: #{error}\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\"><i>Guarda el siguiente c\u00f3digo como\u00a0<\/i><i><code>main.js<\/code><\/i><i>\u00a0en el directorio \/js<\/i><\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"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-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    var vForm = document.getElementById(&#039;mgform&#039;);\r\nvar vInput = document.getElementById(&#039;mail&#039;);\r\n\r\nvForm.onsubmit = function() {\r\nif (this.hid == &quot;bulk&quot;) {\r\nlocation = &quot;\/submit\/&quot; + encodeURIComponent(vInput.value);\r\n}\r\nif (this.hid == &quot;list&quot;) {\r\nlocation = &quot;\/validate\/&quot; + encodeURIComponent(vInput.value);\r\n}\r\nif (this.hid == &quot;inv&quot;) {\r\nlocation = &quot;\/invoice\/&quot; + encodeURIComponent(vInput.value);\r\n}\r\n\r\nreturn false;\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\">Por \u00faltimo, crea un archivo <code>invoice.txt<\/code> vac\u00edo en la carpeta ra\u00edz. Este archivo se enviar\u00e1 como adjunto.\u00a0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Paso 4: Ejecutar la aplicaci\u00f3n<\/h3>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Ejecuta <code>npm install<\/code> (o <code>sudo npm install<\/code> en algunos casos, seg\u00fan tus m\u00e9todos de instalaci\u00f3n) para descargar las dependencias, incluida Express.\u00a0<\/li>\n<\/ol>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Una vez hecho esto, ejecuta <code>node app.js\u00a0<\/code><\/li>\n<\/ol>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Ve en el navegador a <code>localhost:3030<\/code> (o <code>0.0.0.0:3030<\/code>)\u00a0<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u00a1Con estos tres sencillos pasos podr\u00e1s empezar a enviar emails transaccionales bajo demanda!\u00a0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Entender c\u00f3mo funciona la aplicaci\u00f3n<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Lo anterior es una aplicaci\u00f3n sencilla de Express que se ejecutar\u00e1 en tu equipo local en el puerto\u00a0<code>3030<\/code>. La hemos definido para usar expressjs y el wrapper mailgun-js. Se trata de bibliotecas bastante conocidas que nos ayudar\u00e1n a\u00a0<b>configurar r\u00e1pidamente un peque\u00f1o sitio web<\/b>\u00a0que permitir\u00e1 a los usuarios desencadenar el env\u00edo de emails a sus direcciones.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Los puntos de conexi\u00f3n<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Hemos definido 4 puntos de conexi\u00f3n.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>\/<\/code><\/li>\n\n\n\n<li><code>\/submit\/:mail<\/code><\/li>\n\n\n\n<li><code>\/validate\/:mail<\/code><\/li>\n\n\n\n<li><code>\/invoice\/:mail<\/code><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Donde\u00a0<code>:mail<\/code>\u00a0es tu direcci\u00f3n de email v\u00e1lida.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al navegar a un punto de conexi\u00f3n, Express enviar\u00e1 al navegador una vista diferente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En segundo plano, Express tomar\u00e1 la entrada proporcionada por el navegador y la procesar\u00e1 con ayuda de la biblioteca\u00a0<code>mailgun-js<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En el primer caso, navegaremos a la ra\u00edz, que es\u00a0<code>localhost:3030\/<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Puedes ver que hay un cuadro de entrada donde se te pide tu direcci\u00f3n de email. Al hacerlo,\u00a0<b>te env\u00edas un buen email transaccional.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esto se debe a que expressjs toma tu direcci\u00f3n de email del par\u00e1metro de la URL y, al usar tu clave de API y tu dominio, hace una llamada a la API al punto de conexi\u00f3n para enviar emails.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cada punto de conexi\u00f3n invocar\u00e1 un dise\u00f1o distinto. He a\u00f1adido el c\u00f3digo de los dise\u00f1os b\u00e1sicos a continuaci\u00f3n; si\u00e9ntete libre de a\u00f1adir o quitar elementos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ejemplos pr\u00e1cticos: enviar emails con la API de Node.js de Mailgun\u00a0<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En nuestro ejemplo hemos visto c\u00f3mo se puede enviar un email transaccional autom\u00e1ticamente cuando el usuario desencadena una acci\u00f3n espec\u00edfica.\u00a0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Enviar un \u00fanico email transaccional\u00a0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Al navegar a la ra\u00edz <code>localhost:3030\/<\/code>, ver\u00e1s un cuadro de entrada donde se te pide tu direcci\u00f3n de email. Al hacerlo, te env\u00edas un buen email transaccional.\u00a0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A\u00f1adir direcciones de email a una lista\u00a0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">El punto de conexi\u00f3n <code>\/validate\/:mail<\/code> muestra c\u00f3mo a\u00f1adir una direcci\u00f3n de email a una lista de contactos. Para este tutorial, necesitas crear una lista de contactos en <code>Mailgun.com\/cp\/lists<\/code> y poner su direcci\u00f3n en el c\u00f3digo de <code>app.js<\/code>.\u00a0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Enviar una factura con un adjunto\u00a0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">El punto de conexi\u00f3n <code>\/invoice\/:mail<\/code> muestra c\u00f3mo enviar un adjunto. Hemos requerido el m\u00f3dulo path para encontrar la ruta completa y adjuntar el archivo vac\u00edo <code>invoice.txt<\/code> en tu directorio ra\u00edz.\u00a0<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dar los \u00faltimos toques a tu remitente de emails en Node.js<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En nuestro ejemplo hemos visto c\u00f3mo se puede enviar un email transaccional de forma autom\u00e1tica cuando el usuario desencadena una acci\u00f3n espec\u00edfica (en nuestro caso, enviar el formulario).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hay\u00a0<b>miles de aplicaciones a las que podr\u00edas adaptar este escenario<\/b>. El env\u00edo de emails puede usarse para:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Registrar una cuenta en un sitio web y\u00a0un email con el mensaje\u00a0<i>Hola\u00a0<\/i><\/li>\n\n\n\n<li>Restablecer una contrase\u00f1a<\/li>\n\n\n\n<li>Confirmar compras o acciones cr\u00edticas (eliminar una cuenta)<\/li>\n\n\n\n<li>Autenticaci\u00f3n en dos fases con m\u00faltiples direcciones de email<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><b>\u00bfPara qu\u00e9 usas los emails transaccionales en el d\u00eda a d\u00eda de tu negocio?<\/b><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Enviar emails transaccionales es f\u00e1cil independientemente de tus herramientas. Si usas una biblioteca auxiliar de NodeJS, este tutorial te ayudar\u00e1 a realizar la configuraci\u00f3n en Mailgun.<\/p>\n","protected":false},"author":13,"featured_media":4074,"menu_order":0,"template":"","meta":{"_acf_changed":false,"footnotes":""},"blog_category":[20],"class_list":["post-20321","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-email"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>C\u00f3mo enviar emails en NodeJS: ejemplos de SMTP y API - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Aprende a enviar emails en Node.js usando la API de Mailgun. Descubre ejemplos de c\u00f3digo completos sobre c\u00f3mo enviar emails transaccionales, adjuntos y mucho m\u00e1s.\" \/>\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\/email\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C\u00f3mo enviar emails en NodeJS: ejemplos de SMTP y API - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Aprende a enviar emails en Node.js usando la API de Mailgun. Descubre ejemplos de c\u00f3digo completos sobre c\u00f3mo enviar emails transaccionales, adjuntos y mucho m\u00e1s.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/es\/blog\/email\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"448\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"5 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\\\/email\\\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/email\\\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\\\/\",\"name\":\"C\u00f3mo enviar emails en NodeJS: ejemplos de SMTP y API - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/email\\\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/email\\\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"datePublished\":\"2026-09-14T23:34:00+00:00\",\"description\":\"Aprende a enviar emails en Node.js usando la API de Mailgun. Descubre ejemplos de c\u00f3digo completos sobre c\u00f3mo enviar emails transaccionales, adjuntos y mucho m\u00e1s.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/email\\\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/email\\\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/email\\\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/email\\\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\\\/#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\":\"C\u00f3mo enviar emails transaccionales en una aplicaci\u00f3n NodeJS usando 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":"C\u00f3mo enviar emails en NodeJS: ejemplos de SMTP y API - Transactional Email API Service For Developers | Mailgun","description":"Aprende a enviar emails en Node.js usando la API de Mailgun. Descubre ejemplos de c\u00f3digo completos sobre c\u00f3mo enviar emails transaccionales, adjuntos y mucho m\u00e1s.","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\/email\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\/","og_locale":"es_ES","og_type":"article","og_title":"C\u00f3mo enviar emails en NodeJS: ejemplos de SMTP y API - Transactional Email API Service For Developers | Mailgun","og_description":"Aprende a enviar emails en Node.js usando la API de Mailgun. Descubre ejemplos de c\u00f3digo completos sobre c\u00f3mo enviar emails transaccionales, adjuntos y mucho m\u00e1s.","og_url":"https:\/\/www.mailgun.com\/es\/blog\/email\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/es\/blog\/email\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\/","url":"https:\/\/www.mailgun.com\/es\/blog\/email\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\/","name":"C\u00f3mo enviar emails en NodeJS: ejemplos de SMTP y API - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/email\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/email\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","datePublished":"2026-09-14T23:34:00+00:00","description":"Aprende a enviar emails en Node.js usando la API de Mailgun. Descubre ejemplos de c\u00f3digo completos sobre c\u00f3mo enviar emails transaccionales, adjuntos y mucho m\u00e1s.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/email\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/es\/blog\/email\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/blog\/email\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/es\/blog\/email\/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api\/#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":"C\u00f3mo enviar emails transaccionales en una aplicaci\u00f3n NodeJS usando 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\/20321","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\/13"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/20321\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media\/4074"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media?parent=20321"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog_category?post=20321"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}