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.smtpde 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éfautfalse; -
verify_cert- booléen - pour indiquer s'il faut ou non effectuer une vérification SSL, par défautfalse. Lorsqu'il est défini surtrue, le certificat du serveur sera vérifié selon le certificat CA spécifié par la directivelua_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
pcallet 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.