Ghost Mailgun替代方案

分享
Ghost Mailgun替代方案
Photo by Acrelia / Unsplash

自己用Docker托管Ghost有一段时间了,写文章、发布、订阅,一切都挺顺。直到有天看了眼Mailgun的账单提醒,才想起来当初注册的是试用账号,免费额度用完就要收费了。订阅人数不多,按量付费倒不算贵,但既然手头有Resend的账号,闲置着不用挺浪费,就想着能不能换掉。

第一个发现:Ghost的"群发订阅邮件"功能不是随便换个SMTP就能解决的事。官方明确写过,批量邮件不支持走普通SMTP,只支持Mailgun这一个渠道——这是Ghost自己的限制,不是Mailgun的限制。换句话说,光是改config.production.json里的mail配置,解决的只是密码重置、注册验证这类"事务邮件",跟群发订阅邮件完全是两条线。

找了一圈,社区里相对成熟的方案是 Ghosler,一个开源的第三方工具。原理不复杂:它在Ghost里注册一个Custom Integration,监听post.published这个webhook事件,文章一发布,Ghost通知它,它自己去拉文章内容和订阅者名单,再用你配置好的SMTP账号——Resend、SES、随便什么——把邮件发出去。等于自己实现了一遍Ghost不让你用SMTP做的事。

装的过程踩了第一个坑。官方推荐用一条脚本一键安装,但“有些地方”访问GitHub不稳定,脚本卡住跑不完。后来扒了一下脚本内容才发现,它本质上只是查个版本号,然后去Docker Hub拉现成镜像——版本号查不到没关系,直接手动docker run一条命令,把版本号写死,照样能装上。

第二个坑出在Ghost编辑器里。正常发布文章时,"Publish and email"这个选项是灰的,点了提示"去配置Mailgun"。但其实Ghost检查的只是Settings里那个Mailgun配置框是不是空的,不会在你点发布的瞬间去验证这些凭证是不是真实有效。所以解法是:随便填一些占位的假信息进去(域名、API Key随便写),它就会认为"Mailgun已配置",解锁这个选项。选了"Publish and email"之后,Ghost会在背后悄悄尝试调用Mailgun,因为是假凭证,这部分静默失败,不影响——但关键是,这篇文章这下被正确标记成"关联了newsletter",Ghosler这才能从webhook里读到这个信息,知道该处理它。如果选的是"Publish only",Ghosler收到通知后会判断"这篇文章没要发邮件",安安静静什么都不做,连日志都不会留。

邮件这块,Resend走的是标准SMTP接口,不是专门的API对接,所以在Ghosler的Emails设置里按SMTP方式填:host填smtp.resend.com,端口465,用户名固定是resend,密码就是Resend的API Key。

最后一个坑最隐蔽:测试发现10个订阅者,只有4个真正收到邮件,没有任何报错提示。翻日志才看到真相——Resend默认限速是每秒2个请求,Ghosler发邮件的时候没有做限速控制,几封邮件几乎同时甩出去,超过限制的部分直接被拒收,而且不会自动重试。好在Ghosler自己留了限速选项,把"Emails per batch"调成1,"Delay per batch"调成1000毫秒,等于强制它一秒发一封,问题就消失了。

整套方案跑通之后,流程就变得很轻松:写文章,发布时选"Publish and email",剩下的Ghosler自动接管,Resend后台能看到实际发送记录,不用再为Mailgun的账单操心。

要提一句的是,Ghosler这个项目维护频率不算高,最近一次更新是好几个月前的事,issue区里也能看到类似限速没处理好的老问题没人修。胜在原理简单、代码量不大,真出问题自己也能照着日志查个大概。如果是订阅量不大的个人博客,这套组合性价比已经够用了;如果以后订阅者涨到上千,可能要重新考虑限速和重试机制够不够撑住。

阅读更多

Love of power

Love of power

昨天,一对极限攀爬情侣,徒手爬上了四百多米高的帝国大厦顶端。他们是Angela和Ivan,2024年Netflix有一部他们的纪录片《Skywalkers: A Love Story》拍他们在全世界爬楼的故事。这次他们在帝国大厦的顶端挂了条黑底白字的横幅: When the power of love beats the love of power, the world knows peace.「当爱的力量战胜对权力的迷恋时,世界才能迎来和平。」 然后,他们爬到一个稍矮的平台,求婚戴戒指,然后被警察带走了。 我查了一下这句话的原话是:"When the power of love overcomes the love of power, the world will know peace",常年被安在Jimi

向下歧视

向下歧视

河南人在上海,不说自己是河南人。说北方人,说老家在郑州。河南这两个字,在别人眼里似乎自带歧视加成。 中国的歧视很少是横向的。所有人沿着同一条轴线站着——往上看是巴结,往下看是蔑视。香港歧视大陆人,上海人歧视河南人,郑州人歧视周边县市,城里人歧视农村人。在城市里的农村人,更加歧视农村人。在香港的大陆人,更加歧视大陆人。 歧视的方向不是向外,是向下。 我认为这件事的根源不在户籍制度。户籍是结果,往前追,是几千年资源一直被少数人掌控的现实。皇权换成地主,地主换成算法,形式一直在变,但普通人改变命运的路径从来只有一条:向上攀附,找到愿意拉你一把的人。横向联合从来不是选项,因为横向没有资源。 这个现实塑造了一种专属国人的人格结构。对熟人信任,对陌生人设防。巴结强者是投资。要维护面子,因为面子是接触资源的入场券。说话留余地,因为说死了等于放弃主动权。 连信仰也长成了这个形状。烧香拜佛,本质是求人办事——菩萨是有能力的他者,你去打点他,请他帮忙。哪个灵拜哪个,不灵就换。这套逻辑和现实生活里求人办事完全一样,因为神就是现实的投影。