最近在阿里云服务器上部署了最新的 Ghost 5.x (Docker版),在首次登录后台时遇到一个死循环:Ghost 强制要求进行“新设备登录验证”,但我根本收不到邮件。
经过一番折腾,发现这是由于 Ghost 新版本的安全机制变更、云厂商端口封禁以及旧配置失效共同导致的。本文将介绍如何使用 Ethereal(一个开发者专用的虚拟邮件服务)来完美解决这个问题。
问题现象
- 换新设备,访问
/ghost后台。 - 输入账号密码,点击登录。
- 问题来了:登录按钮变成了一个旋转的圆圈,一直转个不停。
- 打开浏览器开发者工具 (F12 -> Network),发现 session 接口的状态一直是 Pending (挂起) 直到超时,或者报 Failed。
原因分析
为什么会陷入这个死局?主要有三个原因凑在了一起:
- Ghost 5.x 的强制安全机制:
出于安全考虑,Ghost 官方在 v5 版本中彻底移除了“禁用新设备校验”的开关。只要 IP 变动或首次登录,必须验证邮件。 - 旧的“日志模式”已废弃:
以前我们可以把邮件配置改成json或stream模式,让验证码打印在服务器日志里。但最新的 Ghost (v5.x) 已经不再支持这些参数,配置了会导致服务直接崩溃 (Error: Unknown mail transport)。 - 云服务器封禁 25 端口:
阿里云、AWS 等主流云厂商默认封禁 25 端口。如果没有配置第三方 SMTP(如 Mailgun),Ghost 尝试直连发信会被防火墙拦截,导致请求超时。
解决方案:使用 Ethereal "伪造" 邮件服务
既然我们暂时没有配置正式的邮件服务(如 Mailgun),又必须让 Ghost 觉得邮件“发成功”了,Ethereal.email 是最佳救星。
它是一个免费的伪造 SMTP 服务,Ghost 发给它的邮件会被拦截在 Ethereal 的网页上,而不会真的发到你邮箱。我们直接在网页上查看验证码即可。
第一步:获取 Ethereal 账号
- 打开 https://ethereal.email/。
- 点击首页的 "Create Ethereal Account"。
- 页面会生成一组临时的 SMTP 账号信息,记下以下内容:
- Host:
smtp.ethereal.email - Port:
587 - Username: (例如
maddison53@ethereal.email) - Password: (一串字符)
- Host:
第二步:修改 Ghost 配置 (Docker Compose)
修改你的 docker-compose.yml,在 environment 中填入刚才获取的账号。
version: '3.1'
services:
ghost:
image: ghost:5-alpine
restart: always
ports:
- 8089:2368
volumes:
- ./content:/var/lib/ghost/content
environment:
# 基础配置
url: https://你的域名.com
database__client: mysql
# ... 数据库配置略 ...
# 【核心修改】配置 Ethereal 邮件服务
mail__transport: SMTP
mail__options__host: smtp.ethereal.email
mail__options__port: 587
# 填入你刚才生成的账号密码
mail__options__auth__user: "你的Ethereal账号"
mail__options__auth__pass: "你的Ethereal密码"
# 发件人随便填
mail__from: noreply@你的域名.com
第三步:重启服务
docker-compose up -d
第四步:获取验证码并登录
- 回到 Ghost 后台,再次点击登录。此时 Ghost 会顺利发送邮件(因为它连的是 Ethereal 的 587 端口,不会被阿里云拦截)。
- 回到 ethereal.email 网页。
- 点击 "Check Messages"。
- 你会看到一封来自 Ghost 的邮件,点开它,复制里面的 6 位数验证码。
- 回到 Ghost 后台填入,登录成功!
总结
在 Ghost 5.x 严格的安全策略下,Ethereal 是解决“鸡生蛋、蛋生鸡”(没登录无法配邮件,没邮件无法登录)死循环的最佳工具。
虽然这只是权宜之计,但它不需要域名验证、不需要备案,能让你先进入后台。等你准备好正式运营时,建议再替换为 Mailgun 或阿里云邮件推送服务。