Zum Inhalt

smtp: E-Mail mit NGINX senden

Installation

Wenn Sie noch kein RPM-Repository-Abonnement eingerichtet haben, melden Sie sich an. Dann können Sie mit den folgenden Schritten fortfahren.

CentOS/RHEL 7 oder 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

Um diese Lua-Bibliothek mit NGINX zu verwenden, stellen Sie sicher, dass nginx-module-lua installiert ist.

Dieses Dokument beschreibt lua-resty-smtp v0.0.3, veröffentlicht am 06. März 2015.


Ich muss verrückt sein, zu versuchen, E-Mails mit Nginx zu senden.

Zweck

Nginx als Brücke zwischen HTTP und SMTP zu machen.

Wenn Sie lua-resty-smtp in Ihrem Lua-Code unter Nginx verwenden, müssen Sie lediglich eine HTTP-Anfrage mit Ihrem praktischen HTTP-Client (curl, wget, urllib2 aus Python usw.) ausführen, um eine E-Mail an Ihren SMTP-Server zu senden.

Funktionen

  • Basierend auf dem Modul socket.smtp von LuaSocket 2.0.2 und API-kompatibel damit.

  • SSL-Verbindung wird unterstützt (lua-nginx-lua >= v0.9.11 benötigt).

APIs

lua-resty-smtp ist API-kompatibel mit socket.smtp von LuaSocket 2.0.2, und Sie können SMTP für detaillierte Referenzen dazu überprüfen.

Um die SSL-Verbindung zum SMTP-Server zu unterstützen, wurde der optionale Parameter ssl hinzugefügt:

  • ssl: sollte eine Tabelle mit folgenden Feldern sein:

    • enable - boolean - ob eine SSL-Verbindung zum SMTP-Server verwendet werden soll, Standard false;

    • verify_cert - boolean - ob eine SSL-Verifizierung durchgeführt werden soll, Standard false. Wenn auf true gesetzt, wird das Serverzertifikat gemäß dem CA-Zertifikat verifiziert, das durch die lua_ssl_trusted_certificate Direktive angegeben ist.

Zusätzliche Filter

Neben den Low-Level-Filtern, die von LuaSocket bereitgestellt werden, werden zwei weitere Filter bereitgestellt:

  • mime.ew: wird verwendet, um nicht-ASCII-Zeichenfolgen in das Encoded-Word Format zu kodieren (unterstützt noch kein Q-encoding);

  • mime.unew: wird verwendet, um Zeichenfolgen im Encoded-Word-Format zu dekodieren (nicht implementiert).

Beispiel

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

-- ...
-- Angenommen, Ihre E-Mail-Daten befinden sich in der Tabelle `args` und die Standardeinstellungen 
-- in der Tabelle `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),
}

Leistung

Ihr SMTP-Server ist der Engpass. :)

Bekannte Probleme

  • Funktioniert derzeit nur mit LuaJIT 2.x, da der Code stark auf pcall angewiesen ist und das lua-nginx-module in dieser Situation nicht gut mit der Standard-Lua 5.1 VM funktioniert. Siehe Bekannte Probleme.

GitHub

Sie finden zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-smtp.