跳转至

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 客户端(如 curlwget、Python 的 urllib2 等)发出 HTTP 请求,即可将邮件发送到您的 SMTP 服务器。

特性

  • 基于 LuaSocket 2.0.2socket.smtp 模块,并与其 API 兼容

  • 支持 SSL 连接(需要 lua-nginx-lua >= v0.9.11)

APIs

lua-resty-smtpLuaSocket 2.0.2socket.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 仓库 中找到此模块的其他配置提示和文档。