老早就想着整一个博客了,但是本来就没啥记东西的习惯,而且找了半天博客的样式也没有个自己满意的,还懒,于是一拖再拖。
但是某天跟朋友聊天时谈及博客的评论系统,朋友抱怨几个无服务器需求的博客评论系统实现要么带的 js 体积过于庞大要么实现比较灵车,也不满意使用 GitHub Issue 的方式储存评论的 Git talk,最后需求是要有个体积小、支持富文本、支持匿名、登录方便的评论系统。正好那几天俺闲得无聊在刷各个开源项目的 mailing list,一瞧哟呵这邮件不就本身支持富文本,编辑器交给邮件客户端后也不用网页里拖着个markdown编辑器了,而且本身各平台注册多少都得绑定邮箱,这下直接用邮箱发送评论了,那岂不是省得注册也不用登录了啦?俺寻思这想法妙,当即准备写个 demo 出来,然后发现缺个博客,遂罢。
过了很久之后的另一个某天,俺刷着刷着 MDN,发现欸这 mailto:
链接居然可以直接指定主题和内容,突然发觉自己好像忘了些什么,想了半天,想起自己好像是想过写个基于邮件的评论系统的点子,要用了这链接岂不快哉:有个装模做样的评论栏,写好东西后一个链接给你送进邮件客户端里,再一点就能发送。但俺觉着不妙,这再不记点东西下来以后真给自己的好想法忘了,于是搞一个博客的计划被正式提上日程,然后又鸽了两周。
本着有轮子我就是不用就要从头造的原则,真开始动手时俺打算直接新搞个博客框架得了,然后发现了几个问题,一是写了半天的 CSS 发现俺除了 imgui 那种黑框框灰条条的设计外真写不出啥更好看的了,二是巨多细节没有考虑到,写出的轮子除了能渲染个 markdown 之外啥都干不了,由此得出几个结论:
于是在一番毫无意义的折腾之后,俺最后还是选择了 hexo,主题选了个够简单的。饺子包完了就到了这点儿醋的部分,首先得解决的问题是真正的邮件列表可得有个服务器,咱这无服务器的得找哪个冤大头来存这评论的数据,考虑到俺穷,云数据库多少得花钱,干脆就地仓库里开个分支存得了,到时候用 raw.gihubusercontent 拉出去。
其次是邮件如何从收信箱里到 commit,因为俺的邮箱同样用的是白嫖的 Microsoft E5,可以通过 GraphAPI 提供 webhook 通知邮件收到,加个 Cloudflare worker 之类的云函数当作 API 网关,嘿,灵车一条龙得了,等哪天白嫖的全失效了也能全身而退自己开个 SMTP 服务器收信加 commit。等这个灵车一条龙架好,俺一测试,发现大大的不妙,这 GraphAPI 的 webhook 一个通知只要你没有立即回答它就会一直发,考虑到网络延迟,这意味着我的 worker API 网关会收到很多重复的通知,而对于分布式的云函数而言没有很好的进行原子性操作的方法(要加钱!),那最终就是一封回复邮件会产生多个重复回复,搞得一团糟。
实践证明,要解决灵车问题,除了加钱外一个方案是使用更灵的灵车,最后的解决方案是使用了微软的 Power Automate(没错!就是代码块拼拼乐!),在收到邮件时发送 HTTP 请求到 worker API 网关,这次就不会像 GraphAPI 的 webhook 一样重复多发了,于是问题成功解决,拼拼乐还可以帮忙把收到的邮件自动标已读和自动回复,牛逼。
最后的问题是 raw.githubusercontent 的内容及时性问题,实测一封回复邮件发完到 raw.githubusercontent 更新得 3 分钟左右,这种延迟确实非常影响用户体验,不过俺估摸着俺这博客也没什么人会回复,能做出个 demo 就算对自己交差了,遂不管。
不过折腾完这些俺发觉这邮件跟博客结合起来还能干点其他的事情,就是投稿,有一说一,要写点文章得整个 repo 拉下来再配好环境敲敲命令才能投稿回去,属实是一个痛点,俺就继续利用那灵车一条龙再加上 github action 凑了个能使用邮件投稿的超级加倍灵车,这下随时随地能上邮箱就能投稿,除了邮件里写 markdown 之外还支持直接利用邮件里的 html,附件的处理逻辑也整好了,不过俺自己能利用自己这套东西写几次东西尚且存疑。
最后整个系统的架构图如下:
按这 Github 三天两头可用性下降,Microsoft E5 最近又大规模扬订阅(2023年4月),这套灵车按那个可靠性链式乘法下来估计是没那么健壮,不过反正是为了那么点儿醋才包的饺子,管他妈的那么多。