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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java实现伪造邮件发信人

發(fā)布時(shí)間:2023/12/20 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java实现伪造邮件发信人 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java實(shí)現(xiàn)偽造郵件發(fā)信人

    • 關(guān)鍵詞
    • 效果預(yù)覽
    • 背景說(shuō)明
      • 作業(yè)背景
      • 環(huán)境
    • 參考說(shuō)明
    • 實(shí)現(xiàn)代碼
    • 代碼解析及輸出
    • 測(cè)試及避坑
    • 啟示
    • 拓展閱讀

關(guān)鍵詞

Java、郵件、SMTP、偽造、發(fā)信人、郵箱、由……代發(fā)

效果預(yù)覽

背景說(shuō)明

作業(yè)背景

最近在做設(shè)計(jì),設(shè)計(jì)里涉及到郵件通知功能,但是直接使用自己個(gè)人郵箱發(fā)送的話(huà)顯得那啥一點(diǎn),并且在Python SMTP發(fā)送郵件里發(fā)現(xiàn)是可以偽造郵件的,故打算把自己的郵箱“打扮”一下,將自己的設(shè)計(jì)模擬的更真實(shí)一點(diǎn)。可不要拿來(lái)做不好的事情哦

環(huán)境

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

參考說(shuō)明

看了不少做JavaEmail的文章,基本上都是采用javax.mail.jar包做的,但是無(wú)法實(shí)現(xiàn)偽造發(fā)信人(這里的發(fā)信人指的是郵箱,這個(gè)包昵稱(chēng)是可以指定的。可能之前的setSender可以,但是我沒(méi)用過(guò),我下載的1.6.2版本的,MimeMessage對(duì)象沒(méi)有setSender方法),主要參考了兩篇文章(后面給出),都寫(xiě)的很好,我寫(xiě)這篇文章的目的是讓朋友們多一個(gè)維度參考。下面是我參考的文章:
1.JAVA實(shí)現(xiàn)SMTP郵件發(fā)送
2.java發(fā)送郵件的兩種實(shí)現(xiàn)方式(包括如何偽造發(fā)件人及其原理)
對(duì)了還有一篇:Java8 Base64 | 菜鳥(niǎo)教程

實(shí)現(xiàn)代碼

喜歡圖片的朋友看這個(gè),喜歡代碼的在后面

源代碼:

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位授權(quán)密碼String realAddressee = "receiver@xxx.com"; //<- 收件人郵箱String smtpServer = "smtp.163.com"; //<- smtp服務(wù)器地址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);//發(fā)送'helo'命令, 讀取輸出pw.println("helo " + "Stephen");System.out.println(bfr.readLine());//發(fā)送'auth login'命令pw.println("auth login");System.out.println(bfr.readLine());pw.println(b64Username); // 用戶(hù)名base64System.out.println(bfr.readLine());pw.println(b64Password); // 授權(quán)密碼base64System.out.println(bfr.readLine());//設(shè)置'mail from' 和 'rcpt to'pw.println("mail from:<"+loginUsername+">");System.out.println(bfr.readLine());pw.println("rcpt to:<" + realAddressee + ">");System.out.println(bfr.readLine());//設(shè)置'data'pw.println("data");System.out.println(bfr.readLine());/* 正文主體 */pw.println("subject:" + "主題什么的隨隨便便就好了"); // 主題// “偽造”發(fā)信人pw.println("from:" + "一方巨鱷 <xxxxxx@163.com>"); //格式:昵稱(chēng) <顯示的發(fā)件人郵箱>(偽發(fā)件人)pw.println("to:" + "管理員 <" + realAddressee + ">"); //指定收件人名稱(chēng),有的smtp服務(wù)器可以把收件人顯示的郵箱也改了// 這里smtp.163.com會(huì)"554 DT:SPM"退信pw.println("Content-Type:text/html;charset=\"utf-8\""); // 這里采用的是html類(lèi)型,可換為純文本plain類(lèi)型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("."); //內(nèi)容部分結(jié)束System.out.println(bfr.readLine());//發(fā)送結(jié)束,退出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(),前者主要是發(fā)命令的,而后者則是接收響應(yīng)的。模擬Telnet客戶(hù)端發(fā)郵件[1]。

輸出

郵件效果在開(kāi)頭已給出,那是我用學(xué)校郵箱的smtp服務(wù)器發(fā)的,改了收件人顯示的信息,沒(méi)有被退信。

測(cè)試及避坑

  • 我在使用smtp.163.com服務(wù)器的情況下在to:命令之后接假收件人時(shí)遇到這個(gè)
    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
    點(diǎn)進(jìn)去看,是“退信代碼說(shuō)明”

    解決辦法:把圖第49行的收件人改回真實(shí)收件人郵箱(上面的已改,原來(lái)的代碼是pw.println("to:" + "管理員 <xxxxxx@qq.com>");實(shí)現(xiàn)的就是效果圖)就可以了。

  • 測(cè)試139郵箱時(shí),一直報(bào)550 2f015ebe0b3f97a-4e9fd Mail rejected,ta沒(méi)有給授權(quán)碼,就是使用的登錄密碼,我嘗試的所有辦法都無(wú)法發(fā)郵件(無(wú)論是否偽造)

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

  • 測(cè)試sina郵箱,sina郵箱是要將mail from和from進(jìn)行匹配的,也就是無(wú)法通過(guò)這個(gè)方法進(jìn)行偽造,有知道怎么做的也可以提醒我謝謝。

    解決辦法:我無(wú)。

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

  • 目前就測(cè)試了這幾個(gè)郵箱服務(wù)商,總的來(lái)說(shuō)就qq、163和126可以偽造發(fā)信人,這幾個(gè)郵箱開(kāi)啟SMTP服務(wù)的話(huà)短信是自己發(fā)的短信費(fèi)是自己掏的,所以寫(xiě)這篇文章是含有成本在里面的(含金量杠杠的🐕)。

  • 啟示

    收到郵件注意一下郵件內(nèi)容,奇怪的發(fā)信人奇怪的郵箱注意查看信頭,信頭中的Sender一般即為真實(shí)發(fā)信人,使用一些比較知名的郵箱服務(wù)平臺(tái)等,小平臺(tái)的郵箱甚至某些有名的平臺(tái)如某浪的郵箱可能還不會(huì)顯示由……代發(fā),比如說(shuō)我測(cè)試過(guò)的臨時(shí)郵箱查看偽造的郵件就沒(méi)有顯示真實(shí)郵件地址,這得注意信頭的Sender了。

    拓展閱讀

    1.SMTP協(xié)議詳解
    2.廖雪峰Python-電子郵件-SMTP發(fā)送郵件

    總結(jié)

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

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。