日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java实现伪造邮件发信人

發布時間:2023/12/20 java 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java实现伪造邮件发信人 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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服務器發的,改了收件人顯示的信息,沒有被退信。

測試及避坑

  • 我在使用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>");實現的就是效果圖)就可以了。

  • 測試139郵箱時,一直報550 2f015ebe0b3f97a-4e9fd Mail rejected,ta沒有給授權碼,就是使用的登錄密碼,我嘗試的所有辦法都無法發郵件(無論是否偽造)

    解決辦法:暫無,勸君慎用139,或者有解決的踢我一腳謝謝

  • 測試sina郵箱,sina郵箱是要將mail from和from進行匹配的,也就是無法通過這個方法進行偽造,有知道怎么做的也可以提醒我謝謝。

    解決辦法:我無。

  • 測試126郵箱,給qq郵箱發郵件,第一次可以偽造(顯示代發,并且有一段特殊信息回顯),之后就是顯示真實的郵箱地址。

  • 目前就測試了這幾個郵箱服務商,總的來說就qq、163和126可以偽造發信人,這幾個郵箱開啟SMTP服務的話短信是自己發的短信費是自己掏的,所以寫這篇文章是含有成本在里面的(含金量杠杠的🐕)。

  • 啟示

    收到郵件注意一下郵件內容,奇怪的發信人奇怪的郵箱注意查看信頭,信頭中的Sender一般即為真實發信人,使用一些比較知名的郵箱服務平臺等,小平臺的郵箱甚至某些有名的平臺如某浪的郵箱可能還不會顯示由……代發,比如說我測試過的臨時郵箱查看偽造的郵件就沒有顯示真實郵件地址,這得注意信頭的Sender了。

    拓展閱讀

    1.SMTP協議詳解
    2.廖雪峰Python-電子郵件-SMTP發送郵件

    總結

    以上是生活随笔為你收集整理的Java实现伪造邮件发信人的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。