Pular para conteúdo

smtp: Enviar e-mail com NGINX

Instalação

Se você ainda não configurou a assinatura do repositório RPM, inscreva-se. Em seguida, você pode prosseguir com os seguintes passos.

CentOS/RHEL 7 ou 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 com NGINX, certifique-se de que o nginx-module-lua esteja instalado.

Este documento descreve o lua-resty-smtp v0.0.3 lançado em 06 de março de 2015.


Eu devo estar louco tentando enviar e-mail com Nginx.

Propósito

Fazer do Nginx uma ponte entre HTTP e SMTP.

Usando lua-resty-smtp no seu código Lua sob Nginx, você só precisa emitir uma solicitação HTTP com seu cliente HTTP de sua escolha (curl, wget, urllib2 do Python, etc.), para enviar um e-mail para seu servidor SMTP.

Recursos

  • Baseado no módulo socket.smtp do LuaSocket 2.0.2, e compatível com a API também.

  • Conexão SSL suportada (lua-nginx-lua >= v0.9.11 necessário).

APIs

lua-resty-smtp é compatível com a API de socket.smtp do LuaSocket 2.0.2, e você pode consultar SMTP para referência detalhada.

E para suportar a conexão SSL ao servidor SMTP, o parâmetro opcional ssl foi adicionado:

  • ssl: deve ser uma tabela com os seguintes campos:

    • enable - booleano - se deve ou não usar a conexão SSL com o servidor SMTP, padrão false;

    • verify_cert - booleano - se deve ou não realizar a verificação SSL, padrão false. Quando definido como true, o certificado do servidor será verificado de acordo com o certificado CA especificado pela diretiva lua_ssl_trusted_certificate.

Filtros extras

Além dos filtros de baixo nível fornecidos pelo LuaSocket, mais dois filtros são fornecidos:

  • mime.ew: usado para codificar strings não-ASCII no formato Encoded-Word (não suporta Q-encoding ainda);

  • mime.unew: usado para decodificar strings no formato Encoded-Word (não implementado).

Exemplo

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

-- ...
-- Suponha que seus dados de e-mail estejam na tabela `args` e as configurações padrão 
-- na tabela `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),
}

Desempenho

Seu servidor SMTP é o gargalo. :)

Problemas conhecidos

  • Funciona apenas com LuaJIT 2.x agora, porque a base de código depende massivamente de pcall e o módulo lua-nginx não funciona bem com a VM padrão Lua 5.1 sob essa situação. Veja Problemas Conhecidos.

GitHub

Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório GitHub do nginx-module-smtp.