📄 pop3session.java
字号:
package com.softeem.mail.pop3;
import java.io.*;
import java.net.*;
import java.util.*;
import com.softeem.mail.Constants;
public class POP3Session extends Thread {
private static final String CMD_OK = "+OK";
private static final String CMD_ERR = "-ERR";
private static final String CMD_USER = "USER";
private static final String CMD_PASS = "PASS";
private static final String CMD_LIST = "LIST";
private static final String CMD_STAT = "STAT";
private static final String CMD_RETR = "RETR";
private static final String CMD_DELE = "DELE";
private static final String CMD_QUIT = "QUIT";
private static final String CMD_UIDL = "UIDL";
private static final String PATH = "F:/mail/";//用户路径的父路径
private int state;//状态码,判断POP3命令的执行顺序
private static Properties propUsername = new Properties();//用来加载用户属性文件
private Socket socket;////连接客户端
private BufferedReader br;////读网络流
private BufferedReader fileBR;//读文件流
private PrintWriter pw;//写网络流
private String username;//收件人
private String line;//记录所读的字符串
private File mailPath;//收件人收件箱的路径
private File[] files;//收件箱中的文件
private boolean flag;//判断用户或密码是否正确
private List<File> deleList=new ArrayList<File>();;//删除的文件集
public POP3Session(Socket socket) {
super();
this.socket = socket;
}
//加载属性文件
static {
try {
InputStream is = new FileInputStream(Constants.USER_NAME);
propUsername.load(is);
is.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run() {
try {
socket.setSoTimeout(Constants.SOCKET_TIMEOUT);
br = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
pw = new PrintWriter(socket.getOutputStream());
sendWelcomeMessage();
while (parseCommand(readCommandLine())) {
;
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
br.close();
pw.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private boolean parseCommand(String command) {
boolean returnValue = true;
System.out.println("进入命令----->" + command + " state----->" + state);
if (command == null) {
return false;
}
String argument = null;
int spaceIndex = command.indexOf(" ");
if (spaceIndex > 0) {
argument = command.substring(spaceIndex + 1);
command = command.substring(0, spaceIndex);
}
if (command.equalsIgnoreCase(CMD_USER) && state == 0) {
if (doUser(argument)) {
state++;
}
} else if (command.equalsIgnoreCase(CMD_PASS) && state == 1) {
if (doPass(argument)) {
state++;
}
} else if (command.equalsIgnoreCase(CMD_STAT) && state > 1) {
doStat();
} else if (command.equalsIgnoreCase(CMD_LIST) && state > 1) {
doList();
} else if (command.equalsIgnoreCase(CMD_RETR) && state > 1) {
doRetr(argument);
} else if (command.equalsIgnoreCase(CMD_UIDL) && state > 1) {
doUIDL(argument);
}else if (command.equalsIgnoreCase(CMD_DELE) && state > 1) {
doDELE(argument);
}else if (command.equalsIgnoreCase(CMD_QUIT)) {
doQuit();
returnValue = false;
} else {
writeMessage(CMD_ERR + " " + "命令输入错误,请重新输入!");
}
return returnValue;
}
private void doUIDL(String argument) {
// TODO Auto-generated method stub
files = mailPath.listFiles();
if(argument==null){
listReceiveFile();
for (int i = 0; i < files.length; i++) {
writeMessage((i + 1) + " " + files[i].getName());
System.out.println((i + 1) + " " + files[i].getName());
}
writeMessage(".");
}else{
int b =Integer.parseInt(argument);
if(b>files.length){
writeMessage("-ERR no such message, only 2 messages in maildrop ");
}else{
writeMessage("+OK "+b+" "+files[b-1].getName());
writeMessage(".");
}
}
}
private boolean doUser(String argument) {
flag = false;
if (argument == null) {
writeMessage(CMD_ERR + " " + "您没有输入用户名!");
} else {
if (propUsername.containsKey(argument.trim())) {
flag = true;
username = argument.trim();
System.out.println(username);
mailPath = new File(PATH + "/" + username + "/" + "receive");
writeMessage(CMD_OK + " " + "请输入密码:");
} else {
writeMessage(CMD_ERR + " " + "用户名不存在,请重新输入!");
}
}
return flag;
}
private boolean doPass(String password) {
flag = false;
if (password == null) {
writeMessage(CMD_ERR + " " + "您没有输入密码!");
} else {
if (password.equals(propUsername.getProperty(username))) {
flag = true;
System.out.println(password);
writeMessage(CMD_OK + " " + "开始对邮件操作...");
} else {
writeMessage(CMD_ERR + " " + "您输入的密码错误,请重试!");
}
}
return flag;
}
private void doStat() {
files = mailPath.listFiles();
System.out.println("列出收件箱概括信息");
listReceiveFile();
}
private void listReceiveFile() {
files = mailPath.listFiles();
int filesSize = 0;
for (int i = 0; i < files.length; i++) {
filesSize += files[i].length();
}
System.out.println("所收邮件封数:" + files.length);
System.out.println("收件箱大小:" + filesSize);
writeMessage(CMD_OK + " " + files.length + " " + filesSize);
}
private void doList() {
files = mailPath.listFiles();
System.out.println("列出收件箱详细信息");
listReceiveFile();
for (int i = 0; i < files.length; i++) {
writeMessage((i + 1) + " " + files[i].length());
System.out.println((i + 1) + " " + files[i].length());
}
writeMessage(".");
}
private void doRetr(String argument) {
files = mailPath.listFiles();
listReceiveFile();
try {
fileBR = new BufferedReader(new InputStreamReader(
new FileInputStream(
files[Integer.valueOf(argument.trim()) - 1])));
while ((line = fileBR.readLine()) != null) {
writeMessage(line);
}
writeMessage(".");
fileBR.close();
} 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();
}
}
private void doDELE(String item) {
System.out.println(item);
files = mailPath.listFiles();
deleList.add(files[Integer.parseInt(item)-1]);
writeMessage(CMD_OK + " " + "删除成功!");
}
private void doQuit() {
for(int i=0;i<deleList.size();i++) {
File file=deleList.get(i);
file.delete();
}
writeMessage(CMD_OK + " " + "bye-bye");
}
private String readCommandLine() {
for (;;) {
String commandLine;
try {
commandLine = br.readLine();
if (commandLine != null) {
commandLine = commandLine.trim();
}
return commandLine;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private boolean sendWelcomeMessage() {
StringBuffer sb = new StringBuffer();
try {
sb.append(CMD_OK).append(" ").append(InetAddress.getLocalHost())
.append(" ").append("(").append(
Constants.VERSION_MAILSERVER).append(")").append(
" ").append(Constants.SERVER_NAME);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
writeMessage(sb.toString());
return true;
}
private void writeMessage(String message) {
pw.println(message);
pw.flush();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -