碎碎念
前言: 最近为了更优雅地管理我的飞书企业邮箱,我决定在公网服务器上部署一个轻量级的 Webmail 客户端——SnappyMail。 按照惯例,我首选 Docker 部署。然而在实际操作中,受限于国内特殊的网络环境,镜像拉取变得异常艰难,网络配置也总是莫名其妙地不通。看着终端里无限重试的进度条,我决定放弃 Docker,回归 Linux 原生 PHP 部署。 没想到,原生部署不仅避开了网络黑盒,在配置好 Systemd 服务后,稳定性和速度都直接拉满。本文记录了全过程,特别是对接飞书时的配置细节和那些隐蔽的“坑”。
一、 为什么要放弃 Docker?
在公网服务器上,Docker Hub 的访问日益困难。即便配置了镜像加速,也经常遇到各种网路问题的情况。总之国内镜像总是拉取有问题。
转念一想,SnappyMail 本质上就是一个极其轻量的 PHP 网页程序。既然 Docker 拉不动,何不直接在 Ubuntu 上跑一个 PHP 服务?资源占用更少,且文件系统完全透明,调试起来非常方便。
二、 环境搭建:
1. 安装 PHP 及依赖
我的服务器是 Ubuntu 24.04 (Noble)。在安装依赖时,我按照老教程安装 php-zlib,结果报错 无法定位软件包。
避坑指南:在较新的 Ubuntu/PHP 版本中,基础扩展已经被合并进 php-common。 正确的安装命令:
Bash
sudo apt update
sudo apt install -y php-cli php-fpm php-curl php-mbstring php-xml php-gd php-zip php-common
2. 获取 SnappyMail 源码
我将其部署在 /opt 目录下。直接从官网下载源码包,速度飞快,完全不需要等待 Docker 镜像。
Bash
sudo mkdir -p /opt/snappymail
cd /opt/snappymail
sudo wget https://snappymail.eu/repository/latest.tar.gz
sudo tar -xzf latest.tar.gz
sudo rm latest.tar.gz
3. 权限修正
为了方便管理(不需要 root 权限即可修改配置),我决定以我的个人用户 yanchang 来运行服务。必须将目录权限划归给我自己:
Bash
sudo chown -R yanchang:yanchang /opt/snappymail
三、 核心步骤:对接飞书 (Lark) 域名配置
这是最关键的一步。服务启动后(暂时用 php -S 启动),进入后台 /?admin,在 Domains 页面添加我的域名 yanchang.pw。
由于飞书对安全性要求极高,配置必须严格按照以下标准,否则会报错。
1. IMAP 设置(接收邮件)
在 IMAP 标签页中,配置如下:
服务器 (Server):
imap.feishu.cn端口 (Port):
993加密 (Security):
SSL/TLS🔴 关键避坑点:必须取消勾选
使用短用户名登录 (Use short login)。原因:飞书强制要求使用完整的邮箱地址(如
user@yanchang.cc)作为用户名验证。如果勾选此项,系统只发送user,会导致invalid email address错误。

2. SMTP 设置(发送邮件)
在 SMTP 标签页中,配置如下:
服务器 (Server):
smtp.feishu.cn端口 (Port):
465加密 (Security):
SSL/TLS认证: 勾选
使用认证 (Use authentication)。

3. SSL/TLS 测试
配置完成后,点击底部的“测试”
四、 怀疑人生的“鬼打墙”故障
在部署过程中,我遇到了两个极其隐蔽的问题,排查了很久。
1. 客户端代理导致的“无限转圈”
现象:服务器日志显示 HTTP 200 正常,但浏览器界面一直 Loading,进不去登录页。 原因:我的 MacBook 开启了系统代理(ClashX),且没有正确配置分流。浏览器把对我公网 IP 的请求强制发给了代理节点,导致请求在链路中“迷路”或回环。 解决:关闭本地电脑的代理软件,或者在代理软件中将服务器 IP 加入直连白名单。

五、 终极方案:Systemd 实现公网自启
为了让服务在公网服务器上稳定运行,且开机自动启动,我编写了一个 Systemd 服务文件,并以 yanchang 用户身份运行。
服务文件路径:/etc/systemd/system/snappymail.service
[Unit]
Description=SnappyMail Web Service
After=network.target
[Service]
Type=simple
# 指定以我的个人用户身份运行,方便维护文件
User=yanchang
Group=yanchang
# 指定工作目录
WorkingDirectory=/opt/snappymail
# 启动命令:监听 8888 端口(记得在防火墙放行该端口)
ExecStart=/usr/bin/php -S 0.0.0.0:8888
# 【防坑配置】强制清空代理环境变量
# 防止服务器本身如果开了代理,干扰 PHP 对外连接飞书
Environment="http_proxy="
Environment="https_proxy="
Environment="HTTP_PROXY="
Environment="HTTPS_PROXY="
# 崩溃自动重启,保证公网服务在线率
Restart=always
RestartSec=10s
[Install]
WantedBy=multi-user.target
启用服务:
sudo systemctl daemon-reload
sudo systemctl enable snappymail
sudo systemctl start snappymail
六、 总结
这次折腾让我深刻体会到:适合的才是最好的。 虽然 Docker 是当下的主流,但在国内网络环境和简单的 Web 应用场景下,原生部署依然是解决“镜像拉取困难”的最佳替代方案。
现在,这套运行在公网上的 SnappyMail 已经成为我的主力邮件客户端,速度飞快,配置透明,且完全受控。