JAVA开发邮件服务器——POP3

//主函数

import java.util.Date;

import wrfei.mail.pop3.POP3Server;
import wrfei.mail.smtp.SMTPServer;

public class MailServer {
 public static void main(String[] args) {
  try{
   new SMTPServer().start();
   new POP3Server().start();
   Date date=new Date();
   System.out.println("邮件服务器启动,可以使用"+date);
  }catch(Exception e){
   e.printStackTrace();
  }
 }
}

 

package wrfei.mail.pop3;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import wrfei.mail.db.DbConn;

public class POP3Session extends Thread {
 private Socket s;
 private PrintStream ps;
 private BufferedReader br;
 
// private String name="267287116";
// private String pswd="wangruofei";
 private String username;
 private String password;
 private String path;
 private File file;
 private File[] menu;
 private int n;
 private long oct;
 private List<Integer> dropIndex;//标记为删除的下标集合
 
 public static final String CMD_USER="USER";
 public static final String CMD_PASS="PASS";
 public static final String CMD_STAT="STAT";
 public static final String CMD_LIST="LIST";
 public static final String CMD_RETR="RETR";
 public static final String CMD_DELE="DELE";
 public static final String CMD_RSET="RSET";
 public static final String CMD_NOOP="NOOP";
 public static final String CMD_QUIT="QUIT";
 public static final String CMD_TOP="TOP";
 
 public POP3Session(Socket s) {
  this.s=s;
 }

 @Override
 public void run() {
  try {
   br=new BufferedReader(new InputStreamReader(s.getInputStream()));
   ps=new PrintStream(s.getOutputStream());
   dropIndex=new ArrayList<Integer>();
   doWelcome();
   String line=null;
   while((line=br.readLine())!=null){
    System.out.println(line);
    String command=line.substring(0,4).trim();
    if(command.equalsIgnoreCase(CMD_USER))
     doUser(line);
    else if(command.equalsIgnoreCase(CMD_PASS))
     doPass(line);
    else if(command.equalsIgnoreCase(CMD_STAT))
     doStat();
    else if(command.equalsIgnoreCase(CMD_LIST))
     doList(line);
    else if(command.equalsIgnoreCase(CMD_RETR))
     doRetr(line);
    else if(command.equalsIgnoreCase(CMD_DELE))
     doDele(line);
    else if(command.equalsIgnoreCase(CMD_RSET))
     doRset();
    else if(command.equalsIgnoreCase(CMD_NOOP))
     doNoop();
    else if(command.equalsIgnoreCase(CMD_TOP))
     doTop();
    else if(command.equalsIgnoreCase(CMD_QUIT)){
     doQuit();
     break;
    }
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
  finally{
   try{
    br.close();
    ps.close();
    s.close();
   }catch(Exception e){
    e.printStackTrace();
   }
  }
 }

 private void doTop() {
 }

 private void doNoop() {
  ps.println("+OK");
 }

 private void doRset() {
  for(int i=dropIndex.size();i>=0;i--){
   dropIndex.remove(i);
  }
  ps.println("+OK");
 }

 private void doDele(String line) {
  n=Integer.parseInt(line.substring(5));
  if(!dropIndex.contains(n)){
   dropIndex.add(n);
   ps.println("+OK message"+n+"deleted!");
  }
  else{
   ps.println("-ERR");
  }
 }

 private void doRetr(String line) {
  try{
  String strIndex=line.substring(5);
  n=Integer.parseInt(strIndex);
  if(strIndex==null||n<0||n>menu.length+1){
   ps.println("-ERR no such message");
  }
  else{
   ps.println("+OK   "+menu[n-1].getName()+"    size:"+menu[n-1].length()+"octets");
   BufferedReader in = new BufferedReader(new FileReader(menu[n-1]));
   String line2=null;
   while((line2=in.readLine())!=null){
    ps.println(line2);
   }
   in.close();
   ps.println(".");
  }
  }catch(Exception e){
   e.printStackTrace();
  }
 }

 private void doList(String line) {
  String[] arr=line.trim().split(" ");
  String index=null;
  if(arr.length>1)
   index=arr[1];
  if(index==null){
   ps.println("+OK"+username+"'s maildrop has"+menu.length+"messages("+oct+"octets)");
   for(int i=0;i<menu.length;i++){
    ps.println(i+1+"   "+menu[i].getName()+"    size:"+menu[i].length()+"octets");
   }
   ps.println(".");
  }
  else{
   int ind=Integer.parseInt(index);
   if(ind<1||ind>menu.length){
    ps.println("-ERR no such message");
   }
   else{
    ps.println("+OK"+ind+"   "+menu[ind-1].length());
    ps.println(".");
   }
  }
 }

 private void doStat() {
  System.out.println("+OK"+" "+menu.length+" "+oct);
  ps.println("+OK"+" "+menu.length+" "+oct);
 }
 
 private void doQuit() {
  if(dropIndex.size()>0){
   for(int i=0;i<dropIndex.size();i++){
    int index=dropIndex.get(i);
    menu[index-1].delete();
   }
  }
  ps.println("+OK GOODBYE");
 }

 private void getRB(){
  path="MailBox/"+username+"/receiver/";
  file=new File(path);
  menu=file.listFiles();
  for(int i=0;i<menu.length;i++){
   oct+=menu[i].length();//计算收件夹字节数
  }
 }
 
 private void doPass(String line) {
  password=line.substring(5);
  //System.out.println(password);
  boolean flag=checkUser();
  if(flag){
   getRB();
   ps.println("+OK"+username+"'s maildrop has"+menu.length+"messages("+oct+"objects)");
   
  }else{
   ps.println("-ERR");
  }
 }

 private boolean checkUser() {
  DbConn conn=new DbConn();  
  try {
   String sql="select * from user where name='"+username +"'and password='"+password+"'";
   ResultSet rs=conn.executeQuery(sql);
   if(rs.next())
    return true;
   rs.close();
  } catch (SQLException e) {
   e.printStackTrace();
  }
  return false;
 }

 private void doUser(String line) {
  username=line.substring(5);
  //System.out.println(username);
  ps.println("+OK");
 }

 private void doWelcome() {
  ps.println("+OK");
 }
}

 

 


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值