用java实现的邮件系统一(SMTP 服务器,单发,和群发)

来源:互联网 发布:怎么修改本机mac地址 编辑:程序博客网 时间:2024/05/22 11:58

package com.wepull.smtp;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

/**
 * @author liugang
 *
 */
public class SmtpSesssion extends Thread {

 /**
  * 单个会话
  */
 private Socket s;

 /**
  *读取客戸端信息
  */
 private BufferedReader br;

 /**
  * 服务器输出信息到客服端
  */
 private PrintStream ps;
 
 
 /**
  *服务端接收邮件内容临时存储路径
  */
 private String fileServerPath="D://server//mail//temp" ;
 private String fileServerPaths ="D://server//mail";
 
 
 private Timer t =new Timer();
 
 
 /**
  * 用于存储收件人地址的集合
  */
 private List<String> tolistaddress =new ArrayList<String>();

 /**
  * @param s初始化一个会话socket
  */
 public SmtpSesssion(Socket s) {
  this.s = s;
  
  try {
   br = new BufferedReader(new InputStreamReader(s.getInputStream()));
   ps = new PrintStream(s.getOutputStream());
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  File file=new File(fileServerPath);
  if(!file.exists()){
   file.mkdirs();
  }
 }

 /*
  * (non-Javadoc)
  *
  * @see java.lang.Thread#run()
  *
  * 处理与客服端的信息,客户端发送不同的命令,服务器就做相应的处理
  */

 public void run() {
  t.schedule(new TimerTask(){

   
   public void run() {
    try {
     s.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    
   }
   
  }, 300000);
  ps.println("220 Smtp.chunhua.com server start");
  String line = "";
  
 
  try {
   while(!s.isClosed()&&(line = br.readLine())!=null){
    System.out.println(s.isClosed());
    
    
    System.out.println("客服端发送过来的信息" + line);
    /**
     * 处理客服端发送命令的操作
     * */
    if(line!=null){
     doaction(line);
    }
    
    
   }
  
  } catch (IOException e) {
   // TODO Auto-generated catch block
   //e.printStackTrace();
   System.out.println("socket 关闭");
  }finally{
   
   try {
    if(!s.isClosed()){
     s.close();
    }
    
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }

 }

 /**
  * @param line
  *            处理客服端发送命令的操作
  */
 private void doaction(String line) {

  String msg = line.substring(0, 4);

  if ("helo".equalsIgnoreCase(msg)) {
   /**
    * 处理客服端发送helo命令的操作
    * */
   dohelo();
  } else if ("ehlo".equalsIgnoreCase(msg)) {
   /**
    * 处理客服端发送ehlo命令的操作
    * */
   doehlo();

  } else if("auth".equalsIgnoreCase(msg)){
   
   ps.println("334 VXNlcm5hbWU6");
   doauth();
   
  }else if ("mail".equalsIgnoreCase(msg)) {
   /**
    * 处理客服端发送mail命令的操作
    * */
   domail();
  } else if ("rcpt".equalsIgnoreCase(msg)) {
   /**
    * 处理客服端发送rcpt命令的操作
    * */
   dorcpt(line);
  } else if ("data".equalsIgnoreCase(msg)) {
   /**
    * 处理客服端发送data命令的操作
    * */
   dodata();
  } else if ("rest".equalsIgnoreCase(msg)) {
   /**
    * 处理客服端发送rest命令的操作
    * */
   dorest();
  } else if ("quit".equalsIgnoreCase(msg)) {
   /**
    * 处理客服端发送quit命令的操作
    * */
   doquit();
  }

 }

 /**
  * 处理客服端发送helo(不需要验证)命令的操作的方法
  */
 private void dohelo() {
  System.out.println("250");
  ps.println("250");
 }

 /**
  * 处理客服端发送ehlo(要求用户名验证,使用base64编码)命令的操作的方法
  */
 private void doehlo() {
  ps.println("250-Winmail Mail Server");
  ps.println("250-PIPELINING");
  ps.println("250-AUTH=LOGIN PLAIN");
  ps.println("250-AUTH LOGIN PLAIN");
  ps.println("250-SIZE 20480000");
  ps.println("250 8BITMIME");

 }
 
 
 private void doauth(){
  
  String str="";
  String msgs="";
  try {
   while(true){
    str = br.readLine();
    System.out.println("客服端发送过来的信息" + str);
    msgs=str.substring(0,4);
     if("bGc=".equalsIgnoreCase(str)){
     
     ps.println("334 UGFzc3dvcmQ6");
     
    }else if("MTIz".equalsIgnoreCase(str)){
     
     ps.println("235 auth successfully");
     break;
    } 
   }
   
   
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
   
 }

 /**
  * 处理客服端发送mail(获得发件人地址信息)命令的操作的方法
  */
 private void domail() {
  
  
  ps.println("250 ok");
  
  
  
 }

 /**
  * 处理客服端发送rcpt(获得收件人地址信息)命令的操作的方法
  */
 private void dorcpt(String line) {
  String toaddress=line.split("<")[1].split(">")[0];
  tolistaddress.add(toaddress);
  ps.println("250 ok");
 }

 /**
  * 处理客服端发送data(邮件内容)命令的操作的方法
  */
 private void dodata() {
  ps.println("354 go ahead");
  dowritefile();
 }

 /**
  * 将邮件内容写到服务器的临时文件中
  */
 private void dowritefile() {
  PrintStream Fileps=null;
  File temp = new File(fileServerPath+"//"+"temp.txt");
  System.out.println(temp.getAbsolutePath());
  try {
    Fileps = new PrintStream(new FileOutputStream(temp));
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  String mailcontent="";
  
   try {
    while(true){
     if(!s.isClosed()){
      mailcontent= br.readLine();
     }    
    Fileps.println(mailcontent);
    
    if(".".equalsIgnoreCase(mailcontent)){
     ps.println("250 ok message accepted for delivery");
     
     break;
    }
    }
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }finally{
    Fileps.close();
   }
   
   
  
  for(String str:tolistaddress){
   
   
   
   if("chunhua.com".equalsIgnoreCase(str.split("@")[1])){
    System.out.println("come");
     str=fileServerPaths+"//"+str.split("@")[0]+"//revd";
     System.out.println(str);
    CopeDeleteFile.copy1(new File(fileServerPath), new File(str));   
   }else{
    
    doWork(str);
    
   }
  
  }
 }

 private void doWork(String str) {
  try {
   String ip="smtp."+str.split("@")[1];
   System.out.println(ip);
   Socket s = new Socket("192.168.1.161",25);
   new Transmit(s,str).start();

   
   
   
  } catch (UnknownHostException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  
  
  
 }

 /**
  * 处理客服端发送rest(重置)命令的操作的方法
  */
 private void dorest() {
  ps.println("250 ");
 }

 /**
  * 处理客服端发送quit(关闭)命令的操作的方法
  */
 private void doquit() {
  ps.println("221 Winmail Mail Server");
  try {
   s.close();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }

}

原创粉丝点击