Aller au contenu

smtp: Envoyer des mails avec NGINX

Installation

Si vous n'avez pas configuré l'abonnement au dépôt RPM, inscrivez-vous. Ensuite, vous pouvez procéder avec les étapes suivantes.

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

Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.

Ce document décrit lua-resty-smtp v0.0.3 publié le 6 mars 2015.


Je dois être fou d'essayer d'envoyer des mails avec Nginx.

Objectif

Faire de Nginx un pont entre HTTP et SMTP.

En utilisant lua-resty-smtp dans votre code lua sous Nginx, vous devez simplement émettre une requête HTTP avec votre client HTTP préféré (curl, wget, urllib2 de Python, etc.), afin d'envoyer un mail à votre serveur SMTP.

Fonctionnalités

  • Basé sur le module socket.smtp de LuaSocket 2.0.2, et compatible avec son API également.

  • Connexion SSL prise en charge (lua-nginx-lua >= v0.9.11 nécessaire).

APIs

lua-resty-smtp est compatible avec l'API de socket.smtp de LuaSocket 2.0.2, et vous pouvez consulter SMTP pour une référence détaillée.

Et pour prendre en charge la connexion SSL au serveur SMTP, un paramètre optionnel ssl est ajouté :

  • ssl : doit être une table avec les champs suivants :

    • enable - booléen - pour indiquer s'il faut ou non utiliser une connexion SSL au serveur SMTP, par défaut false ;

    • verify_cert - booléen - pour indiquer s'il faut ou non effectuer une vérification SSL, par défaut false. Lorsqu'il est défini sur true, le certificat du serveur sera vérifié selon le certificat CA spécifié par la directive lua_ssl_trusted_certificate.

Filtres supplémentaires

En plus des filtres de bas niveau fournis par LuaSocket, deux filtres supplémentaires sont fournis :

  • mime.ew : utilisé pour encoder une chaîne non-ASCII au format Encoded-Word (ne prend pas encore en charge le Q-encoding) ;

  • mime.unew : utilisé pour décoder une chaîne au format Encoded-Word (non implémenté) ;

Exemple

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

-- ...
-- Supposons que vos données de mail soient dans la table `args` et les paramètres par défaut 
-- dans la table `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),
}

Performance

Votre serveur SMTP est le goulot d'étranglement. :)

Problèmes connus

  • Ne fonctionne actuellement qu'avec LuaJIT 2.x, car le code repose massivement sur pcall et le module lua-nginx ne fonctionne pas bien avec la VM Lua 5.1 standard dans cette situation. Voir Problèmes connus.

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-smtp.