Apache Pony Mail 0.11-incubating 安装指南
Apache Pony Mail 0.11-incubating 安装指南:Ubuntu 22.04 部署,JDK8+ES 2.4.6、ES 2.x 客户端、setup.py 初始化、mod_lua 与 lmtpd 验证
Apache Pony Mail 0.11-incubating 安装指南
目标:在真实 Ubuntu 22.04 服务器上从零安装 Apache Pony Mail 0.11-incubating(面向 ES 1.x/2.x 时代的 Web 邮件归档浏览系统),覆盖前置依赖、官方 tar.gz 下载、JDK8 与 Elasticsearch 2.4.6 部署、setup.py 初始化、Apache + mod_lua 前端与 LMTP 归档链路验证。以下命令与回显均在 Ubuntu 22.04.5 真实环境逐步实测。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- Apache httpd:2.4.52(自带
mod_lua.so,Lua 5.3) - Python:3.10.12
- JDK:Temurin 1.8.0_504(ES 2.4.6 仅支持 Java 8)
- Elasticsearch:2.4.6(Lucene 5.5.4,JVM 堆
-Xms256m -Xmx256m) - python-elasticsearch:2.4.0(archiver.py 硬性要求库主版本为 2)
- Apache Pony Mail:0.11-incubating(安装目录
/opt/ponymail) - 监听端口:web 8080(Apache vhost)、ES 9200(仅本机)、LMTP 归档入口 8024
- 运行账号:root(安装与管理)、esuser(ES 进程专用账号,密码 q1w2e3r4)
⚠️ 受限前置说明:Pony Mail 0.11-incubating(2019-03 最后发布,项目已休眠)代码面向 ES 1.7 时代,
tools/install.py写死已失效的旧源(ES 1.7 apt 仓库、openjdk-7、Humbedooh/ponymail 仓库),在现代系统无法直接使用。实测必须锁定 ES 2.x 与配套的 python-elasticsearch 2.x(详见「版本选型说明」),相关步骤均以 ⚠️ 标注。
二、前置条件
- 一台 Ubuntu 22.04 服务器,root 权限。
- 可访问 Apache 镜像站(下载 Pony Mail)、download.elastic.co(下载 ES 2.4.6)与 Adoptium(下载 JDK 8)。
- 需要至少 1GB 空闲磁盘、512MB 以上空闲内存。
- ⚠️ 归档入口需要一套「能把邮件投递给 archiver.py 的机制」:生产环境用 MTA 别名管道(
|/usr/bin/python3 /opt/ponymail/tools/archiver.py)或 Mailman3 插件;本指南实测采用 LMTP 网关手动导入验证(见 4.9)。
三、版本选型说明
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| Apache Pony Mail | 0.11-incubating | 官方仅发布单个 tar.gz(内含 tools/site/configs/docs),无独立二进制 |
| JDK | 8(Temurin 1.8.0_504) | ES 2.4.6 官方要求 Java 8;Java 9+ 不被 ES 2.x 支持 |
| Elasticsearch | 2.4.6(2.x 末版) | Pony Mail README 要求 ES 2.1+;ES 5.x/6.x 可被 setup.py 部分兼容,但 archiver.py 只校验 python 库版本 |
| python-elasticsearch | 2.4.0 | ⚠️ archiver.py 源码校验 ES_MAJOR == 2(库版本主号),装 1.x 库实测报 Exception: ('Unexpected elasticsearch version ', (1, 9, 0));2.x 库才能运行 |
| Lua 模块 | cjson 2.1.0 / socket / sec | mod_lua 基于 Lua 5.3;Ubuntu 22.04 的 lua-cjson 只带 5.1/5.2 需源码编译(见 4.1) |
| Apache httpd | 2.4.x | 需启用 mod_lua;Ubuntu 官方 apache2 已内置 mod_lua.so |
⚠️ 不要使用
tools/install.py(写死 ES 1.7 apt 源与 openjdk-7,均已下线);也不要安装 python-elasticsearch 1.x(archiver.py 拒绝启动)。
四、方案 A:官方 tar.gz 安装(推荐,实测)
4.1 安装基础工具与 Lua 5.3 依赖
apt-get update -qq
DEBIAN_FRONTEND=noninteractive apt-get install -y \
apache2 python3 python3-pip wget curl unzip git net-tools procps \
gcc make liblua5.3-dev lua-socket lua-sec
回显(末行):
Running hooks in /etc/ca-certificates/update.d...
done.
验证版本:
# apache2 -v
Server version: Apache/2.4.52 (Ubuntu)
# python3 --version
Python 3.10.12
Ubuntu 22.04 的 apache2 已内置 mod_lua(/usr/lib/apache2/modules/mod_lua.so),无需单独安装 libapache2-mod-lua(该包在 jammy 源中不存在)。
⚠️ Lua 5.3 版 cjson 需要源码编译:Ubuntu 22.04 的
lua-cjson包只提供 5.1/5.2 的cjson.so,而 mod_lua 基于 Lua 5.3。缺 cjson 时 web API 报module 'cjson' not found(实测)。从官方源码编译补齐:
cd /tmp
wget -q https://github.com/mpx/lua-cjson/archive/refs/tags/2.1.0.tar.gz -O lua-cjson-2.1.0.tar.gz
tar -xzf lua-cjson-2.1.0.tar.gz
cd lua-cjson-2.1.0
make LUA_INCLUDE_DIR=/usr/include/lua5.3
cp cjson.so /usr/lib/x86_64-linux-gnu/lua/5.3/
4.2 下载并解压 Apache Pony Mail
cd /opt
wget -O apache-pony-mail-0.11-incubating.tar.gz \
https://downloads.apache.org/ponymail/ponymail/apache-pony-mail-0.11-incubating.tar.gz
mkdir -p /opt/ponymail
tar -xzf apache-pony-mail-0.11-incubating.tar.gz -C /opt/ponymail
回显:
-rw-r--r-- 1 root root 1055853 Mar 25 2019 apache-pony-mail-0.11-incubating.tar.gz
包名 / 大小 / 路径:
- 包名:
apache-pony-mail-0.11-incubating.tar.gz(1,055,853 字节,约 1.0MB) - 解压目录:
/opt/ponymail(含tools/、site/、configs/、docs/)
💡 该 tar 包直接解压在当前目录(无顶层目录名),务必先
mkdir -p /opt/ponymail再解压。
4.3 安装 JDK 8 与 Elasticsearch 2.4.6
mkdir -p /opt/jdk8
wget -O jdk8.tar.gz 'https://api.adoptium.net/v3/binary/latest/8/ga/linux/x64/jdk/hotspot/normal/eclipse'
tar -xzf jdk8.tar.gz -C /opt/jdk8 --strip-components=1
/opt/jdk8/bin/java -version
回显:
-rw-r--r-- 1 root root 103542511 Aug 25 08:14 jdk8.tar.gz
openjdk version "1.8.0_504"
OpenJDK Runtime Environment (Temurin)(build 1.8.0_504-b01)
OpenJDK 64-Bit Server VM (build 25.504-b01, mixed mode)
下载并解压 ES 2.4.6:
cd /opt
wget -O elasticsearch-2.4.6.tar.gz \
https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.4.6/elasticsearch-2.4.6.tar.gz
tar -xzf elasticsearch-2.4.6.tar.gz
mv elasticsearch-2.4.6 /opt/elasticsearch
回显:
-rw-r--r-- 1 root root 27350245 May 16 2018 elasticsearch-2.4.6.tar.gz
创建 ES 专用账号并授权(ES 2.4.6 拒绝以 root 运行):
useradd -m -s /bin/bash esuser
echo 'esuser:q1w2e3r4' | chpasswd
chown -R esuser:esuser /opt/elasticsearch
⚠️ 前置说明:ES 2.4.6 的官方下载仅存于
download.elastic.co(实测 200),artifacts.elastic.co已不保留 2.4.6(404)。若内网无法访问该地址,需提前准备好 ES 2.4.x tar 包离线分发。
4.4 配置并启动 Elasticsearch(systemd 托管 + JVM 堆)
编辑 /opt/elasticsearch/config/elasticsearch.yml,启用以下键:
cluster.name: ponymail
node.name: ponymail-node-1
network.host: 127.0.0.1
http.port: 9200
创建 systemd 单元 /etc/systemd/system/elasticsearch.service:
[Unit]
Description=Elasticsearch 2.4.6 for Pony Mail
After=network.target
[Service]
Type=simple
User=esuser
Group=esuser
Environment=JAVA_HOME=/opt/jdk8
Environment=ES_HEAP_SIZE=256m
ExecStart=/opt/elasticsearch/bin/elasticsearch
Restart=on-failure
[Install]
WantedBy=multi-user.target
⚠️ JVM 堆说明:ES 2.4.6 通过
ES_HEAP_SIZE环境变量同时设定-Xms/-Xmx。本环境设为 256m(即-Xms256m -Xmx256m,落在 256-512MB 规范区间);如需 512m 上限可改为ES_HEAP_SIZE=512m。ES 进程不能以 root 运行,故用User=esuser。
启动并核对:
systemctl daemon-reload
systemctl enable elasticsearch
systemctl start elasticsearch
sleep 25
systemctl is-active elasticsearch
回显:
Created symlink /etc/systemd/system/multi-user.target.wants/elasticsearch.service → /etc/systemd/system/elasticsearch.service.
active
核对监听与 JVM 堆生效值:
curl -s http://127.0.0.1:9200/
ps -ef | grep [e]lasticsearch
回显:
{
"name" : "ponymail-node-1",
"cluster_name" : "ponymail",
"cluster_uuid" : "5W3kGgt-SvWLNuGYTZfWfQ",
"version" : {
"number" : "2.4.6",
"build_hash" : "5376dca9f70f3abef96a77f4bb22720ace8240fd",
"lucene_version" : "5.5.4"
},
"tagline" : "You Know, for Search"
}
ps -ef | grep [e]lasticsearch 中应看到 Java 进程命令行含 -Xms256m -Xmx256m(实测生效值)。
集群健康:
curl -s 'http://127.0.0.1:9200/_cluster/health?pretty' | head -12
回显:
{
"cluster_name" : "ponymail",
"status" : "green",
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 1,
"active_shards" : 1,
"relocating_shards" : 0,
"unassigned_shards" : 0
}
4.5 安装 Python 依赖(elasticsearch 2.x 库)
pip3 install 'elasticsearch==2.4.0' formatflowed netaddr certifi chardet
验证库版本:
python3 -c 'import elasticsearch; print("ES lib version:", elasticsearch.VERSION)'
回显:
ES lib version: (2, 4, 0)
⚠️ 必须锁 2.x 库:archiver.py 源码校验
ES_MAJOR == 2(库版本主号)。实测安装 1.x 库(1.9.0)后归档直接报Exception: ('Unexpected elasticsearch version ', (1, 9, 0));换 2.4.0 后正常。
4.6 运行 setup.py 初始化(建索引 + 写配置)
cd /opt/ponymail/tools
python3 setup.py --defaults
回显:
Welcome to the Pony Mail setup script!
Let's start by determining some settings...
Okay, I got all I need, setting up Pony Mail...
Versions: library 2 (2.4.0), engine 2 (2.4.6)
Creating index ponymail
Index created! {'acknowledged': True}
Writing importer config (ponymail.cfg)
mod_lua configuration (config.lua)
Copying sample JS config to config.js (if needed)...
All done, Pony Mail should...work now :)
--defaults 生成的默认值:ES 地址 localhost:9200、索引名 ponymail、分片 1 / 副本 0、mailserver localhost、可回复域 example.org、wordcloud 开、文档 ID 生成器 cluster。
生成产物:
/opt/ponymail/tools/ponymail.cfg(归档器/导入器配置,参数见本文档「七、配置说明」)/opt/ponymail/site/api/lib/config.lua(mod_lua 后端配置)/opt/ponymail/site/js/config.js(前端配置,由config.js.sample复制)
4.7 配置 Apache + mod_lua 并启动 web
a2enmod lua
回显:
Module lua already enabled
💡 首次执行会显示
Enabling module lua.;Ubuntu 22.04 的 apache2 已内置 mod_lua.so,可直接启用。
创建 vhost /etc/apache2/sites-available/ponymail.conf:
Listen 8080
<VirtualHost *:8080>
ServerName ponymail.localhost
DocumentRoot /opt/ponymail/site
LuaPackageCPath /usr/lib/x86_64-linux-gnu/lua/5.3/?.so
LuaPackagePath /usr/share/lua/5.3/?.lua
AddHandler lua-script .lua
LuaScope thread
LuaCodeCache stat
AcceptPathInfo On
AddOutputFilterByType DEFLATE application/json
<Directory /opt/ponymail/site>
Require all granted
</Directory>
</VirtualHost>
⚠️ DocumentRoot 位于
/var/www之外时,Apache 2.4 必须显式加<Directory ...>Require all granted</Directory>,否则首页与 API 全部 403 Forbidden(实测排障见「常见问题 Q2」)。
启用并启动:
a2ensite ponymail
systemctl restart apache2
systemctl is-active apache2
回显:
Enabling site ponymail.
active
4.8 验证 web 服务
curl -s -o /dev/null -w 'HTTP %{http_code} %{size_download}B\n' http://127.0.0.1:8080/
curl -s http://127.0.0.1:8080/api/pminfo.lua
curl -s -o /dev/null -w 'list.html HTTP %{http_code}\n' http://127.0.0.1:8080/list.html
回显:
HTTP 200 4752B
{"no_active_lists":0,"no_threads":0,"activity":{},"participants":0,"hits":0}
list.html HTTP 200
首页(/)、页面(list.html / search.html)与 Lua API(pminfo.lua 返回 JSON)均正常,说明 mod_lua 与 Lua 5.3 依赖链完好。
4.9 配置归档链路并验证邮件入库(lmtpd 手动导入)
Pony Mail 的归档入口是 tools/archiver.py,从 STDIN 读取一封原始邮件、按 List-ID 归类写入 ES。生产环境通常由 MTA 别名管道调用(如 /etc/aliases 中 foo-public: "|/usr/bin/python3 /opt/ponymail/tools/archiver.py")。本指南用极简 LMTP 网关(lmtpd)做手动导入验证:监听 8024,把每条 LMTP 邮件喂给 archiver.py。
创建 /opt/ponymail-lmtpd.py:
#!/usr/bin/env python3
# Minimal LMTP daemon for Apache Pony Mail archiver verification
import socketserver, subprocess, sys
ARCHIVER = "/opt/ponymail/tools/archiver.py"
HOST, PORT = "127.0.0.1", 8024
class LmtpHandler(socketserver.StreamRequestHandler):
def handle(self):
self.wfile.write(b"220 localhost Pony Mail LMTP ready\r\n"); self.wfile.flush()
in_data, msg = False, b""
for line in self.rfile:
if not in_data:
cmd = line.strip().decode("utf-8", "ignore")
if cmd.upper().startswith("LHLO"):
self.wfile.write(b"250-localhost\r\n250 8BITMIME\r\n")
elif cmd.upper().startswith("MAIL FROM"):
self.wfile.write(b"250 2.1.0 OK\r\n")
elif cmd.upper().startswith("RCPT TO"):
self.wfile.write(b"250 2.1.5 OK\r\n")
elif cmd.upper().startswith("DATA"):
self.wfile.write(b"354 End data with <CR><LF>.<CR><LF>\r\n"); in_data = True
elif cmd.upper().startswith("QUIT"):
self.wfile.write(b"221 2.0.0 bye\r\n"); self.wfile.flush(); return
else:
self.wfile.write(b"250 OK\r\n")
self.wfile.flush()
else:
if line in (b".\r\n", b".\n"):
in_data = False
rc = subprocess.run([sys.executable, ARCHIVER], input=msg,
capture_output=True, cwd="/opt/ponymail/tools")
out = (rc.stdout or b"").decode("utf-8", "ignore").strip()
print("[lmtpd] rc=%d %s" % (rc.returncode, out), flush=True)
if rc.returncode == 0:
self.wfile.write(b"250 2.0.0 OK archived\r\n")
else:
self.wfile.write(b"550 5.0.0 archiving failed\r\n")
self.wfile.flush(); msg = b""
else:
msg += line
if __name__ == "__main__":
print("[lmtpd] Pony Mail LMTP daemon listening on %s:%d" % (HOST, PORT), flush=True)
with socketserver.ThreadingMixIn(socketserver.TCPServer((HOST, PORT), LmtpHandler)) as srv:
srv.serve_forever()
创建 systemd 单元 /etc/systemd/system/ponymail-lmtpd.service:
[Unit]
Description=Pony Mail LMTP archiver gateway
After=network.target elasticsearch.service
[Service]
Type=simple
ExecStart=/usr/bin/python3 /opt/ponymail-lmtpd.py
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动并确认监听:
systemctl daemon-reload
systemctl enable ponymail-lmtpd
systemctl start ponymail-lmtpd
systemctl is-active ponymail-lmtpd
netstat -tlnp | grep 8024
回显:
Created symlink /etc/systemd/system/multi-user.target.wants/ponymail-lmtpd.service → /etc/systemd/system/ponymail-lmtpd.service.
active
tcp 0 0 127.0.0.1:8024 0.0.0.0:* LISTEN 6002/python3
手动导入一封测试邮件(python3 smtplib 的 LMTP 通道,含 List-ID: <ponymail-test.example.org>):
python3 - <<'PYEOF'
import smtplib
from email.message import EmailMessage
msg = EmailMessage()
msg["From"] = "alice@example.org"
msg["To"] = "ponymail-test@example.org"
msg["Subject"] = "Pony Mail LMTP test"
msg["Message-ID"] = "<lmtp-test-001@example.org>"
msg["List-ID"] = "<ponymail-test.example.org>"
msg.set_content("Hello from the LMTP import verification!")
lmtp = smtplib.LMTP("127.0.0.1", 8024)
lmtp.send_message(msg, "alice@example.org", ["ponymail-test@example.org"])
lmtp.quit()
print("LMTP send OK")
PYEOF
回显:
LMTP send OK
查看归档结果与 ES 落库:
journalctl -u ponymail-lmtpd --no-pager -n 3 | tail -3
curl -s 'http://127.0.0.1:9200/ponymail/mbox/_count'
回显:
Oct 12 21:33:16 ... systemd[1]: Started Pony Mail LMTP archiver gateway.
Oct 12 21:33:16 ... python3[6002]: [lmtpd] Pony Mail LMTP daemon listening on 127.0.0.1:8024
Oct 12 21:33:23 ... python3[6002]: [lmtpd] rc=0 Mon, 12 Oct 2026 21:33:23 -0000: Done archiving to <ponymail-test.example.org> as re040e3adc798ee1db640fe1c080917dffb7995d7f75f54b7577fe1bb@<ponymail-test.example.org>!
{"count":2,"_shards":{"total":1,"successful":1,"failed":0}}
💡
count=2表示两份唯一邮件(LMTP 首封 + mbox 导入一封,见 CLI 篇);同一 Message-ID 重复投递会被cluster生成器 digest 去重,count 不再增加。
通过 web API 反向验证邮件已可检索:
curl -s 'http://127.0.0.1:8080/api/email.lua?id=re040e3adc798ee1db640fe1c080917dffb7995d7f75f54b7577fe1bb%40%3Cponymail-test.example.org%3E' | head -c 400
回显:
{"tid":"re040e3adc798ee1db640fe1c080917dffb7995d7f75f54b7577fe1bb@<ponymail-test.example.org>","references":"","private":false,"message-id":"<lmtp-test-001@example.org>",...,"subject":"Pony Mail LMTP test","body":"Hello from the LMTP import verification!...","attachments":{}}
至此「邮件进(LMTP)→ archiver.py 解析 → ES 索引 → web 查询」全链路打通。
五、方案 B:GitHub 源码 clone 安装(备用)
Pony Mail 源码托管于 GitHub(apache/incubator-ponymail,与 0.11 tar 包同构):
cd /opt
git clone --depth 1 https://github.com/apache/incubator-ponymail.git /opt/ponymail
⚠️ 前置说明:该仓库已归档(只读),且 git 智能 HTTP 在部分受限网络下会失败(本实验网段实测报
GnuTLS recv error (-54): Error in the pull function)。GitHub 不可达时直接走方案 A 的官方 tar.gz(内容一致)。clone 成功后,其余步骤(4.3 起的 JDK8/ES/setup.py/Apache/lmtpd)与方案 A 完全相同。
六、方案对比与选择建议
| 维度 | 方案 A:官方 tar.gz | 方案 B:GitHub clone |
|---|---|---|
| 版本 | 0.11-incubating(固定) | master(与 0.11 同构,已归档) |
| 是否需联网 | 需 Apache 镜像站 | 需 GitHub(受限网络可能失败) |
| 安装方式 | wget + tar 解压 | git clone |
| 校验 | 官方 release 校验 | 无(源码即版本) |
| 建议 | 内网/生产首选 | 开发调试备用 |
七、配置说明
- ES 配置:
/opt/elasticsearch/config/elasticsearch.yml(集群/节点/监听)与 systemd 单元中的ES_HEAP_SIZE(JVM 堆 256MB)。 - 归档器/导入器配置:
/opt/ponymail/tools/ponymail.cfg(ES 地址、索引名、生成器)。 - mod_lua 后端配置:
/opt/ponymail/site/api/lib/config.lua(es_url、mailserver、accepted_domains 等)。 - 前端配置:
/opt/ponymail/site/js/config.js(OAuth、调试开关等)。 - Apache vhost:
/etc/apache2/sites-available/ponymail.conf(监听 8080、Lua 路径、DocumentRoot)。
各参数的逐项说明见本文档「七、配置说明」。
八、注意事项
- ⚠️ 版本锁定:ES 引擎必须 2.x、python-elasticsearch 库必须 2.x(archiver 校验
ES_MAJOR==2),两者不匹配即无法归档。 - ⚠️ ES 2.4.6 拒绝 root 运行,必须用独立账号(esuser)与 systemd
User=托管。 - ⚠️ mod_lua 基于 Lua 5.3:Ubuntu 22.04 需源码编译 cjson,并在 vhost 中声明
LuaPackageCPath/LuaPackagePath。 tools/install.py已失效(写死 ES 1.7 apt 源、openjdk-7、旧 GitHub 仓库),请勿使用。- 归档邮件必须携带
List-ID头,否则 archiver.py 输出Nothing to import (no list-id found!)且不落库。 - web 前端默认无内置账号体系(登录走 OAuth),私有列表访问需自建 AAA 脚本(
site/api/lib/aaa.lua示例)。
九、常见问题
9.1 归档报 Exception: ('Unexpected elasticsearch version ', (1, 9, 0))
原因:安装了 python-elasticsearch 1.x 库;archiver.py 只接受库主版本为 2(ES_MAJOR == 2)。
解决:pip3 install 'elasticsearch==2.4.0'(实测)。
9.2 web 首页/API 全部 403 Forbidden
原因:DocumentRoot 在 /var/www 之外,Apache 2.4 默认拒绝目录访问(实测回显 AH01630: client denied by server configuration)。
解决:vhost 中为 /opt/ponymail/site 增加 <Directory>Require all granted</Directory>。
9.3 API 返回 500,日志报 module 'cjson' not found
原因:mod_lua 基于 Lua 5.3,Ubuntu 22.04 的 lua-cjson 包只带 5.1/5.2 模块。
解决:按 4.1 从源码编译 cjson.so 到 /usr/lib/x86_64-linux-gnu/lua/5.3/,并确保 vhost 声明 LuaPackageCPath。
9.4 ES 启动失败或拒绝运行
原因:以 root 启动被拒;或未设 JAVA_HOME。
解决:用 esuser + systemd User=/Environment=JAVA_HOME=/opt/jdk8 启动;systemctl status elasticsearch 查看具体报错。
9.5 archiver 输出 Nothing to import (no list-id found!)
原因:邮件无 List-ID 头,或使用了 --altheader 指定替代头但该头不存在。
解决:邮件模板补 List-ID: <list.name.example.org>,或按实际投递头用 --altheader delivered-to。
9.6 GitHub clone 报 GnuTLS recv error (-54)
原因:受限网络下 git 智能 HTTP 被阻断(实测)。 解决:改用方案 A 官方 tar.gz(内容一致),或为 git 配置可用代理。
十、卸载方式
systemctl stop ponymail-lmtpd
systemctl stop elasticsearch
systemctl disable ponymail-lmtpd
systemctl disable elasticsearch
rm -f /etc/systemd/system/ponymail-lmtpd.service /etc/systemd/system/elasticsearch.service
rm -f /etc/apache2/sites-enabled/ponymail.conf /etc/apache2/sites-available/ponymail.conf
systemctl daemon-reload
rm -rf /opt/ponymail /opt/ponymail-lmtpd.py /opt/elasticsearch /opt/jdk8
userdel esuser
apt-get remove -y apache2 lua-socket lua-sec gcc make liblua5.3-dev # 可选
十一、参考链接
- Apache Pony Mail 下载页:https://downloads.apache.org/ponymail/
- Apache Pony Mail GitHub:https://github.com/apache/incubator-ponymail
- Elasticsearch 2.4.6 下载:https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.4.6/
- Adoptium Temurin 8 下载:https://adoptium.net/temurin/releases/?version=8
- lua-cjson 源码:https://github.com/mpx/lua-cjson