SMTP与邮件协议

很长时间都对电子邮件究竟是如何发送的抱有一定的疑惑,最近详细搜了搜SMTP协议,增加了对其的一部分了解(但是我并不确定我自己的理解是否完全正确,欢迎指正)。

SMTP协议(Simple Mail Transfer Protocol)是目前广泛用于发送电子邮件的协议,目前一般有三个变种:

  • 25端口: 默认的SMTP Relay端口(服务器与服务器之间, 此时通常也会使用STARTTLS),或者是明文传输(无加密)的邮件发送端口(用户与服务器之间)(事实上很多情况下也同样可以使用STARTTLS, 但是一般用户发送邮件使用STARTTLS都会使用端口587)。
  • 465端口: 全程SSL/TLS加密,这曾经是一个标准化的端口,但是后来因为STARTTLS,这个端口被分配给了其他服务。但是很多服务商并没有更改端口所以这个端口还是事实上可以用。
  • 587端口:当今默认的邮件发送端口(用户与服务器之间),使用STARTTLS(最开始不加密,直到STARTTLS命令开始TLS加密)

最开始SMTP协议只是单纯的25端口的协议,所有传输都未经加密。但是这样带来了很多安全风险,因为任何人都可以直接拦截到明文信息。除此之外,没有任何加密代表没有办法准确的确认邮件是否被伪造或者修改,只要发件人删掉邮件就没有证据证明发件人真的发出过这封邮件,这些都带来了许多不必要的麻烦。

之后出现了465端口的SSL/TLS协议,基本解决了以上所有问题。但是这与原协议不兼容,没有更新的邮件客户端都没办法在新的端口上运行。后来这个协议被STARTTLS代替,STARTTLS在使用STARTTLS之前使用明文传输,因此可以兼容明文传输的已有的协议,而支持加密的客户端则可以使用STARTTLS命令进入加密状态,从而实现邮件的安全传输。

具体来说,发送邮件的过程如下图所示

By Ale2006-from-en - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=10583999

  • MUA代表mail user agent,比如你的邮箱客户端或者网页端,当今一般通过SMTP587 STARTTLS把邮件传输给MSA
  • MSA代表mail submission agent(这一部分属于源服务器)
  • MTA代表mail transfer agent(这一部分也属于源服务器,可以与MSA是同一个服务器,也可以是不同服务器)
  • MTA服务器会使用DNS(Domain Name System)查找对应目标服务器的MX记录,找到目标邮件服务器,随后把邮件传送过去。这一步骤可能会经过多个SMTP服务器进行传递,被称为SMTP Relay,通常使用SMTP25 STARTTLS。
  • MDA指mail delivery agent(属于目标服务器),它把邮件放到对应的本地信箱里,邮件发送完毕

我们通常使用的所有邮箱都是借助于第三方服务,比如gmail.com或者是outlook.com,126.com(邮件地址@后面的部分),而我们的邮件就会在这些服务器上进行传递。

虽然当今服务器一般都使用STARTTLS,但是传统的明文协议仍然可用。如果使用TLS的话,就需要域名和证书来验证身份,但是明文协议却不需要这些,因此可以尝试直接以本地计算机做服务器发邮件。可惜的是,为了防止垃圾邮件,大多数ISP以及VPS厂商都禁止了25端口的访问,所以如果要尝试这个想法的话需要找到一个不封25端口的VPS(很多厂商也可以申请解封)。

具体步骤如下(以Ubuntu为例):

首先安装mail:

sudo apt install mailutils postfix

这会自动安装mail命令以及postfix本地SMTP服务器,安装时postfix选项选择Internet Site(除非你想有更复杂的配置),System Mail Name正常应该填入域名,但是没有域名可以随便填写。随后就可以发送邮件了

echo "内容" | mail -s "主题" 目标地址

需要注意的是,因为此时使用的协议是未加密的协议,发送的邮件有一定几率被退回,就算成功发送也大概率会进垃圾邮件里面,因为未加密的协议早已被垃圾邮件滥用。而邮件接收者也会收到对应的提示
SMTP未加密邮件

Gmail会提示邮件未加密并被识别为垃圾邮件,而发件地址则是你的用户名@hostname,而我们此时的hostname并不是实际上我们的域名。也就是说,我们可以伪造未加密的邮件。

简单的伪造方法如下:

echo "内容" | mail -a "FROM: 发件人名称 <发件地址>" -s "主题" 目标地址

比如:

echo "hi" | mail -a "FROM: ABC <abc@d.com>" -s "hi" zzq5700@gmail.com

可见,即使通过加密邮件,封禁25端口等方式阻止垃圾邮件以及伪造的邮件的出现,我们仍然可以使用当今还没被完全抛弃的非加密方法进行邮件的伪造。而很多垃圾邮件也用了同样的道理。然而,以上的方式并不总会成功,不仅仅因为这种邮件往往会被拦截,更因为SPF进一步阻止了邮件的伪造,还有S/MIME等更加深层次的认证与加密方法,这就留给读者去自行探索,我也有可能会在未来写相关文章。当然,如果你有自己的域名的话,理论上也完全可以建立自己的邮件服务器,但是解封25端口可能并不是非常容易的事情。因此,更加现实的方法是去用第三方的代理域名邮箱(比如网易、腾讯企业邮箱),这样也同样可以获得带自己域名后缀的邮箱,或许也就能够满足一些人(比如我)小小的好奇以及虚荣心了。

点赞
  1. 多米诺说道:
    Google Chrome Windows 10
  2. Exusiai说道:
    QQbrowser Android 10
    不愧是你

发表评论

电子邮件地址不会被公开。必填项已用 * 标注