钓鱼邮件指利用伪装的电邮,欺骗收件人将账号、口令等信息回答给指定的吸收者;或勾引收件人连接到特制的网页,这些网页常日会伪装成和真实网站一样,如银行或理财的网页,令登录者信以为真,输入信用卡或银行卡号码、账户名称及密码等而被盗取。
我们一样平常发送邮件便是利用 SMTP 协议,在 Java 中我们实现发送邮件的功能只须要几行代码加一些大略的配置就行了,实现起来非常的大略。
下面便是最常见的实现办法,若不是最近项目用到,我可能不会深入去研究这些东西,以是就来记录一下。

@Autowiredprivate JavaMailSender mailSender;SimpleMailMessage message = new SimpleMailMessage();message.setFrom(from);message.setTo(to);message.setSubject(subject);message.setText(content);mailSender.send(message);
相信大家看上面的代码基本都能明白,下面就说深一点的东西。
假设我们所有的邮件都须要发送到一个中继做事器,然后再由中继做事器发送出去,这该怎么实现呢?我们总不能把所有的 to 都改成中继做事器的地址吧,那原始收件人的信息又该怎么办呢?
这里就涉及到 SMTP 中邮件的布局了,实在我们自己组装的 message 只是一个信息,他和收件人发件人一点关系都没有,一点关系都没有,一点关系都没有,主要的事情说三遍。
我们可以把邮件想象成信件,一封信由信封和信件两部分组成,邮件大概如此,不过邮件多了一个头部信息,以是大略来说邮件是由信封,头部信息,和信件组成。
信封上就两个信息从这里到那里,对应到邮件做事中便是 SMTP 中的 MAIL From 和 RCPT To 命令,而这便是正经的发件人和收件人。
头部信息也便是 Header,常见的信息有 Return-path,Received,Message-ID,To,From,Subject,Date。
末了便是正文部分了,而正文部分就包括我们看到的 from,to,subject 等信息,也便是上面提到的 Message。
希望到这里大家能理解邮件的不同组成部分,然后再来说说为什么我们只是设置了一个 Message 就正常地发出去了呢,缘故原由便是 Java 已经给我们封装好了。还有一些信息是 SMTP 协议为我们设置好的。
现在就可以回答上面的那个问题了,我们如何才能不改变 Message 的情形下,将收件人改为中继做事器呢?按照道理来说我们只须要为 MAIL To 这个命令赋值就行了。实在是有干系的 API 的,不过是被包装起来了,看下面的代码就明白了。
Address[] addresses = mimeMessage.getAllRecipients();transport.sendMessage(mimeMessage, addresses != null?addresses:new Address[0]);
这两行代码解释了两件事,一是为什么我们设置 Message 的 to 就会作为收件人,另一个便是我们只须要改变 sendMessage 方法的第二个参数就可以自定义收件人邮箱!
至此我们该当也可以明白钓鱼邮箱是怎么实现的了,你所看到的邮箱内容都是可定制的,而真正的发件人和收件人都是隐蔽在背后的(你能收到邮件,收件人肯定是你,但是可以显示出来不是你,只须要设置 Message 的属性就行。)
再说一个小知识点顺带留一个思考,Header 中的 Return-path 表示当邮件发送失落败时回退的地址,默认为设置成 MAIL From,也便是设置为 From,那问题来了,我如何重写 Return-path 呢?把稳直接在 Header 中重写是没用的,思考方向该当是如何重写 MAIL From,而不是连续利用 Message 中的 From。