您的位置:首页 > 编程语言 > Java开发

用java实现的邮件系统三(收取邮件服务器)

2010-08-31 22:15 288 查看
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();
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: