Guías de Make it Real
  • Introduction
  • Preparación
    • Conceptos básicos
    • El editor de texto
    • La línea de comandos
    • Git y Github
  • Git
    • Instalación y configuración
    • Conceptos y comandos esenciales
    • Ignorando archivos y carpetas
    • Trabajando con ramas
    • Repositorios remotos
    • Etiquetas
    • Reescribiendo la historia
    • Stashing
    • Github
  • HTML y CSS
    • Introducción a HTML
    • Introducción a CSS
    • Más elementos de HTML
    • Tablas
    • Formularios
    • El modelo de caja en CSS
    • Fondos (backgrounds)
    • Posicionamiento
    • Selectores CSS
    • Bordes, sombras y gradientes
    • Media Queries
    • Unidades en CSS
    • Flexbox
  • Bootstrap 3
    • Primeros pasos
    • Elementos básicos de HTML
    • Componentes
    • La grilla
    • Personalizando Bootstrap
    • Utilizando plantillas
  • Bootstrap 4
    • Primeros pasos
    • Elementos básicos de HTML
    • Componentes
    • La grilla
    • Clases utilitarias
    • Personalizando Bootstrap
  • Ruby
    • Primeros pasos
    • Tipos y operadores
    • Variables y entrada de usuario
    • Condicionales
    • Ciclos
    • Arreglos
    • Más cadenas de texto
    • Hashes
    • Métodos
    • Manipulación de archivos
    • Gemas
  • Programación Orientada a Objetos en Ruby
    • Clases y objetos
    • Métodos y atributos de clase
    • Herencia
    • Módulos
    • Excepciones
  • JavaScript I
    • Primeros pasos
    • Tipos y operadores
    • Variables
    • Condicionales
    • Ciclos
    • Arreglos
    • Más cadenas de texto
    • Funciones
    • Objetos literales
    • Manipulación de archivos
  • JavaScript en el navegador
    • Primeros pasos
    • Manipulando HTML
    • Escuchando eventos
    • Local Storage
    • History API
    • Canvas
    • Notificaciones Web
    • Audio y Video
    • Arrastrar y soltar
    • JSON
    • Realizando peticiones HTTP
  • jQuery
    • Primeros pasos
    • Manipulando HTML
    • Escuchando eventos
    • Plugins
    • Realizando peticiones con AJAX
  • JavaScript II
    • Prototipos
    • Librerías (Node.js)
    • ES6
    • Uso de this (call, apply, bind)
    • Programación funcional
    • Scope, hoisting, closures
    • Programación asincrónica
    • Testing
  • HTTP y Sinatra
    • Primeros pasos con Sinatra
    • El protocolo HTTP
    • Rutas
    • Formularios
    • Cookies y sesión
  • Bases de datos
    • Bases de datos relacionales
    • SQL
    • DDL
    • MongoDB
  • Ruby on Rails I
    • Primeros pasos
    • Arquitectura
    • Rutas
    • Layouts y rendering
    • ActiveRecord - Modelos
    • ActiveRecord - Migraciones
    • ActiveRecord - Validaciones
    • ActiveRecord - Asociaciones
    • ActiveRecord - Scopes
    • ActiveRecord - Callbacks
    • Recursos REST
    • Formularios
    • Autenticación con Devise
    • Sass y Bootstrap
    • Envío de correos
    • Carga de imágenes
    • Seeds
    • Heroku
  • Ruby on Rails II
    • Usando JavaScript (y jQuery) en Rails
    • Testing en Ruby
    • Testing en Rails
    • Creando una Web API
    • Web Sockets
  • Express.js
    • Primeros Pasos
    • El protocolo HTTP
    • Rutas
    • Vistas
    • Middlewares y manejo de errores
    • Formularios
    • Cookies y sesión
  • Express.js II
    • Mongoose
    • Web Sockets
    • Autenticación
    • Envío de correos
    • Cargar imágenes
    • Deployment
    • Testing
    • Creando una Web API
  • React
    • Primeros pasos
    • JSX
    • Componentes
    • Más sobre estado
    • Formularios
    • Peticiones HTTP con Axios
    • React Hooks
    • React Context
    • React Bootstrap
    • React Router
    • Carga de Imágenes
    • Testing
    • Estructura de carpetas
    • Componentes de clase
  • Redux
    • Primeros pasos
    • Action creators
    • Usando la librería react-redux
    • Middlewares
    • Operaciones asincrónicas con redux-thunk
    • Combinando funciones reductoras
    • Testing
    • Redux Tool Kit
  • Algoritmos
    • Describiendo un algoritmo
    • Complejidad (Big-O)
    • Estructuras de datos
    • Recursión
    • Ordenamiento
    • Búsqueda
    • Programación dinámica
  • Python
    • Primeros Pasos
    • Tipos y Variables
    • Funciones
    • Control de Flujo
    • Listas
    • Ciclos
    • Diccionarios, Tuplas y Sets
  • NumPy
    • Primeros Pasos
    • Arreglos
    • Arreglos Multidimensionales
    • Estadística con NumPy
    • Distribución Estadística
  • Pandas
    • Primeros Pasos
    • Inspección y Selección de Datos
    • Modificando Dataframes
    • La Función Lambda
    • Aggregates en Pandas
    • Múltiples Tablas
Powered by GitBook
On this page
  • Nodemailer
  • Utilizando el transporte de Sendgrid
  • Plantillas
  • Archivos adjuntos
  • SendGrid (librería oficial)
  • Correos programados
  • Plantillas
  1. Express.js II

Envío de correos

PreviousAutenticaciónNextCargar imágenes

Last updated 2 years ago

Para enviar correos electrónicos desde nuestras aplicaciones necesitamos un proveedor como , o (no recomendado para producción), entre otros.

En esta guía vamos a ver cómo funciona (la librería más popular) utilizando como proveedor.

Nota: Para seguir esta guía vas a necesitar crear una cuenta en y crear un API Key.

Nodemailer

utiliza para el envío de correos y se puede utilizar con cualquier proveedor.

La ventaja de utilizar es que es fácil cambiar de proveedor si es necesario. La desventaja es que no podemos utilizar las características adicionales que ofrecen algunos proveedores como plantillas y programación de correos, entre otros.

El primer paso para utilizar es instalar la librería:

$ npm install nodemailer

El siguiente paso es requerirla, crear un transporte (depende del proveedor que se utilice) y después utilizar el método sendMail para enviar el correo. En el siguiente ejemplo vamos a utilizar un transporte falso que simula el envío del correo (ideal para desarrollo y pruebas):

const express = require("express")
const nodemailer = require("nodemailer")

const app = express()

app.post("/sendEmail", async (req, res) => {
  const transporter = await createFakeTransporter()

  const email = await transporter.sendMail({
    from: '"Pedro Perez" <pedro@example.com>',
    to: "maria@example.com, juan@example.com",
    subject: "Hola ✔", // Asunto
    text: "Hola Mundo", // Contenido plano (texto)
    html: "<strong>Hola Mundo</strong>", // Contenido HTML
  })

  // Vista previa del correo (sólo para el transporte falso de pruebas)
  console.log("Preview URL: %s", nodemailer.getTestMessageUrl(email))

  res.json({ id: email.id })
})

async function createFakeTransporter() {
  let testAccount = await nodemailer.createTestAccount()

  return nodemailer.createTransport({
    host: "smtp.ethereal.email",
    port: 587,
    secure: false,
    auth: {
      user: testAccount.user,
      pass: testAccount.pass,
    },
  })
}

app.listen(3000)

Utilizando el transporte de Sendgrid

$ npm install nodemailer-sendgrid-transport

Y ahora debemos crear el transporte para enviar el email modificando el código anterior:

// ... requerir express y crear el app
const nodemailer = require("nodemailer")
const sgTransport = require('nodemailer-sendgrid-transport');

app.post("/sendEmail", (req, res) => {
  const transporter = await createSendGridTransporter()
  const email = await transporter.sendMail(...)
})

async function createSendGridTransporter() {
  const options = {
    auth: {
      api_key: 'SENDGRID_API_KEY' // Reemplazar por el API KEY
    }
  }

  return nodemailer.createTransport(sgTransport(options));
}

// ...

Plantillas

Creemos un archivo llamado templates.js que exporte funciones para cada una de las plantillas. Por ejemplo:

exports.welcomeEmail = function(name) {
  return `
    <h1>Hola ${name},</h1>
    <p><strong>Bienvenido ...</strong></p>
  `
}

exports.recoverPasswordEmail = function(token) {
  // retorna el HTML de recuperar contraseña
}

Archivos adjuntos

Para enviar archivos adjuntos desde Nodemailer sólo debes agregar la llave attachments al mensaje con un arreglo de objetos. Cada objeto representa un archivo adjunto:

let message = {
  ...
  attachments: [
    { // podemo pasar un string
      filename: 'text1.txt',
      content: 'hello world!'
    },
    { // o la ruta de un archivo, entre otras opciones
      path: '/path/to/file.txt'
    }
  ]
}

SendGrid (librería oficial)

$ npm install @sendgrid/mail

Para enviar correos utilizamos el método send:

const sgMail = require('@sendgrid/mail');

sgMail.setApiKey('SENDGRID_API_KEY');

async function send() {
  const msg = {
    to: 'test@example.com',
    from: 'test@example.com',
    subject: 'El asunto del mensaje',
    text: 'Contenido del mensaje como texto plano',
    html: '<strong>Contenido del mensaje como HTML</strong>',
  };

  try {
    await sgMail.send(msg)
  } catch (error) {
    console.error(error);

    if (error.response) {
      console.error(error.response.body)
    }
  }
}

send()

Correos programados

Al utilizar la librería oficial de SendGrid podemos aprovechar funcionalidades únicas como envío de correos programados agregando la llave send_at al mensaje. Por ejemplo, para enviar un correo 5 minutos en el futuro podemos agregar lo siguiente al construir el mensaje:

const time = Math.round((new Date()).getTime() / 1000) // UNIX Timestamp
const msg = {
  // ... ver ejemplo anterior
  send_at: time + 300 // 300 segundos = 5 minutos
};

Nota: Actualmente SendGrid sólo permite programar correos hasta 72 horas en el futuro.

Plantillas

SendGrid ofrece una funcionalidad que permite crear plantillas con variables que se reemplazarán al hacer el envío. Esto permite separar el diseño del código para que personas no técnicas puedan modificar el texto o elementos gráficos (utilizando un editor gráfico) sin necesidad de hacer cambios sobre el proyecto.

Para el contenido del correo puedes empezar a partir de alguno de los diseños predefinidos o desde cero. SendGrid incluye un editor gráfico pero también puedes manipular el HTML y CSS directamente si es necesario.

Las variables se insertan con doble corchete ({{ }}), por ejemplo, {{name}} o {{credits}} dentro del texto del correo.

Cada plantilla tiene un identificador único que se debe incluir al enviar el correo.

Por ejemplo, asumiendo que tenemos una plantilla con identificador d-12345 con dos variables name y credits, podríamos utilizar el siguiente código para enviar un mensaje reemplazando la variable name por Pedro Perez y credits por 15000:

const sgMail = require('@sendgrid/mail');

sgMail.setApiKey('SENDGRID_API_KEY');

async function send() {
  try {
    const msg = {
      from: 'test@example.com',
      personalizations: [
        {
          to: 'test@example.com',
          dynamic_template_data: {
            name: "Pedro Perez",
            credits: 15000
          }    
        }
      ],
      template_id: "d-12345",
    };
    
    await sgMail.send(msg)
  } catch (error) {
    console.error(error);

    if (error.response) {
      console.error(error.response.body)
    }
  } 
}

send()

En este ejemplo tenemos una llave personalizations donde vamos a incluir el valor de las variables para cada destinatario en la llave dynamic_template_data. Fíjate también en la llave template_id que se debe reemplazar con el verdadero identificador de la plantilla que se quiera usar.

Para utilizar sólo debemos reemplazar el transporte. El primer paso es instalar la librería :

Nota: No publiques tu API Key en repositorios de Git públicos o SendGrid bloqueará tu cuenta para evitar usos indebidos. Utiliza alguna librería como y una variable de entorno para almacenarla.

Escribir todo el código HTML del email dentro de nuestro código puede ser muy engorroso. Existen varias soluciones de plantillas como que permiten separar el código HTML del JavaScript. Sin embargo, una solución simple es usar las plantillas literales de JavaScript en otro archivo que contenga todas las plantillas de nuestros correos.

Recuerda que todos los estilos CSS deben ser en línea, es decir, dentro del atributo style de cada elemento. Si quieres separar el CSS del HTML te recomendamos . Su uso está por fuera del alcance de esta guía pero encontrarás varios ejemplos en el enlace.

Para ver otras formas de adjuntar cada archivo y más opciones te recomendamos ver .

Veamos ahora como enviar correos utilizando la . El primer paso es instalarla con el siguiente comando:

Nota: No publiques tu API Key en repositorios de Git públicos o SendGrid bloqueará tu cuenta para evitar usos indebidos. Utiliza alguna librería como y una variable de entorno para almacenarla.

Para crear una plantilla accede a tu cuenta de e ingresa a la opción Email API -> Dynamic Templates del menú principal. Debes crear una plantilla asignándole un nombre y después crear una primera versión (puedes crear varias versiones de la misma plantilla).

SendGrid
MailGun
Gmail
Nodemailer
SendGrid
SendGrid
Nodemailer
SMTP (Simple Mail Transfer Protocol)
Nodemailer
Nodemailer
SendGrid
nodemailer-sendgrid-transport
dotenv
Handlebars
esta librería
la documentación de Nodemailer
librería oficial de SendGrid
dotenv
SendGrid en la Web