在日常工具开发中,常常会有发送邮件的需求。在一些高级语言中,如Python。C#中,都有专门的邮件发送模块,如Python 中的 smtplib 模块。那么。一封邮件究竟是怎样发送到一个特定的邮箱呢?
举个样例:使用test@163.com 发送一封邮件到 test@qq.com。
首先,看下邮件系统的组成部分。例如以下图
再看下邮件发送的整个过程,例如以下图:
①发送者使用SMTP协议,将邮件发送到自己邮箱server
②163邮件server使用SMTP协议,将邮件发送到QQ邮件server
③收件人使用POP3协议,从server端读取邮件
在上面过程中我们会发现两个问题:
①163邮件server须要验证发送方是否是合法用户。也就是说在整个发送过程中。须要使用到test@163.com的password才干完毕整个邮件发送过程。
②163邮件server怎样发送邮件到QQ邮件server的呢?事实上,这中间有个域名解析的过程。发送方会依据收件人的信箱来解析其server域名(qq.com),在该解析过程中,询问其邮件server的地址。
既然验证过程是在163邮件server。那么我们是不是能够直接绕过去,直接模拟请求跟QQ邮件server进行交互呢?答案是肯定的,而邮件发送的整个过程能够抽象成下图
我们能够发现关键的地方是怎样解析QQ邮件server的地址。
此处我们使用Windows命令nslookup来进行域名解析。
查看qq.com的邮件server地址,能够使用命令:nslookup -qt=mx qq.com,结果例如以下:
当中 mail exchanger 后面就是qq.com 的邮件server地址。
这样。我们就绕过了password验证的过程,将邮件直接发送到了收件人的邮件server。想要了解代码怎样实现。欢迎查看之前的文章“Python写自己主动化之邮件匿名发送”