Перейти к содержанию

smtp: Отправка почты с помощью NGINX

Установка

Если вы еще не настроили подписку на репозиторий RPM, зарегистрируйтесь. Затем вы можете продолжить с следующими шагами.

CentOS/RHEL 7 или 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

Чтобы использовать эту библиотеку Lua с NGINX, убедитесь, что установлен nginx-module-lua.

Этот документ описывает lua-resty-smtp v0.0.3, выпущенную 6 марта 2015 года.


Я, должно быть, схожу с ума, пытаясь отправить почту с помощью Nginx.

Цель

Сделать Nginx мостом между HTTP и SMTP.

Используя lua-resty-smtp в вашем Lua-коде под Nginx, вам просто нужно выполнить HTTP-запрос с помощью вашего удобного HTTP-клиента (curl, wget, urllib2 из Python и т.д.), чтобы отправить почту на ваш SMTP-сервер.

Особенности

  • Основан на модуле socket.smtp из LuaScoket 2.0.2 и совместим с его API.

  • Поддерживается SSL-соединение (требуется lua-nginx-lua >= v0.9.11).

API

lua-resty-smtp совместим с API socket.smtp из LuaSocket 2.0.2, и вы можете проверить SMTP для подробной справки.

Чтобы поддерживать SSL-соединение с SMTP-сервером, добавлен необязательный параметр ssl:

  • ssl: должен быть таблицей со следующими полями:

    • enable - булевый - использовать ли SSL-соединение с SMTP-сервером, по умолчанию false;

    • verify_cert - булевый - выполнять ли проверку SSL, по умолчанию false. Если установлено в true, сертификат сервера будет проверен в соответствии с CA-сертификатом, указанным в директиве lua_ssl_trusted_certificate.

Дополнительные фильтры

В дополнение к низкоуровневым фильтрам, предоставляемым LuaSocket, предлагаются еще два фильтра:

  • mime.ew: используется для кодирования не-ASCII строки в формат Encoded-Word (пока не поддерживает Q-encoding);

  • mime.unew: используется для декодирования строки в формате Encoded-Word (не реализовано).

Пример

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

-- ...
-- Предположим, ваши данные почты в таблице `args` и настройки по умолчанию
-- в таблице `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),
}

Производительность

Ваш SMTP-сервер является узким местом. :)

Известные проблемы

  • Работает только с LuaJIT 2.x в настоящее время, потому что кодовая база сильно полагается на pcall, и lua-nginx-module не работает хорошо со стандартной виртуальной машиной Lua 5.1 в этой ситуации. См. Известные проблемы.

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-smtp.