⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 email.java

📁 这个程序实现了在网络上截获邮件数据并还原邮件。仅供学习参考
💻 JAVA
字号:
package Emailcap;
import java.io.*;
import sun.misc.BASE64Decoder;
import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;

public class Email
  {
  	public static void main (String args[])
  	  {
  	  	JFrame.setDefaultLookAndFeelDecorated(true);
  	    JFrame f=new FrameIO();
  	    f.setResizable(false);
  	  }
  }
  
class FrameIO extends JFrame implements ActionListener
  {
  	JButton cap;
  	JButton rvt;
  	JButton ext;
  	JButton abt;
  	JPanel inputpanel;
  	JPanel prompt;
  	JScrollPane outputpanel;
    JLabel info;
    JTextArea outputText;
    JOptionPane op;
    BevelBorder border;
    Font myfont;
    
    FrameIO()
      { 
        super("E-mail截获还原工具");
        border = new BevelBorder(BevelBorder.LOWERED);      
        myfont = new Font("宋体",Font.PLAIN,12);
        op = new JOptionPane();
        
  	    info = new JLabel(" ");
  	    info.setFont(myfont);
  	    
  	    outputText = new JTextArea(15,45);
  	    outputText.setLineWrap(true);
  	    
        cap = new JButton("截获");
        cap.setFont(myfont);
        cap.addActionListener(this); 
               
  	    rvt = new JButton("还原");
  	    rvt.setFont(myfont);
        rvt.addActionListener(this);
        
        abt = new JButton("关于");
        abt.setFont(myfont);
        abt.addActionListener(this);
        
  	    ext = new JButton("退出");
        ext.setFont(myfont);
  	    ext.addActionListener(this);

  	    inputpanel = new JPanel();
        inputpanel.setLayout(new FlowLayout());
        inputpanel.setBorder(BorderFactory.createTitledBorder(""));
        inputpanel.add(cap);
        inputpanel.add(rvt);
        inputpanel.add(abt);
        inputpanel.add(ext);  
              
        prompt = new JPanel();
        prompt.setBorder(new TitledBorder( border,"",TitledBorder.LEFT,TitledBorder.ABOVE_TOP));
        prompt.add(info);
        prompt.setFont(myfont);
        
        outputpanel = new JScrollPane(outputText);
        outputpanel.setBorder(BorderFactory.createTitledBorder(""));
        outputpanel.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
          
        getContentPane().setLayout(new BorderLayout(2,2));
        getContentPane().add(inputpanel,"North");
        getContentPane().add(prompt,"Center");
        getContentPane().add(outputpanel,"South");
        
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e){
              System.exit(0);}});
              
        setSize(540,408);
        show();
      }	

    public void actionPerformed(ActionEvent e)
      {
      	if(e.getSource()==cap)                           //截获
      	  {
      	  	if(e.getActionCommand()=="截获")
      	  	  {
      	  	  	cap.setLabel("暂停");
      	  	    outputText.setText("开始截获数据");
      	  	    info.setText("已截获1个数据包");
      	      }
      	    else if(e.getActionCommand()=="暂停")
      	      {
      	      	cap.setLabel("继续");
      	      	outputText.setText("已暂停");
      	  	    info.setText("已暂停截获");
      	      }
      	    else if(e.getActionCommand()=="继续")        
      	      {
      	      	cap.setLabel("暂停");
      	      	outputText.setText("以截获N个数据包");     	      	
      	  	    info.setText("已继续截获");
      	      }
          }
      	else if(e.getSource()==rvt)                      //还原
      	  {
            String tempr="";
            //读文件
            try
              {
              	String sl;
              	BufferedReader in = new BufferedReader(new FileReader("fin.txt"));
              	sl=in.readLine();
              	while(sl!=null)
              	  {
              	  	tempr=tempr+sl;
              	  	sl=in.readLine();
              	  }
              	in.close();
              }catch(IOException e2)
                 {
                 	System.out.println(e2); 
                 }
            System.out.print(tempr);
                               
      	    revert Revert = new revert(tempr);  
      	    outputText.setText(Revert.toString());
      	    
      	    //写文件
      	    try 
              { 
                byte[] bt =Revert.toString().getBytes();
                FileOutputStream finput=new FileOutputStream("fout.txt"); 
                finput.write(bt);
                finput.close();
                info.setText("文件已保存至'fout.txt'");
              }catch(IOException e3) 
                 { 
                   System.out.println(e3); 
                 }
          }
        else if(e.getSource()==abt)                      //关于
          {
          	JFrame f2=new about();
          	f2.setResizable(false);
          }
      	else if(e.getSource()==ext)                      //退出
      	  {
            UIManager.put("Button.font",myfont);
            UIManager.put("Label.font",myfont); 
      	  	Object[] options = { "确定", "取消" };
      	  	int response=op.showOptionDialog(this,"确定关闭该程序吗?", "确定关闭",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE,null, options, options[1]);
      	  	if(response==0)
      	      System.exit(0);
          }
      }
  }
  
class about extends JFrame
  {
    JTextArea groupinfo;  
    about()
      {
        super("关于本程序");
        groupinfo = new JTextArea(300,200);
        groupinfo.setText("邮件截获");
        getContentPane().add(groupinfo,"North");
        groupinfo.setEditable(false);
        setSize(300,200);
        show();
      }	
  }
  
class capture
  {
    
  }
  
class revert
  {
  	    //String date,from,to,cc,bc,subject,cte;
    String input="";
    String str="";
    String matter="";
    String head="";
    String output="=================================邮件头==================================";

    revert(String t)
      {
      	input=t;
      	//c1保存邮件的头开始部分的位置
      	//c2保存邮件的头结束部分的位置
      	//c3保存邮件内容结束部分的位置
      	int c1=57+input.indexOf("3C 43 52 3E 3C 4C 46 3E 2E 3C 43 52 3E 3C 4C 46 3E 0D 0A");
      	int c2=input.indexOf("0D 0A 0D 0A ",c1);
      	int c3=input.indexOf("0D 0A 2E 0D 0A",c2);
      	for(int i=c1;i<c2;i++)
      	  {
      	    head=head+input.charAt(i);            //head为邮件的头部分
      	  }

      	for(int i=c2+12;i<c3;i++)
      	  {
      	    matter=matter+input.charAt(i);        //matter为邮件的内容部分
      	  }     	 
        matter=matter.replaceAll("0D 0A ","");    //去掉内容部分的回车换行
        head=HEX2ASCII(head);                     //将16进制转换为ASCII码
        matter=HEX2ASCII(matter);
        //output=head+"\n==\n"+matter;
        int ch=27+head.indexOf("Content-Transfer-Encoding: ");
        input="";
        for(int i=ch;i<head.length();i++)
          input=input+head.charAt(i); 
                 
        output=output+head+"\n================================邮件内容=================================\n";
      	if (input.startsWith("base64"))
      	  output=output+ASCII2BASE64(matter);
      	else if (input.startsWith("7bit"))
      	  {}
      	else
      	  output=output+"暂时只支持Base64和ASCII两种编码,请谅解!";
      }	
      
    //转ASCII码
    static String HEX2ASCII(String hex)
  	  {
  	  	int counter=0;
  	  	String out="";
  	  	
  	  	for(int i=0;i<hex.length();i++)  //求字符串中有几个空格
  	  	  {
  	  	    char t;
  	  	    t=hex.charAt(i);
  	  	    if(t==' '|t==' ')
  	  	      counter++;	
  	  	  }
  	  	
  	  	int temp_len=(hex.length()-counter)/2;           //不包含空格后二位十六进制的个数
  	  	int temp[]=new int[temp_len];   	  	
                     //十六进制数
  	  	for(int i=0;i<hex.length();i+=3)
  	  	  {
  	  	    int n1=HextoDec(String.valueOf(hex.charAt(i)));
  	  	    int n2=HextoDec(String.valueOf(hex.charAt(i+1)));
            temp[i/3]=n1*16+n2;                          //转换成10进制
            char asc;                                    //ASC字符
            asc=(char)temp[i/3];
            out=out+asc;
  	  	  }          
  	  	return out;          
      }

    //转16进制
    static int HextoDec(String h)
      {
      	     if(h.equals("A"))  return 10;
      	else if(h.equals("B"))  return 11;
      	else if(h.equals("C"))  return 12;
      	else if(h.equals("D"))  return 13;
      	else if(h.equals("E"))  return 14;
      	else if(h.equals("F"))  return 15;
      	else return Integer.parseInt(h);	
      }	  	
      
    //BASE64解码
    static String ASCII2BASE64(String str)
  	  {
  	    return getFromBASE64(str);
  	  }
  	  
    public static String getFromBASE64(String s) //BASE54 解码
      { 
        if (s == null) 
          return null;
          
        BASE64Decoder decoder = new BASE64Decoder(); 
        try { 
          byte[] b = decoder.decodeBuffer(s);
          return new String(b); 
            }
        catch (Exception e) { return null; } 
      } 
    public String toString()
      {
      	return output;
      }
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -