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

📄 smtp_outlooklogin.java

📁 用java实现的邮件服务器(Server 文件夹 用户名 文件夹 Send receive 文件夹 文件 时间.txt. 日志文件
💻 JAVA
字号:
package Server.SMTP;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import Server.Server;


public class SMTP_OutLookLogIn extends Server {

	private Socket socket;
	private Map<String, String> mapAddress = new HashMap<String, String>();
	private int num=6;

	public SMTP_OutLookLogIn(Socket socket) {
		super();
		this.socket = socket;
	}

	{
		setHashMap();
	}

	// 初始化本服务器所支持的转发服务器的IP列表
	public void setHashMap() {
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(SMTP_Final.transmitList);
			Properties prop = new Properties();
			prop.load(fis);
			Enumeration enumer = prop.propertyNames();
			while (enumer.hasMoreElements()) {
				String num = (String) enumer.nextElement();
				String address = prop.getProperty(num);
				mapAddress.put(num, address);
			}
		} catch (FileNotFoundException e) {

			e.printStackTrace();
		} catch (IOException e) {

			e.printStackTrace();
		}
	}

	// 判断是否需要转发,返回true表示不需要转发
	public boolean transmit(String address) {
		boolean flag = false;
		if (mapAddress.get("1").equals(address))
			flag = true;
		else if(mapAddress.get("4").equals(address))
			flag=true;
		else if(mapAddress.get("5").equals(address))
			flag=true;
		return flag;
	}
	
	//判断能转发的服务器是否存在,返回true表示存在
	public boolean transmitAddressExist(String address) {
		boolean flag = false;
		if (mapAddress.containsValue(address))
			flag = true;
		return flag;
	}
	
	//将不存在地址信息加入到Map表中
	public void addAddress(String address){
		mapAddress.put(new Integer(num++).toString(),address);
		
	}

	public void readInfoFromOutLookClient() {
		BufferedReader br=null;
		PrintWriter pw=null;
		try {
			br = new BufferedReader(new InputStreamReader(socket
					.getInputStream()));
			pw = new PrintWriter(new OutputStreamWriter(socket
					.getOutputStream()), true);
			String str = null, username = null, nameOfSendTo = null, sendMailFrom = null, sendMailTo = null;
			// 设置下面两个String类型的变量是为了获取发件人和收件人是否在同一台服务器上,若不是则转入相应的处理过程(还未实现date:080128)
			String sendFromDomainName = null, sendToDOmainName = null;
			// System.out.println(socket.getRemoteSocketAddress());
			pw.println("250");
			// 实现邮件转发的功能				
				while ((str = br.readLine()) != null) {
					// System.out.println(str);
					if (str.startsWith(SMTP_Final.reset)) {
						pw.println("250");
						continue;
					} else if (str.startsWith(SMTP_Final.mailFrom)) {
						// 提取发邮件的人的地址和用户名
						pw.println("250");
						sendMailFrom = str.split("<")[1].split(">")[0];
						sendFromDomainName = str.split("<")[1].split(SMTP_Final.at)[1]
						                                                            .split(">")[0];
						username = str.split("<")[1].split(">")[0]
						                                        .split(SMTP_Final.at)[0];
					} else if (str.startsWith(SMTP_Final.mailTo)) {
						// 提取收邮件的人的地址
						sendMailTo = str.split("<")[1].split(">")[0];
						sendToDOmainName = str.split("<")[1].split(SMTP_Final.at)[1]
						                                                          .split(">")[0];
						nameOfSendTo = str.split("<")[1].split(">")[0]
						                                            .split(SMTP_Final.at)[0];
						System.out.println(sendToDOmainName);
						System.out.println(transmit(sendToDOmainName));
						if(transmit(sendToDOmainName)){
							System.out.println("不需要转发");
							pw.println("250");
						}else{
							if(transmitAddressExist(sendToDOmainName)){
								pw.println("250");
								new SMTP_TransmitMailToAnotherServer(socket,sendToDOmainName).startTransmit();
							}else{
								pw.println("250");
								addAddress(sendToDOmainName);
								new SMTP_TransmitMailToAnotherServer(socket,sendToDOmainName).startTransmit();
							}
						}
						
					} else if (str.startsWith(SMTP_Final.data)) {
						// 开始读取邮件的内容,读取并将其保存,遇到“.”停止文件的读取
						pw.println("354");
						SMTP_CreateUserDir outLookSend = new SMTP_CreateUserDir(
								username);
						outLookSend.createUserDir();
						// 将读取文件的内容写到自己发件箱和发送到的邮箱
						SMTP_CreateUserDir outLookTo = new SMTP_CreateUserDir(
								nameOfSendTo);
						outLookTo.createUserDir();
						
						String filePathOfSend = outLookSend.getUserSendBox() + "/"
						+ String.valueOf(System.currentTimeMillis())
						+ username + ".txt";
						String filePathOfReceive = outLookTo.getUserReceiveBox()
						+ "/" + String.valueOf(System.currentTimeMillis())
						+ nameOfSendTo + ".txt";
						
						FileOutputStream fosSend = new FileOutputStream(
								filePathOfSend);
						PrintWriter pwFileSend = new PrintWriter(
								new OutputStreamWriter(fosSend));
						FileOutputStream fosReceive = new FileOutputStream(
								filePathOfReceive);
						PrintWriter pwFileReceive = new PrintWriter(
								new OutputStreamWriter(fosReceive));
						// 写入日志文件
						SMTP_LogForMailBox log = new SMTP_LogForMailBox(username,
								sendMailTo);
						log.makeLogFile();
						
						while (!(str = br.readLine())
								.equalsIgnoreCase(SMTP_Final.endData)) {
							pwFileSend.println(str);
							pwFileSend.flush();
							pwFileReceive.println(str);
							pwFileReceive.flush();
							
						}
						pwFileReceive.close();
						pwFileSend.close();
						pw.println("250");
					} else if (str.startsWith(SMTP_Final.quit)) {
						// 整个OutLookClient对话结束
						pw.println("221");
						break;
					} else {
						// 对其他想不到的情况的处理
						pw.println("554");
						socket.close();
						break;
					}
				}
			
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (socket != null) {
					socket.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public void run() {
		readInfoFromOutLookClient();
	}

}

⌨️ 快捷键说明

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