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

📄 mailmanager.java

📁 一些学习java的练习作业 新手向参考资料 第四部分
💻 JAVA
字号:
// 儊乕儖憲庴怣僾儘僌儔儉MMGui.java梡僼傽僀儖MailManager.java
// 偙偺僼傽僀儖偵偼,儊乕儖偺憲庴怣婡擻傪幚尰偡傞僋儔僗偑奿擺偝傟偰偄傑偡
// MMGui.java偺僐儞僷僀儖偵偼,MailManager.java僼傽僀儖偑昁梫偱偡

// 儔僀僽儔儕偺棙梡
import java.util.*;
import java.io.*;
import java.net.*;

// MailManager僋儔僗
public class MailManager {
	// MailManager偺婡擻傪娔帇偡傞debug婡擻傪巊偆応崌偵偼
	// 曄悢debug傪true偵僙僢僩偟偰偔偩偝偄
	static boolean debug = true;

	// 儊乕儖憲庴怣偵昁梫側僆僽僕僃僋僩偺愰尵
	Properties property;
	String home;
	String cf;
	File mailDir;
	String fsep;

	String username;
	String password;
	String fromString;

	String popServ;
	String smtpServ;

	boolean keepmail = false;
	String codeNet;
	String codeFile;

	int lastMail_NO = 0;

	// 僐儞僗僩儔僋僞
	// 僒乕僶偺愝掕傗儐乕僓柤偺愝掕側偳,儊乕儖僋儔僀傾儞僩偱昁梫偲側傞
	// 奺庬偺愝掕傪峴偄傑偡
	public MailManager ()
	{
		Properties prop = System.getProperties();
		home = prop.getProperty("user.home");
		fsep = prop.getProperty("file.separator");
		cf = home + fsep + "jet.cf";

		property = new Properties();
		try {
			property.load(new FileInputStream(cf));
		}catch (FileNotFoundException ex){
			System.err.println("file not found:" + cf);
			System.exit(1);
		}catch (IOException ex){
			ex.printStackTrace();
			System.exit(1);
		}
		username = property.getProperty("username");
		password = property.getProperty("password");
		popServ = property.getProperty("popserver");
		smtpServ = property.getProperty("smtpserver");
		fromString = property.getProperty("from");
		if (fromString == null){
			fromString = username + "@" + popServ;
		}
		String dummy = property.getProperty("keepmail");
		keepmail =
			((dummy == null)? false:
			(("off".equalsIgnoreCase(dummy))? false: true));
		codeNet = property.getProperty("code.net", "JIS");
		codeFile = property.getProperty("code.file", "SJIS");

		String propMailDir = property.getProperty("maildir");
		mailDir = new File(propMailDir);
		if (!mailDir.isAbsolute()){
			mailDir = new File(home + fsep + propMailDir);
		}

		if (mailDir.exists()){
			if (!mailDir.isDirectory()){
				System.err.println("not a directory:"
					+ mailDir.toString());
				System.exit(1);
			}
		}else{
			System.err.println("not found mail directory:"
				+ mailDir.toString());
			System.err.println("and create it.");
			mailDir.mkdir();
		}

		String[] files = mailDir.list();
		for (int i = 0; i < files.length; i++){
			try {
				int num = Integer.parseInt(files[i]);
				if (lastMail_NO < num){
					lastMail_NO = num;
				}
			}catch (NumberFormatException ex){
				;
			}
		}
	}

	// list儊僜僢僪
	// 庴怣嵪傒偺儊乕儖堦棗傪昞帵偟傑偡
	public String[] list(){
		Vector v = new Vector();
		for (int i = 1; i <= lastMail_NO; i++){
			try {
				if (debug){
					System.out.println("MM.list: scan file " + i);
				}
				Mail mail = new Mail(i);
				String space10 = "          ";

				String from = mail.from + space10 + space10;
				from = from.substring(0, 20);
				String subject =
					mail.subject + space10 + space10 + space10 + space10;
				subject = subject.substring(0, 40);
				String num = i + space10;
				v.addElement(
					num.substring(0, 8) + "[" + from + "]" + subject);
			}catch (FileNotFoundException ex){
			}
		}
		String[] res = new String[v.size()];
		v.copyInto(res);
		return res;
	}

	// readMail儊僜僢僪
	// 儊僢僙乕僕偺杮暥傪曉偟傑偡
	public String readMail(int i){
		try {
			Mail mail = new Mail(i);
			return mail.message;
		}catch (FileNotFoundException ex){
			return null;
		}
	}

	// sendmail儊僜僢僪
	// SmtpClient僋儔僗偺僆僽僕僃僋僩傪巊偭偰儊乕儖傪憲怣偟傑偡
	public void sendmail(
		String to, String subject, String message){
		SmtpClient smtp = new SmtpClient(smtpServ, codeNet);
		String[] dummy = new String[1];
		dummy[0] = to;
		smtp.sendmail(fromString, dummy, subject, message);
	}

	// getmail儊僜僢僪
	// PopClient僋儔僗偺僆僽僕僃僋僩傪巊偭偰pop 僒乕僶偐傜儊乕儖傪庴怣偟傑偡
	public int getmail(){
		int n = 0;
		PopClient pop = new PopClient(popServ, username, password,
									  codeNet);
		pop.login();
		String res = pop.stat();
		StringTokenizer st = new StringTokenizer(res);
		if ("+OK".equals(st.nextToken())){
			n = Integer.parseInt(st.nextToken());
			for (int i = 1; i <= n; i++){
				try {
					new Mail(pop.retr(i));
					if (!keepmail){
					pop.dele(i);
				}
				}catch (IOException ex){
					ex.printStackTrace();
					System.exit(1);
				}
			}
		}
		pop.quit();
		return n;
	}

	// Mail僋儔僗
	// 儊乕儖娗棟偺偨傔偺婡擻傪採嫙偟傑偡
	public class Mail {
		String message;

		String subject;
		String to;
		String from;
		String replyto;
		File file;

		// 僐儞僗僩儔僋僞
		// 儊僢僙乕僕傪堷悢偲偟偰Mail僋儔僗偺僆僽僕僃僋僩傪嶌惉偟傑偡
		// pop3 僒乕僶偐傜庴怣偟偨儊僢僙乕僕偺張棟偵巊偄傑偡
		Mail(String msg) throws IOException{
			message = msg;
			lastMail_NO++;
			file = new File(mailDir.getPath() + fsep +
							lastMail_NO);
			PrintWriter mail =
				new PrintWriter(new OutputStreamWriter
							(new FileOutputStream(file), codeFile));
			mail.print(msg);
			mail.flush();
			mail.close();
			parse();
		}

		// 僐儞僗僩儔僋僞
		// 庴怣嵪傒僼傽僀儖偵懳墳偡傞斣崋傪堷悢偲偟偰
		// Mail僋儔僗偺僆僽僕僃僋僩傪嶌惉偟傑偡
		Mail(int i) throws FileNotFoundException{
			try {
				file = new File(mailDir.getPath() + fsep + i);
				InputStreamReader mailIn =
					new InputStreamReader(new FileInputStream(file),
										  codeFile);
				char[] cbuf = new char[1024];
				StringBuffer sb = new StringBuffer();
				while (true){
					int n = mailIn.read(cbuf, 0, 1024);
					if (n == -1){
						break;
					}
					sb.append(cbuf, 0, n);
				}
				message = sb.toString();
			}catch (IOException ex){
				if (ex instanceof FileNotFoundException){
					throw (FileNotFoundException) ex;
				}else{
					ex.printStackTrace();
					System.exit(1);
				}
			}
			parse();
		}

		// parse儊僜僢僪
		// parseHeader儊僜僢僪傪梡偄偰儊僢僙乕僕偺僿僢僟傪夝愅偟傑偡
		void parse(){
			from = parseHeader("From:");
			to = parseHeader("To:");
			subject = parseHeader("Subject:");
			replyto = parseHeader("Reply-To:");
		}

		// parseHeader儊僜僢僪
		// 儊僢僙乕僕偺拞偐傜巜掕偝傟偨僿僢僟偺忣曬傪扵偟弌偟傑偡
		String parseHeader(String header){
			int begin = 0;
			int end = 0;
			for (end = message.indexOf("\n", begin); end >= 0 &&
				 begin >= 0; begin = end + 1, end
				 = message.indexOf("\n", begin)){
				String line = message.substring(begin, end);
				if ("".equals(line)){
					break;
				}
				if (line.startsWith(header))
					return line.substring(header.length());
			}
			return null;
		}
	}
}

// NetClient僋儔僗
// SmtpClient僋儔僗偲PopClient僋儔僗偺嫟捠晹暘傪梌偊傑偡
class NetClient {
	static boolean debug = MailManager.debug;

	Socket s;
	BufferedReader from_server;
	PrintWriter to_server;
	String encode = "JIS";

	// 僐儞僗僩儔僋僞
	// 暥帤僐乕僪傪巜掕偡傞応崌
	NetClient(String enc){
		encode = enc;

		if (debug) {
			System.out.println("NetClient.encode:" + encode);
		}
	}

	// 僐儞僗僩儔僋僞
	// 暥帤僐乕僪偑僨僼僅儖僩偺応崌
	NetClient(){
		this("JIS");
	}

	// connect儊僜僢僪
	// 僒乕僶偲偺愙懕梡僜働僢僩偲僗僩儕乕儉傪嶌惉偟傑偡
	public void connect(String server, int port){
		try {
			s = new Socket(server, port);
			from_server = new BufferedReader(
			new InputStreamReader(s.getInputStream(),encode));
			to_server = new PrintWriter(
			new OutputStreamWriter(s.getOutputStream(),encode));
		}catch (IOException e){
			e.printStackTrace();
			System.exit(1);
		}
	}

	// disconnect儊僜僢僪
	// 僒乕僶偲偺愙懕傪愗抐偟傑偡
	public void disconnect(){
		try {
			s.close();
		}catch (IOException e){
			e.printStackTrace();
			System.exit(1);
		}
	}

	// receive儊僜僢僪
	// 僒乕僶偐傜峴傪撉傒庢傝傑偡
	public String receive(){
		String res = null;
		try {
			res = from_server.readLine();
			if (debug) {
				System.out.println("RECV> " + res);
			}
		}catch (IOException e){
			e.printStackTrace();
			System.exit(1);
		}
		return res;
	}

	// send儊僜僢僪
	// 僒乕僶偵侾峴僨乕僞傪憲傝傑偡
	public void send(String msg){
		to_server.println(msg);
		to_server.flush();
		if (debug) {
			System.out.println("SEND> " + msg);
		}
	}
}

// PopClient僋儔僗
// NetClient傪宲彸偟偰,Pop3 庴怣婡擻傪幚尰偟傑偡
class PopClient extends NetClient{
	static final int POP3_PORT = 110;
	String server;
	String username;
	String password;
	boolean loginFlag = false;

	// 僐儞僗僩儔僋僞
	// 庴怣偵昁梫側忣曬傪僙僢僩偟傑偡
	PopClient(String serv, String user, String pass, String enc){
		super(enc);
		username = user;
		password = pass;
		server = serv;
	}

	// login儊僜僢僪
	// POP3 僒乕僶偵login偟傑偡
	public boolean login(){
		if (loginFlag)
			return loginFlag;
		connect(server, POP3_PORT);
		String res = receive();
		if (res.startsWith("-ERR")){
			System.err.println("connect failed.:" + res);
			disconnect();
			return false;
		}
		send("user " + username);
		res = receive();
		if (res.startsWith("-ERR")){
			System.err.println("login user failed.:" + res);
			disconnect();
			return false;
		}
		send("pass " + password);
		res = receive();
		if (res.startsWith("-ERR")){
			System.err.println("login pass failed.:" + res);
			disconnect();
			return false;
		}
		return loginFlag = true;
	}

	// stat儊僜僢僪
	// 僒乕僶偵stat僐儅儞僪傪憲晅偟傑偡
	public String stat(){
		send("stat");
		String res = "";
		res = receive();
		if (res.startsWith("-ERR")){
			System.err.println(res);
		}
		return res;
	}

	// list儊僜僢僪
	// 僒乕僶偵list僐儅儞僪傪憲晅偟傑偡
	public String list(){
		String res = "";
		send("list");
		String line = receive();
		if (line.startsWith("-ERR")){
			System.err.println(line);
			res = line;
		}else{
		while (true){
			line = receive();
			if (".".equals(line)){
				break;
			}
			res += line + "\n";
			}
		}
		return res;
	}

	// retr儊僜僢僪
	// 僒乕僶偵retr僐儅儞僪傪憲晅偟傑偡
	public String retr(int i){
		String res = "";
		send("retr " + i);
		String line = receive();
		if (line.startsWith("-ERR")){
			System.err.println(line);
			res = line;
		}else{
			while (true){
				line = receive();
				if (".".equals(line)){
					break;
				}
				res += line + "\n";
			}
		}
		return res;
	}

	// dele儊僜僢僪
	// 僒乕僶偵dele僐儅儞僪傪憲晅偟傑偡
	public String dele(int i){
		send("dele " + i);
		String res = receive();
		if (res.startsWith("-ERR")){
			System.err.println(res);
		}
		return res;
	}

	// quit儊僜僢僪
	// 僒乕僶偵quit僐儅儞僪傪憲晅偟傑偡
	public void quit(){
		if (loginFlag){
			send("quit");
			loginFlag = false;
		}
	}
}

// SmtpClient僋儔僗
// NetClient傪宲彸偟偰,SMTP 庴怣婡擻傪幚尰偟傑偡
class SmtpClient extends NetClient{
	int SMTP_PORT = 25;
	String server;

	// 僐儞僗僩儔僋僞
	SmtpClient(String serv, String enc){
		super(enc);
		server = serv;
	}

	// sendCommandAndResultCheck儊僜僢僪
	// 僒乕僶偵僐儅儞僪傪憲晅偟,偦偺寢壥傪resultCheck儊僜僢僪偱僠僃僢僋偟傑偡
	void sendCommandAndResultCheck(String command, int successCode){
		send(command);
		resultCheck(successCode);
	}

	// resultCheck儊僜僢僪
	// 僒乕僶偐傜偺曉摎僐乕僪傪夝愅偟,僄儔乕側傜捠怣傪廔椆偟傑偡
	void resultCheck(int successCode){
		String res = receive();
		if (Integer.parseInt(res.substring(0,3)) != successCode){
			disconnect();
			throw new RuntimeException(res);
		}
	}

	// sendmail儊僜僢僪
	// SMTP傪梡偄偰,僒乕僶偵儊僢僙乕僕傪憲怣偟傑偡
	public void sendmail(String from, String[] to,
						 String subject, String message){
		// CONNECT
		connect(server, SMTP_PORT);
		resultCheck(220);

		// HELO
		try {
			String myname = InetAddress.getLocalHost().getHostName();
			sendCommandAndResultCheck("HELO " + myname, 250);
		}catch (UnknownHostException ex){
			ex.printStackTrace();
			System.exit(1);
		}
		// MAIL FROM
		sendCommandAndResultCheck("MAIL FROM: " + from, 250);
		// RCPT TO
		for (int i = 0; i < to.length; i++){
			sendCommandAndResultCheck("RCPT TO: " + to[i], 250);
		}

		// DATA
		sendCommandAndResultCheck("DATA", 354);
		send("Subject: " + subject);
		send("From: " + from);
		String toString = to[0];
		for (int i = 1; i < to.length; i++){
			toString += "," + to[i];
		}
		send("To: " + toString);
		send("");
		send(message);
		send(".");
		resultCheck(250);

		// QUIT
		sendCommandAndResultCheck("QUIT", 221);
		// CLOSE
		disconnect();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -