首先正常的发送邮件,这里以java为例,可以用javamail或者其他的第三方jar包实现邮件发送,这些都是通过对socket发送邮件的封装。

一封邮件的发送是怎样的?

telnet smtp.qq.com 25
250-newxmesmtplogicsvrsza23.qq.com-10.57.80.90-24271045
HELO something
250-SIZE 73400320
250 OK
AUTH LOGIN
334 VXNlcm5hbWU6
username_base64
334 UGFzc3dvcmQ6
password_base64
235 Authentication successful
MAIL FROM:<username@qq.com>
250 OK.
RCPT TO:<recv@163.com>
250 OK
DATA
354 End data with <CR><LF>.<CR><LF>.
subject:warning
from:username@qq.com
to:recv@163.com
cpu 100%
.
250 OK: queued as.
quit
221 Bye.

这样就利用发送了一封邮件。

伪装:

smtp协议存在一个安全漏洞,就是smtp协议允许你两次设置发件人和收件人信息。第一次发送命令行mail from:真正的发送邮件的源地址 ;第二次则是在发送data命令之后,开始写邮件内容。在写邮件内容时,还能再一次设置发件人、收件人、抄送者等信息(在data里面写的发件人、收件人、抄送人信息,只能显示,其实没有其他作用,比如你在设置收件人的命令里面没有写 123456@qq.com这个邮件地址,但是你在data命令之后,抄送者里面输入了123456@qq.com这个地址,最后这封邮件并不会发给这个抄送人,只是在邮件的抄送者这一栏里面,有这么一个邮箱账号。所以要真的发送给这些人,只有在最开始设置发件源之后,设置收件源,可以多个)。

所以在data之后,

from:vip@163.com
to:vip@qq.com

这样就伪装了一个邮件。

效果:

这里大厂的邮件服务器会显示代发