#开源项目推荐 Temporary email reciever
之前转发时没来得及介绍一下这个项目,这是项目很有创意,充分利用了 CloudFlare 的 Email 转发功能,实现了一个临时接收邮件的程序,访问时为你提供了一个临时的邮箱,你可以临时接收注册验证码之类的临时邮件。
技术实现上,就是将邮件转发到 CloudFlare 的 Worker,Worker 收到邮件后将邮件解析后存数据库,后面收到邮件了,就可以按照分配给你的邮件去检索收到的邮件。
其实发散一下,还可以做一个 newsletter 阅读器,我现在 newsletter 的邮件都是垃圾邮件,可以提供一个服务,生成专门用于订阅的 newsletter 的邮箱,然后收到 newsletter 后,解析排版后直接网页阅读。
我在原推的留言里面也提到了一点技术上的改进建议,按照当前的架构可能使用量一大就会导致数据库上涨飞快,因为所有邮件内容都是存数据库,邮件如果有附件的话一会就不够用了,另外数据量一大没有正确的索引也会导致检索速度下降。
所以相对更好一点的架构是数据库只存 Meta 数据,也就是显示邮件列表、查询和排序用到的数据,其余数据存在更便宜更大的 R2 里面,当用户点击邮件详情的时候再去 R2 读取和解析原始邮件,这样可以节约大量数据库空间。
另外一个问题就是索引,比如说你的查询是:
select * from emails where messageTo="[email protected]" order by createdAt desc
那么如果你没有正确的索引,每次查询会遍历整个数据表的所有记录,数据量一大会很慢。
那应该怎么建索引呢?
另一个常犯的错误是在 messageTo 和 createdAt 上分别建索引,messageTo 上那条索引在查询时是有效果的,但是这条索引对于排序没有任何帮助。
正确的做法是建一条索引,但是索引字段是 messageTo 和 createdAt,messageTo 在前面,createdAt 在后面,顺序不能错,否则索引也白建了。
其实也很好理解:这样的索引就相当于你先用messageTo对数据记录进行排序,然后再对每一个messageTo里面的记录按照createdAt排序,这样你用这条索引检索出来的结果,首先可以快速的检索到特定messageTo的结果,并且检索后的结果是排序好的。
点击图片查看原图