钓鱼邮件是怎么实现的?

createh53周前 (12-15)技术教程17

我们可能会收到一些钓鱼邮件,今天就说说这种邮件是怎么实现的,专门去百度了一下具体的定义,放出来给大家看看。按照道理来说,学习了本文,你也就可以去发钓鱼邮件了,但是不能做坏事哈!

钓鱼邮件指利用伪装的电邮,欺骗收件人将账号、口令等信息回复给指定的接收者;或引导收件人连接到特制的网页,这些网页通常会伪装成和真实网站一样,如银行或理财的网页,令登录者信以为真,输入信用卡或银行卡号码、账户名称及密码等而被盗取。

我们一般发送邮件就是使用 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。

相关文章

Java 发送邮件

使用Java应用程序发送E-mail十分简单,但是首先你应该在你的机器上安装JavaMail API 和Java Activation Framework (JAF) 。 你可以在 JavaMail...

实战!SpringBoot整合Vue3完美实现发送邮件的功能!

1.效果演示2.思维导图3.前言本篇文章主要讲解 Springboot 整合 Vue3 实现校验 qq 邮箱验证码之后重置用户密码的功能。开发功能之前我们先梳理一下主要逻辑:1.我们要想让系统给其他用...

Java之数组数据操作之电子邮件地址判断

java源代码:/***<p>Title:数组数据操作之电子邮件地址判断</p>*<p>Description:演示一维数组和多维数组的初始化和基本操作</p...

Linux中用postfix搭建邮件服务器实战详解

写在前面:自建邮件服务器发出的邮件有很大概率会被各大邮件服务商列入垃圾邮件箱中,我在搭建过程中发现在设置了dkim spf 等操作后,国内邮件基本可以正常发到收件箱,但 google 邮箱貌似还是会进...

阿里二面:说下如何基于SpringBoot发送邮件?

在我们实际业务开发中邮件发送其实是一个非常常见的需求,用户注册,找回密码等地方都会用到,使用JavaSE代码发送邮件步骤还是挺繁琐的。SpringBoot中对于邮件发送,提供了相关的自动化配置类,使得...