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