📄 email.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 + -