Java实现伪造邮件发信人

  • 关键词
  • 效果预览
  • 背景说明
    • 作业背景
    • 环境
  • 参考说明
  • 实现代码
  • 代码解析及输出
  • 测试及避坑
  • 启示
  • 拓展阅读

关键词

Java、邮件、SMTP、伪造、发信人、邮箱、由……代发

效果预览

背景说明

作业背景

最近在做设计,设计里涉及到邮件通知功能,但是直接使用自己个人邮箱发送的话显得那啥一点,并且在Python SMTP发送邮件里发现是可以伪造邮件的,故打算把自己的邮箱“打扮”一下,将自己的设计模拟的更真实一点。可不要拿来做不好的事情哦

环境

  • Win10、Linux
  • Java8(不需要额外的jar)

参考说明

看了不少做JavaEmail的文章,基本上都是采用javax.mail.jar包做的,但是无法实现伪造发信人(这里的发信人指的是邮箱,这个包昵称是可以指定的。可能之前的setSender可以,但是我没用过,我下载的1.6.2版本的,MimeMessage对象没有setSender方法),主要参考了两篇文章(后面给出),都写的很好,我写这篇文章的目的是让朋友们多一个维度参考。下面是我参考的文章:
1.JAVA实现SMTP邮件发送
2.java发送邮件的两种实现方式(包括如何伪造发件人及其原理)
对了还有一篇:Java8 Base64 | 菜鸟教程

实现代码

喜欢图片的朋友看这个,喜欢代码的在后面

源代码:

import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Base64;public class SMTPSendMail {public static void main(String[] args) {String loginUsername = "sample@163.com"; //<- 登录邮箱,这里仅为示例String loginPassword = "JCTAJSNCUPEMKPZO"; //<- 16位授权密码String realAddressee  = "receiver@xxx.com"; //<- 收件人邮箱String smtpServer = "smtp.163.com"; //<- smtp服务器地址int port = 25;String b64Username = Base64.getEncoder().encodeToString(loginUsername.getBytes(StandardCharsets.UTF_8));String b64Password = Base64.getEncoder().encodeToString(loginPassword.getBytes(StandardCharsets.UTF_8));try {Socket socket = new Socket(smtpServer, port);BufferedReader bfr = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);//发送'helo'命令, 读取输出pw.println("helo " + "Stephen");System.out.println(bfr.readLine());//发送'auth login'命令pw.println("auth login");System.out.println(bfr.readLine());pw.println(b64Username); // 用户名base64System.out.println(bfr.readLine());pw.println(b64Password); // 授权密码base64System.out.println(bfr.readLine());//设置'mail from' 和 'rcpt to'pw.println("mail from:<"+loginUsername+">");System.out.println(bfr.readLine());pw.println("rcpt to:<" + realAddressee + ">");System.out.println(bfr.readLine());//设置'data'pw.println("data");System.out.println(bfr.readLine());/* 正文主体 */pw.println("subject:" + "主题什么的随随便便就好了"); // 主题// “伪造”发信人pw.println("from:" + "一方巨鳄 <xxxxxx@163.com>");  //格式:昵称 <显示的发件人邮箱>(伪发件人)pw.println("to:" + "管理员 <" + realAddressee + ">"); //指定收件人名称,有的smtp服务器可以把收件人显示的邮箱也改了// 这里smtp.163.com会"554 DT:SPM"退信pw.println("Content-Type:text/html;charset=\"utf-8\""); // 这里采用的是html类型,可换为纯文本plain类型pw.println();String text = "<html><body><table border=\"1\"> <h1>表格</h1>" +"<tr><th>姓名</th><td>理智</td></tr>" +"<tr><th>性别</th><td align=\"center\">男</td></tr></table></body></html>";pw.println(text);pw.println();pw.println("."); //内容部分结束System.out.println(bfr.readLine());//发送结束,退出pw.println("rset");System.out.println(bfr.readLine());pw.println("quit");System.out.println(bfr.readLine());} catch (IOException e) {e.printStackTrace();}}
}

代码解析及输出

可以看到,上面的代码主要是pw.println()bfr.readLine(),前者主要是发命令的,而后者则是接收响应的。模拟Telnet客户端发邮件[1]。

输出

邮件效果在开头已给出,那是我用学校邮箱的smtp服务器发的,改了收件人显示的信息,没有被退信。

测试及避坑

  1. 我在使用smtp.163.com服务器的情况下在to:命令之后接假收件人时遇到这个
    554 DT:SPM 163 smtp10,DsCowAD3__ck_rxeJqxmBw--.19039S2 1589444132,please see
    http://mail.163.com/help/help_spam_16.htm?ip=111.58.181.219&hostid=smtp10&time=1589444132
    点进去看,是“退信代码说明”

    解决办法:把图第49行的收件人改回真实收件人邮箱(上面的已改,原来的代码是pw.println("to:" + "管理员 <xxxxxx@qq.com>");实现的就是效果图)就可以了。

  2. 测试139邮箱时,一直报550 2f015ebe0b3f97a-4e9fd Mail rejected,ta没有给授权码,就是使用的登录密码,我尝试的所有办法都无法发邮件(无论是否伪造)

    解决办法:暂无,劝君慎用139,或者有解决的踢我一脚谢谢

  3. 测试sina邮箱,sina邮箱是要将mail fromfrom进行匹配的,也就是无法通过这个方法进行伪造,有知道怎么做的也可以提醒我谢谢。

    解决办法:我无。

  4. 测试126邮箱,给qq邮箱发邮件,第一次可以伪造(显示代发,并且有一段特殊信息回显),之后就是显示真实的邮箱地址。

  5. 目前就测试了这几个邮箱服务商,总的来说就qq、163和126可以伪造发信人,这几个邮箱开启SMTP服务的话短信是自己发的短信费是自己掏的,所以写这篇文章是含有成本在里面的(含金量杠杠的

    Java实现伪造邮件发信人相关推荐

    1. 如何预防收到伪造本域发信人的诈骗邮件

      近日,很多伙伴都收到发件人显示本域用户发送给自己的诈骗邮件,如下图: 收发件人均为同一本域用户的诈骗邮件 邮件内容大部分是提示你邮箱账号被黑了,要求你支付相应的金额来解决问题.收到这种邮件后不用惊慌, ...

    2. java web前端邮件,javaweb之javamail

      今日学习的知识是使用JAVAMail来发送邮件; 前期的准备工具,所需的jar包 下面给大家提供了下载jar包的地址 首先,发送邮件需要三步,1.需要得到session,2.创建MimeMessage ...

    3. java群发邮件_JAVA邮件群发 - Java-Android-jwebee - BlogJava

      三.程序举例 1.首先是连接SMTP服务器,JAVAMAIL1.2不能实现SMTP服务的功能,但可以连接已有的SMTP服务器. //创建一个属性对象 Properties props=System.g ...

    4. 用java代码写邮件,已经测试成功!

      1.首先创建一个继承自javax.mail.Authenticator的具体类,重写里面的getPasswordAuthentication()方法: 2.创建Properties对象prop,pro ...

    5. 【Skill】解决 QQ 邮箱无法更改发信人名称问题

      问题 因为经常用 QQ 邮箱,但是前几天突然发现在网页版怎么都改不了 QQ 邮箱的发信人昵称了,后来才发现原来是 手机也登陆了 QQ 邮箱 的问题. 解决 在手机上的 QQ 邮箱 app 内更改自己的 ...

    6. python伪造邮件发件地址_Python3学习系列(四):编写属于自己的邮件伪造工具...

      timg.jpg (158.2 KB, 下载次数: 92) 2017-10-21 13:33 上传 前言: 相信有些人也看过一些渗透,邮件伪造然后钓鱼这个在渗透中也是经典技巧了,那么邮件伪造又是如何运 ...

    7. 一个很有趣的问题:那些用QQ邮箱发应聘邮件的人啊(附:怎样写一封得体的电子邮件)

      最近这个话题频频出现,而且讨论地越来越激烈,也越来越有趣.最开始是在人人网上当做笑口被大家广为扩散的那张图片,某大学在申请出国联系导师的时候使用******(数字)@qq.com的邮箱:之后又有了如下 ...

    8. 一个很有趣的问题:那些用QQ邮箱发应聘邮件的人啊(附:怎样写一封得体的电子邮件)...

      最近这个话题频频出现,而且讨论地越来越激烈,也越来越有趣.最开始是在人人网上当做笑口被大家广为扩散的那张图片,某大学在申请出国联系导师的时候使用******(数字)@qq.com的邮箱:之后又有了如下 ...

    9. 伪造邮件钓鱼,要知道的秘密!

      微信搜索逆锋起笔关注后回复编程pdf 领取编程大佬们所推荐的 23 种编程资料! 邮件钓鱼入门到入土 在大型企业边界安全做的越来越好的情况下,不管是 APT 攻击还是红蓝对抗演练,钓鱼和水坑攻击被越来 ...

    最新文章

    1. win8和win8.1动态绑定数据到ListView
    2. 基于TextRank的关键词提取算法
    3. 单机运行环境搭建之 --CentOS-6.4安装MySQL 5.6.10并修改MySQL的root用户密码
    4. 18行代码AC——PTA 二叉树的遍历 (10分)——解题报告
    5. android中的add方法,Android入门之addWindow
    6. 小爱同学生病了,网友集体表示理解:小爱同学好好休息
    7. php 采集网站关键字,php远程获取网站的关键字信息(并附:php判断字符串编码)...
    8. 信息安全-工控安全需求分析与安全保护工程
    9. android studio gradle下载
    10. Python 字符串去除空格的方法
    11. picgo+onedrive+Typora用onedrive当图床
    12. java 支付宝支付 demo_java开发支付宝支付详细流程_demo的运行
    13. SIwave仿真入门 | PI篇——封装PDN参数仿真
    14. whale 帷幄:营销自动化saas系统 saas营销系统是什么意思
    15. Python 将TXT格式转换为手机通讯录格式vcf
    16. python爬取分析深圳二手房房价
    17. 1157 最高分和最低分
    18. 对话框绘制完成消息_这样绘制cad施工图,提升效率至少3倍以上!
    19. 北大青鸟汉字注释机内码_北大青鸟11SF主机调试软件里面的,汉字注释,联动逻辑,总线对应,191层显注释,291层显注释...
    20. 数据治理工程师CDGA备考心得、时间安排、题库资源

    热门文章

    1. 文件无法上传到ftp服务器,无法上传文件到FTP服务器使用C++
    2. struct hdr_cmn
    3. Oracle 12c 读书笔记——筑梦之路
    4. 探讨STM32代码运行位置
    5. 微信引流软件哪里找?哪个引流软件比较可靠?
    6. 换了工作城市,社保和公积金的转移
    7. Pygame 官方文档 - Tutorials - 逐行的黑猩猩教程(Line By Line Chimp)
    8. 定制linux版本,定制属于自己的Linux操作系统
    9. BUUCTF not_the_same_3dsctf_2016
    10. Win10浏览器闪退问题解决(所有类型的浏览器都会发生闪退、包括chrome、firefox)