|
|
1 mesiac pred | |
|---|---|---|
| certs | 1 mesiac pred | |
| docker | 1 mesiac pred | |
| public | 1 mesiac pred | |
| scripts | 1 mesiac pred | |
| src | 1 mesiac pred | |
| test | 1 mesiac pred | |
| .dockerignore | 1 mesiac pred | |
| .env.example | 1 mesiac pred | |
| .gitignore | 1 mesiac pred | |
| Dockerfile | 1 mesiac pred | |
| README.md | 1 mesiac pred | |
| docker-compose.yml | 1 mesiac pred | |
| index.html | 1 mesiac pred | |
| login.html | 1 mesiac pred | |
| package-lock.json | 1 mesiac pred | |
| package.json | 1 mesiac pred | |
| tsconfig.json | 1 mesiac pred | |
| vite.config.ts | 1 mesiac pred |
MailHub 是一个 Docker 化的多用户发信域名管理面板、SMTP Submission 服务和发送 API。它负责:
cd /www/wwwroot/mail.ss5.xyz
docker compose up -d --build
docker compose ps
docker compose logs -f app postfix
管理面板默认监听宿主机 127.0.0.1:3025,nginx 可反代到公网域名。
生产发布采用 Git 拉取式部署,避免直接覆盖远端目录:
npm run release:check
git status --short
git add <changed-files>
git commit -m "feat: ..."
git push origin master
npm run deploy:remote
npm run deploy:remote 会在远端 /www/wwwroot/mail.ss5.xyz 执行:
git fetch origin master
git checkout master
git pull --ff-only origin master
docker compose up -d --build
docker compose ps
脚本默认目标是 root@192.227.215.183:/www/wwwroot/mail.ss5.xyz。如需覆盖,可设置:
MAILHUB_DEPLOY_REMOTE=root@example.com \
MAILHUB_DEPLOY_DIR=/www/wwwroot/mail.ss5.xyz \
MAILHUB_DEPLOY_BRANCH=master \
MAILHUB_DEPLOY_GIT_URL=git@git.ss5.xyz:chendeben/MailSend.git \
npm run deploy:remote
首次使用前,远端服务器必须具备 Git 仓库读取权限,例如给 git@git.ss5.xyz:chendeben/MailSend.git 配置 deploy key。远端如果还没有 origin,脚本会使用 MAILHUB_DEPLOY_GIT_URL 或本地 origin 自动补齐。
远端如果存在未提交变更或无法快进,git pull --ff-only 会失败;此时应先人工确认远端状态。确认可以收纳远端工作区时再显式加:
MAILHUB_DEPLOY_STASH_REMOTE=1 npm run deploy:remote
该开关只会 git stash push -u 远端工作区,不会覆盖 .env、data/、certs/ 等 ignored 生产数据。
.env 中的 ADMIN_USER、ADMIN_EMAIL、ADMIN_PASSWORD 创建或修复一个 admin 用户。/register 开放注册。MailHub 提供公网 SMTP Submission。所有发信端口都需要 SMTP AUTH,未认证不会转发邮件,避免开放中继。
连接信息:
Host: 由 SUBMISSION_HOST 配置,例如 in.example.com
Port 25: SMTP + STARTTLS + AUTH
Port 587: SMTP Submission + STARTTLS + AUTH
Port 465: SMTPS implicit TLS + AUTH
Port 2525: SMTP + STARTTLS + AUTH
Username: 用户在网页“SMTP 凭据”中配置,可复制
Password: 用户在网页“SMTP 凭据”中配置,可复制
SMTP 密码会同时保存哈希和服务端加密密文:哈希用于认证,加密密文用于用户本人在网页复制。旧数据如果只有哈希,无法反解,需要用户重新设置一次密码后才能复制。
.env 中的 SUBMISSION_USERNAME 和 SUBMISSION_PASSWORD 只用于首次给 admin 初始化 SMTP 凭据。初始化后以每个用户在面板保存的 SMTP 凭据为准,修改后无需重启。
用户可在网页“DNS API”中保存以下服务商凭据:
域名绑定 DNS 凭据后,点击“一键配置 DNS”会写入或更新:
_mailhub.<domain> TXT 验证记录。<selector>._domainkey.<domain> DKIM TXT。v=spf1。_dmarc.<domain> DMARC TXT。PTR 反向解析只检测和提示,通常必须在云服务器或 IP 服务商控制台配置。
admin 可在面板中修改以下业务设置:
APP_BASE_URLMAIL_HOSTNAMESENDING_IPDEFAULT_SPF_MECHANISMSDMARC_POLICYDMARC_RUASEND_REQUIRES_VERIFIED基础设施设置仍通过 .env 配置并需要重启,例如监听端口、数据目录、SMTP 中继、TLS 证书路径和 SESSION_SECRET。
每个用户在面板生成自己的发送 API Token。Token 只在创建时完整显示并自动复制,之后列表只显示前缀。
curl -X POST http://mail-send.example.com/api/send \
-H "Authorization: Bearer <USER_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"from": "noreply@example.com",
"to": "user@example.com",
"subject": "Hello from MailHub",
"text": "Signed with DKIM and queued by MailHub."
}'
发送时会校验 From 所属域名必须归当前 Token 所属用户所有。.env 中的 API_TOKEN 仅作为旧版 admin 兼容发送 token,新用户应使用网页生成的用户级 Token。
npm test
测试覆盖:
SESSION_SECRET。.env、SQLite 数据库、证书私钥或 DNS/API 密钥。25/465/587/2525 已在云防火墙和系统防火墙放行。MAIL_HOSTNAME。MAIL_HOSTNAME 的 A 记录指回发信 IP。