电子邮件是现存最古老的Internet服务之一了,在AI和移动互联网的冲击下,网页应用正在随着搜索引警这艘巨轮慢慢沉没。Web技术更多被用于承载JSON,而不是展示内容。
传统的电子邮件服务商以转型为借口正在迅速地APP化,为此不惜主动限制Web端功能和体验。出于备份考虑,其实更多的是好奇。我决定自己搭建一个邮件服务器,毕竟我已经自己托管了博客、网盘、各种服务端。反正机器是现成的,只不过多建一个虚拟机而以。
起心动念很容易,但是接下来的几天就掉进了一个个巨坑。
第一关,电子邮件服务实在太古老了,长时间的进化,以至于进化得太过复杂。简单说,Email 不是像 HTTP 或 FTP 那样的单一协议,而是一堆协议。SMTP协议的责任是在服务器与服务器之间收发信件,以及把客户端送来的信件传递信件目标服务器。至于信件如何存储并不是SMTP服务器需要考虑的。当用户需要寄信时,应该联系SMTP服务器,当他需要收信时,他应该联系POP3&IMAP服务器。后者定义了把信件转交给客户的协议,同时负责把用户的信件存储在硬盘文件或数据库中。而且如何组织帐户和存储信件并没有统一标准,你(系统架构的设计者和实施者)需要自己决定,甚至包括自己决定数据库的表结构,以及在配置文件中手写SQL查询语句,否则服务器不知道该怎么办。
早年使用电子邮件的时候我就注意到一个现象。当时民风纯朴憨厚,很多SMTP是不需要认证就能寄信的。虽然邮件服务商通常同时提供SMTP和POP3两种服务器,但是事实上你可以在没有邮件帐号的情况下随便找一个匿名SMTP服务器就能给世界上的任何人寄信。一直到后来,人们变得不再憨厚。
这么重要的服务,之所以进化成一堆散装协议的原因,还是因为太老了。它甚至比互联网本身还要老。
事实上,mail 这种数据结构早在上古的UNIX时期就有了,它最初只是在同一台机器的不同用户之间传递。直到后来,机器联网了,工程师们才为这种独立的数据结构设计了跨机器收发的协议。最开始,它仅仅实现了从A机器的UNIX帐号向B机器的另一名UNIX帐号传递的功能。一直到后来人们发明了虚拟帐号,即,邮件帐号不再对应于机器的本地帐号。当电子邮件大规模推广以后,使用虚拟帐号就成了唯一正确的做法。不然我申请网易的邮箱,改天我潜进网易的机房甚至都能登陆进去玩玩。虽然邮件帐号与本地帐号不再关联已经几十年了,你猜怎么着,现在所有主流的服务器软件都还保留着恢复使用系统本地帐号的功能。你就说复不复杂。
搞清楚协议和软件的复杂性只是掉坑的第一步。第二个巨坑,是实在找不到合适的机器来运行它。
第一个要求,固定IP,还要设置域名的反向解析。不然对方服务器在收信时要通过IP反查你的域名,一旦与来信的服务器后缀对不上号就拒收。我放在家里的小机器出局了。好在手头还有两台VPS。
等我费了大力气把 Postfix + Dovecot 这对组合搞定了,Webmail 也搞定了,最后发现它只能收件,不能发件。配置文件一行一行地排查了几遍,最后发现配置没问题,是VPS的25端口出站连接被封了。联系供应商开放端口被拒,我又换了另一家VPS,结果更狠,出站入站一起封。经过迅速地增加阅历,我终于搞明白,因为前些年不厚道的人多,垃圾邮件泛滥,全球的VPS供应商,没错,是全球,都不约而同地把邮件端口给封了。最初可能是被投诉和罚款搞怕了,结果后来发现竟然多了一个赚钱的路子:让那些确实需要发邮件的企业客户额外加钱。至于像我这种好奇心泛滥的不知天高地厚的家伙,根本就不是目标客户。
花钱买端口不现实,我就在想有没有技术能绕过限制?既然机器的端口被封了,那就找一台没有被封的机器来做代理,第一招:SMTP中继,其实也是花钱的招。在尝试注册了一堆公司,在验证时纷纷被拒以后,我放弃了。
其实进展到这里,我已经想放弃了。毕竟大公司们提供的免费邮箱还在,好奇心也满足了,花钱的必要性根本不存在。可是此刻的我就象一个输急了的赌徒,已经花了几天时间了,无功而返实在不甘心。最后竟然被我想到了一个解决方案:用洋葱做代理!
又一轮尝试,主流邮件服务器软件挨个试了一遍,没有一个支持socks代理smtp发送信件。失败。Google出来的页面显示,相关讨论很多是十几年前的。也就是说早就有人和我一样的想法,但是十多年过去了,不了了之。那些软件的作者压根不认为这是个正经需求。最后绝处逢生,真的让我找到了一个方案。
不经意间我发现了一个神奇的软件: redsocks。
这个软件可以让任意不支持socks代理协议支持代理。它的做法很简单:它开个端口监听,通过 iptables 规则把需要代理的流量转发过来,再转发给上游的socks5代理。被代理的软件压根就不知道自己被代理了。所以,整个链条是这样的:
Postfix -> iptables -> redsocks -> Tor -> 目标SMTP服务器
为了放个屁,脱了这么多层裤子。成是成功了,但是高兴没有超过三秒。因为被目标服务器拒收了,原因是洋葱头的几乎所有出口节点都被垃圾邮件黑名单给收录了。每当我为自己的机智沾沾自喜的时候,上天总是要嘲讽我一番:比你机智的人多的是!
折腾几天的工夫,最大的收获是发现了一个好玩的软件:redsocks。 另外,还剩下半个配置好的服务器——只能接收,不能往外发送。当然,在本地服务器的客户之间是可以发送的,只不过整个服务器只有我一个客户。。。
评论