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

📄 pop3session.java

📁 邮件服务器
💻 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 + -