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
要在 NGINX 中使用此 Lua 库,请确保已安装 nginx-module-lua。
本文档描述了 lua-resty-smtp v0.0.3,该版本于 2015 年 3 月 6 日发布。
我一定是疯了,居然尝试用 Nginx 发送邮件。
目的
使 Nginx 成为 HTTP 和 SMTP 之间的桥梁。
在 Nginx 下使用 lua-resty-smtp 时,您只需通过您的 HTTP 客户端(如 curl、wget、Python 的 urllib2 等)发出 HTTP 请求,即可将邮件发送到您的 SMTP 服务器。
特性
-
基于 LuaSocket 2.0.2 的
socket.smtp模块,并与其 API 兼容 -
支持 SSL 连接(需要 lua-nginx-lua >= v0.9.11)
APIs
lua-resty-smtp 与 LuaSocket 2.0.2 的 socket.smtp 兼容,您可以查看 SMTP 以获取详细参考。
为了支持与 SMTP 服务器的 SSL 连接,添加了可选参数 ssl:
-
ssl:应为具有以下字段的表:-
enable- 布尔值 - 是否使用 SSL 连接到 SMTP 服务器,默认为false; -
verify_cert- 布尔值 - 是否执行 SSL 验证,默认为false。当设置为true时,将根据lua_ssl_trusted_certificate指令指定的 CA 证书验证服务器证书。
-
额外过滤器
除了 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 VM 的兼容性不佳。请参见 已知问题
GitHub
您可以在 nginx-module-smtp 的 GitHub 仓库 中找到此模块的其他配置提示和文档。