Saltar a contenido

smtp: Enviar correo con NGINX

Instalación

Si no has configurado la suscripción al repositorio RPM, regístrate. Luego puedes proceder con los siguientes pasos.

CentOS/RHEL 7 o Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-smtp

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-smtp

Para usar esta biblioteca Lua con NGINX, asegúrate de que nginx-module-lua esté instalado.

Este documento describe lua-resty-smtp v0.0.3 lanzado el 06 de marzo de 2015.


Debo estar loco intentando enviar correo con Nginx.

Propósito

Hacer de Nginx un puente entre HTTP y SMTP.

Usando lua-resty-smtp en tu código lua bajo Nginx, solo necesitas emitir una solicitud HTTP con tu cliente HTTP preferido (curl, wget, urllib2 de Python, etc.) para enviar un correo a tu servidor SMTP.

Características

  • Basado en el módulo socket.smtp de LuaSocket 2.0.2, y también compatible con su API.

  • Conexión SSL soportada (se necesita lua-nginx-lua >= v0.9.11).

APIs

lua-resty-smtp es compatible con la API de socket.smtp de LuaSocket 2.0.2, y puedes consultar SMTP para una referencia detallada.

Y para soportar la conexión SSL al servidor SMTP, se ha añadido el parámetro opcional ssl:

  • ssl: debe ser una tabla con los siguientes campos:

    • enable - booleano - si se debe usar o no la conexión SSL al servidor SMTP, por defecto false;

    • verify_cert - booleano - si se debe realizar o no la verificación SSL, por defecto false. Cuando se establece en true, el certificado del servidor será verificado de acuerdo con el certificado CA especificado por la directiva lua_ssl_trusted_certificate.

Filtros adicionales

Además de los filtros de bajo nivel proporcionados por LuaSocket, se proporcionan dos filtros más:

  • mime.ew: utilizado para codificar cadenas no ASCII en el formato Encoded-Word (no soporta Q-encoding aún);

  • mime.unew: utilizado para decodificar cadenas en formato Encoded-Word (no implementado);

Ejemplo

local config = require("config")
local smtp = require("resty.smtp")
local mime = require("resty.smtp.mime")
local ltn12 = require("resty.smtp.ltn12")

-- ...
-- Supongamos que tus datos de correo están en la tabla `args` y la configuración predeterminada 
-- en la tabla `config.mail`
-- ...

local mesgt = { 
    headers= {
        subject= mime.ew(args.subject or config.mail.SUBJECT, nil, 
                         { charset= "utf-8" }), 
        ["content-transfer-encoding"]= "BASE64",
        ["content-type"]= "text/plain; charset='utf-8'",
    },

    body= mime.b64(args.body)
}

local ret, err = smtp.send {
    from= args.from or config.mail.FROM,
    rcpt= rcpts,
    user= args.user or config.mail.USER,
    password= args.password or config.mail.PASSWORD,
    server= args.server or config.mail.SERVER,
    domain= args.domain or config.mail.DOMAIN,
    source= smtp.message(mesgt),
}

Rendimiento

Tu servidor SMTP es el cuello de botella. :)

Problemas conocidos

  • Solo funciona con LuaJIT 2.x ahora, porque la base de código depende masivamente de pcall y el módulo lua-nginx no funciona bien con la VM estándar de Lua 5.1 en esta situación. Consulta Problemas conocidos.

GitHub

Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-smtp.