package com.wepull.pop3;
import java.net.Socket;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import com.wepull.smtp.*;
public class POPSession extends Thread {
/**
* 获得一次会话
*/
private Socket s;
/**
* 读取网络
*/
private BufferedReader br;
/**
* 写网络
*/
private PrintStream ps;
private String usermsg;
private String usermsgpath;
private Set set = new HashSet();
/**
* 标记要删除的邮件
*/
private Map<String ,String> map = new HashMap<String,String>();
/**
* 把第几封邮件和邮件名对应起来
*/
private Map<String ,String> filemap = new HashMap<String,String>();
/**
* @param s
* 初始化网络输入和网络输出流
*/
public POPSession(Socket s) {
this.s = s;
try {
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
ps = new PrintStream(s.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* (non-Javadoc)
*
* @see java.lang.Thread#run() 多线程的run方法
*/
@Override
public void run() {
ps.println("+OK POP3 server ready");
String line = "";
try {
while (!s.isClosed() && (line = br.readLine()) != null) {
System.out.println("客服端发送的命令:" + line);
/**
* 处理从客户端发来的命令
*/
doAction(line);
if ("quit".equalsIgnoreCase(line)) {
/**
* 处理quit命令(关闭流)
*/
doQuit();
break;
}
}
} catch (IOException e) {
if ("Connection reset".equalsIgnoreCase(e.getMessage())) {
} else {
e.printStackTrace();
}
} finally {
try {
br.close();
ps.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* @param line
* 处理从客户端发来的命令
*/
private void doAction(String line) {
String msg = line.split(" ")[0];
if ("user".equalsIgnoreCase(msg)) {
/**
* 处理user命令(验证用户是否合法)
*/
doUser(line);
} else if ("pass".equalsIgnoreCase(msg)) {
/**
* 处理pass命令(验证用户密码是否正确)
*/
doPass(line);
} else if ("stat".equalsIgnoreCase(msg)) {
/**
* 处理stat命令(列出用户邮件数和邮件大小)
*/
doStat();
}else if ("noop".equalsIgnoreCase(msg)) {
/**
* 处理top(n,m)命令(输出第n封邮件的前m行)
*/
ps.println("+OK");
} else if ("top".equalsIgnoreCase(msg)) {
/**
* 处理top(n,m)命令(输出第n封邮件的前m行)
*/
doTop(line);
} else if ("list".equalsIgnoreCase(msg)) {
/**
* 处理list命令(列出每封邮件的大小)
*/
doList(line);
} else if ("retr".equalsIgnoreCase(msg)) {
/**
* 处理retr命令(给客服端发送指定邮件的内容)
*/
doRetr(line);
} else if ("dele".equalsIgnoreCase(msg)) {
/**
* 处理dele命令(标记指定要删除的邮件)
*/
doDele(line);
} else if ("rest".equalsIgnoreCase(msg)) {
/**
* 处理rest命令(取消指定删除的邮件的标记)
*/
doRest(line);
} else if ("uidl".equalsIgnoreCase(msg)) {
/**
* 处理uidl命令(验证用户是否合法)
*/
doUidl();
}
}
/**
* 处理user命令(验证用户是否合法)
*/
private void doUser(String msg) {
usermsg = msg.split(" ")[1];
usermsgpath = Common.RPATH + "//" + usermsg;
// msg = Common.RPATH + "//" + msg;
// System.out.println();
System.out.println(usermsg);
CopeDeleteFile.copy(new File(Common.PATHS + "//" + usermsg), new File(
Common.RPATH));
usermsgpath += "//" + "revd";
System.out.println(usermsgpath);
File userfile = new File(usermsgpath);
File[] userfiles = userfile.listFiles();
int count = 0;
String sum="";
for (int i = 0; i < userfiles.length; i++) {
count++;
sum=""+count;
filemap.put(sum, userfiles[i].getAbsolutePath());
}
ps.println("+OK is a real hoopy frood");
}
/**
* 处理pass命令(验证用户密码是否正确)
*/
private void doPass(String msg) {
ps.println("+OK " + List() + " message(s) [" + total() + " byte(s)]");
}
/**
* 处理stat命令(列出用户邮件数和邮件大小)
*/
private void doStat() {
ps.println("+OK " + List() + " " + total());
}
private long total() {
// File userfile = new File(usermsgpath);
// File[] userfiles = userfile.listFiles();
// long count = 0;
// for (int i = 0; i < userfiles.length; i++) {
// count += userfiles[i].length();
// }
Set set = filemap.keySet();
long count = 0;
Iterator ita = set.iterator();
while (ita.hasNext()) {
String key = (String) ita.next();
String filepath = (String) filemap.get(key);
File messagefile = new File(filepath);
count += messagefile.length();
}
return count;
}
private int List() {
// File userfile = new File(usermsgpath);
// File[] userfiles = userfile.listFiles();
// return userfiles.length;
return filemap.size();
}
private void doList(String line) {
// File userfile = new File(usermsgpath);
// File[] userfiles = userfile.listFiles();
// int count = 0;
// for (int i = 0; i < userfiles.length; i++) {
// ps.println(++count + " " + userfiles[i].length());
// }
if(line.split(" ").length==2){
line =line.split(" ")[1];
String filepath = (String) filemap.get(line);
File messagefile = new File(filepath);
ps.println("+OK "+line+" "+ messagefile.length());
}else{
ps.println("+OK " + List() + " " + "messages");
Set set = filemap.keySet();
Iterator ita = set.iterator();
while (ita.hasNext()) {
String key = (String) ita.next();
String filepath = (String) filemap.get(key);
File messagefile = new File(filepath);
ps.println(key + " " + messagefile.length());
}
}
ps.println(".");
}
private void doRetr(String msg) {
msg = msg.split(" ")[1];
File file = new File((String) filemap.get(msg));
ps.println("+OK" + " " + file.length() + " " + "octets");
BufferedReader brfile = null;
try {
brfile = new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
String line = "";
while (true) {
line = brfile.readLine();
ps.println(line);
if (".".equalsIgnoreCase(line)) {
break;
}
}
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
brfile.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// File userfile = new File(usermsgpath);
// File[] userfiles = userfile.listFiles();
//
// ps.println("+OK" + " " + userfiles[Integer.parseInt(msg) -
// 1].length()
// + " " + "octets");
// BufferedReader brfile = null;
// try {
// brfile = new BufferedReader(new InputStreamReader(
// new FileInputStream(userfiles[Integer.parseInt(msg) - 1])));
// String line = "";
// while (true) {
// line = brfile.readLine();
// ps.println(line);
// if (".".equalsIgnoreCase(line)) {
// break;
// }
// }
// } catch (NumberFormatException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (FileNotFoundException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } finally {
// try {
// brfile.close();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
}
private void doDele(String msg) {
msg = msg.split(" ")[1];
// File userfile = new File(usermsgpath);
// File[] userfiles = userfile.listFiles();
// map.put(msg, userfiles[Integer.parseInt(msg) - 1].getAbsolutePath());
map.put(msg, filemap.get(msg));
filemap.remove(msg);
ps.println("+OK");
}
private void doRest(String msg) {
msg = msg.split(" ")[1];
// File userfile = new File(usermsgpath);
// File[] userfiles = userfile.listFiles();
filemap.put(msg, map.get(msg));
map.remove(msg);
ps.println("+ok");
}
private void doUidl() {
ps.println("+OK " + List() + " " + "messages");
Set set = filemap.keySet();
Iterator ita = set.iterator();
while (ita.hasNext()) {
String key = (String) ita.next();
String filepath = (String) filemap.get(key);
File messagefile = new File(filepath);
ps.println(key + " " + messagefile.getName());
System.out.println("come"+key+messagefile.getName());
}
// File userfile = new File(usermsgpath);
// File[] userfiles = userfile.listFiles();
// BufferedReader brfile = null;
// String line = "";
// for (int i = 0; i < userfiles.length; i++) {
// try {
// brfile = new BufferedReader(new InputStreamReader(
// new FileInputStream(userfiles[i])));
//
// line = brfile.readLine();
//
// } catch (FileNotFoundException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } finally {
// try {
// brfile.close();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// ps.println(++i + " " + line.split("<")[1].split(">")[0]);
// }
ps.println(".");
}
private void doTop(String msg) {
ps.println("+OK");
String n = "";
String m = "";
String[] str = msg.split(" ");
n = str[1];
File file = new File((String) filemap.get(n));
BufferedReader br = null;
String line = "";
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(
file)));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (str.length == 2) {
while (true) {
try {
line = br.readLine();
ps.println(line);
if ("".equalsIgnoreCase(line)) {
ps.println(".");
break;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} else if (str.length == 3) {
m = str[2];
int count = 0;
if ("0".equalsIgnoreCase(m)) {
try {
while ((line = br.readLine())!=null) {
ps.println(line);
ps.flush();
if ("".equalsIgnoreCase(line)) {
//ps.println();
br.close();
break;
}
}
ps.println(".");
} catch (IOException e) {
e.printStackTrace();
}
} else {
while (true) {
try {
count++;
line = br.readLine();
ps.println(line);
if (count == Integer.parseInt(m)) {
ps.println(".");
break;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
private void doQuit() {
ps.println("+OK dewey POP3 server signing off");
dodelefile();
}
private void dodelefile() {
Set set = map.keySet();
Iterator ita = set.iterator();
while (ita.hasNext()) {
String key = (String) ita.next();
String filename = (String) map.get(key);
File deltefile = new File(filename);
deltefile.delete();
}
}
}