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.