用java实现的邮件系统三(收取邮件服务器)

package com.wepull.pop3;

import java.net.Socket;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import com.wepull.smtp.*;

public class POPSession extends Thread {

 /**
  * 获得一次会话
  */
 private Socket s;

 /**
  * 读取网络
  */
 private BufferedReader br;

 /**
  * 写网络
  */
 private PrintStream ps;

 private String usermsg;

 private String usermsgpath;

 private Set set = new HashSet();

 /**
  * 标记要删除的邮件
  */
 private Map<String ,String> map = new HashMap<String,String>();

 /**
  * 把第几封邮件和邮件名对应起来
  */
 private Map<String ,String> filemap = new HashMap<String,String>();

 /**
  * @param s
  *            初始化网络输入和网络输出流
  */
 public POPSession(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();
  }
 }

 /*
  * (non-Javadoc)
  *
  * @see java.lang.Thread#run() 多线程的run方法
  */

 @Override
 public void run() {

  ps.println("+OK POP3 server ready");
  String line = "";
  try {
   while (!s.isClosed() && (line = br.readLine()) != null) {

    System.out.println("客服端发送的命令:" + line);
    /**
     * 处理从客户端发来的命令
     */
    doAction(line);
    if ("quit".equalsIgnoreCase(line)) {
     /**
      * 处理quit命令(关闭流)
      */
     doQuit();
     break;
    }

   }

  } catch (IOException e) {
   if ("Connection reset".equalsIgnoreCase(e.getMessage())) {

   } else {
    e.printStackTrace();
   }
  } finally {

   try {
    br.close();
    ps.close();
    s.close();

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

  }

 }

 /**
  * @param line
  *            处理从客户端发来的命令
  */
 private void doAction(String line) {
  String msg = line.split(" ")[0];

  if ("user".equalsIgnoreCase(msg)) {
   /**
    * 处理user命令(验证用户是否合法)
    */
   doUser(line);

  } else if ("pass".equalsIgnoreCase(msg)) {
   /**
    * 处理pass命令(验证用户密码是否正确)
    */
   doPass(line);

  } else if ("stat".equalsIgnoreCase(msg)) {
   /**
    * 处理stat命令(列出用户邮件数和邮件大小)
    */
   doStat();
  }else if ("noop".equalsIgnoreCase(msg)) {
   /**
    * 处理top(n,m)命令(输出第n封邮件的前m行)
    */
   ps.println("+OK");
  }  else if ("top".equalsIgnoreCase(msg)) {
   /**
    * 处理top(n,m)命令(输出第n封邮件的前m行)
    */
   doTop(line);
  } else if ("list".equalsIgnoreCase(msg)) {
   /**
    * 处理list命令(列出每封邮件的大小)
    */
   doList(line);
  } else if ("retr".equalsIgnoreCase(msg)) {
   /**
    * 处理retr命令(给客服端发送指定邮件的内容)
    */
   doRetr(line);
  } else if ("dele".equalsIgnoreCase(msg)) {
   /**
    * 处理dele命令(标记指定要删除的邮件)
    */
   doDele(line);
  } else if ("rest".equalsIgnoreCase(msg)) {
   /**
    * 处理rest命令(取消指定删除的邮件的标记)
    */
   doRest(line);
  } else if ("uidl".equalsIgnoreCase(msg)) {
   /**
    * 处理uidl命令(验证用户是否合法)
    */
   doUidl();
  }
 }

 /**
  * 处理user命令(验证用户是否合法)
  */
 private void doUser(String msg) {
  usermsg = msg.split(" ")[1];
  usermsgpath = Common.RPATH + "//" + usermsg;
  // msg = Common.RPATH + "//" + msg;
  // System.out.println();
  System.out.println(usermsg);
  CopeDeleteFile.copy(new File(Common.PATHS + "//" + usermsg), new File(
    Common.RPATH));
  usermsgpath += "//" + "revd";
  System.out.println(usermsgpath);
  File userfile = new File(usermsgpath);
  File[] userfiles = userfile.listFiles();
  int count = 0;
  String sum="";
  for (int i = 0; i < userfiles.length; i++) {
   count++;
   sum=""+count;
   filemap.put(sum, userfiles[i].getAbsolutePath());
  }

  ps.println("+OK is a real hoopy frood");
 }

 /**
  * 处理pass命令(验证用户密码是否正确)
  */
 private void doPass(String msg) {

  ps.println("+OK " + List() + " message(s) [" + total() + " byte(s)]");
 }

 /**
  * 处理stat命令(列出用户邮件数和邮件大小)
  */
 private void doStat() {
  ps.println("+OK " + List() + " " + total());

 }

 private long total() {
  // File userfile = new File(usermsgpath);
  // File[] userfiles = userfile.listFiles();
  // long count = 0;
  // for (int i = 0; i < userfiles.length; i++) {
  // count += userfiles[i].length();
  // }

  Set set = filemap.keySet();
  long count = 0;
  Iterator ita = set.iterator();
  while (ita.hasNext()) {
   String key = (String) ita.next();
   String filepath = (String) filemap.get(key);
   File messagefile = new File(filepath);
   count += messagefile.length();
  }

  return count;
 }

 private int List() {
  // File userfile = new File(usermsgpath);
  // File[] userfiles = userfile.listFiles();

  // return userfiles.length;
  return filemap.size();
 }

 private void doList(String line) {
  
  // File userfile = new File(usermsgpath);
  // File[] userfiles = userfile.listFiles();
  // int count = 0;
  // for (int i = 0; i < userfiles.length; i++) {
  // ps.println(++count + " " + userfiles[i].length());
  // }
  
  if(line.split(" ").length==2){
    line =line.split(" ")[1];
    String filepath = (String) filemap.get(line);
    File messagefile = new File(filepath);
    ps.println("+OK "+line+" "+ messagefile.length());
   
   
  }else{
  ps.println("+OK " + List() + " " + "messages");
  Set set = filemap.keySet();

  Iterator ita = set.iterator();
  while (ita.hasNext()) {
   String key = (String) ita.next();
   String filepath = (String) filemap.get(key);
   File messagefile = new File(filepath);
   ps.println(key + " " + messagefile.length());
  }
  }

  ps.println(".");

 }

 private void doRetr(String msg) {
  msg = msg.split(" ")[1];
  File file = new File((String) filemap.get(msg));

  ps.println("+OK" + " " + file.length() + " " + "octets");

  BufferedReader brfile = null;
  try {
   brfile = new BufferedReader(new InputStreamReader(
     new FileInputStream(file)));
   String line = "";
   while (true) {
    line = brfile.readLine();
    ps.println(line);
    if (".".equalsIgnoreCase(line)) {
     break;
    }
   }
  } 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();
  } finally {
   try {
    brfile.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }

  // File userfile = new File(usermsgpath);
  // File[] userfiles = userfile.listFiles();
  //
  // ps.println("+OK" + " " + userfiles[Integer.parseInt(msg) -
  // 1].length()
  // + " " + "octets");
  // BufferedReader brfile = null;
  // try {
  // brfile = new BufferedReader(new InputStreamReader(
  // new FileInputStream(userfiles[Integer.parseInt(msg) - 1])));
  // String line = "";
  // while (true) {
  // line = brfile.readLine();
  // ps.println(line);
  // if (".".equalsIgnoreCase(line)) {
  // break;
  // }
  // }
  // } 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();
  // } finally {
  // try {
  // brfile.close();
  // } catch (IOException e) {
  // // TODO Auto-generated catch block
  // e.printStackTrace();
  // }
  // }

 }

 private void doDele(String msg) {
  msg = msg.split(" ")[1];

  // File userfile = new File(usermsgpath);
  // File[] userfiles = userfile.listFiles();

  // map.put(msg, userfiles[Integer.parseInt(msg) - 1].getAbsolutePath());
  map.put(msg, filemap.get(msg));
  filemap.remove(msg);
  ps.println("+OK");

 }

 private void doRest(String msg) {
  msg = msg.split(" ")[1];
  // File userfile = new File(usermsgpath);
  // File[] userfiles = userfile.listFiles();

  filemap.put(msg, map.get(msg));
  map.remove(msg);
  ps.println("+ok");

 }

 private void doUidl() {
  ps.println("+OK " + List() + " " + "messages");
  Set set = filemap.keySet();
  Iterator ita = set.iterator();
  while (ita.hasNext()) {
   
   String key = (String) ita.next();
   String filepath = (String) filemap.get(key);
   File messagefile = new File(filepath);
   ps.println(key + " " + messagefile.getName());
   System.out.println("come"+key+messagefile.getName());
  }

  // File userfile = new File(usermsgpath);
  // File[] userfiles = userfile.listFiles();
  // BufferedReader brfile = null;
  // String line = "";
  // for (int i = 0; i < userfiles.length; i++) {
  // try {
  // brfile = new BufferedReader(new InputStreamReader(
  // new FileInputStream(userfiles[i])));
  //
  // line = brfile.readLine();
  //
  // } catch (FileNotFoundException e) {
  // // TODO Auto-generated catch block
  // e.printStackTrace();
  // } catch (IOException e) {
  // // TODO Auto-generated catch block
  // e.printStackTrace();
  // } finally {
  // try {
  // brfile.close();
  // } catch (IOException e) {
  // // TODO Auto-generated catch block
  // e.printStackTrace();
  // }
  // }
  // ps.println(++i + " " + line.split("<")[1].split(">")[0]);
  // }

  ps.println(".");

 }

 private void doTop(String msg) {

  ps.println("+OK");
  String n = "";
  String m = "";
  String[] str = msg.split(" ");
  n = str[1];
  File file = new File((String) filemap.get(n));
  BufferedReader br = null;
  String line = "";
  try {
   br = new BufferedReader(new InputStreamReader(new FileInputStream(
     file)));
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  if (str.length == 2) {
   while (true) {
    try {
     line = br.readLine();
     ps.println(line);

     if ("".equalsIgnoreCase(line)) {
      ps.println(".");
      break;
     }

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

  } else if (str.length == 3) {
   m = str[2];
   int count = 0;

   if ("0".equalsIgnoreCase(m)) {
    try {
    while ((line = br.readLine())!=null) {
      ps.println(line);
      ps.flush();
      if ("".equalsIgnoreCase(line)) {
       //ps.println();
       br.close();
       break;
      }
           }
         ps.println(".");
     } catch (IOException e) {
      e.printStackTrace();
     }

   } else {
    while (true) {
     try {
      count++;
      line = br.readLine();
      ps.println(line);

      if (count == Integer.parseInt(m)) {
       ps.println(".");
       break;
      }

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

   }

  }

 }

 private void doQuit() {

  ps.println("+OK dewey POP3 server signing off");
  dodelefile();

 }

 private void dodelefile() {

  Set set = map.keySet();

  Iterator ita = set.iterator();

  while (ita.hasNext()) {

   String key = (String) ita.next();

   String filename = (String) map.get(key);

   File deltefile = new File(filename);
   deltefile.delete();
  }

 }
}

### 回答1: 可以使用JavaMail API来实现邮件收取和发送。首先需要配置JavaMail API的相关信息,如邮件服务器地址、端口、账号和密码等。然后可以使用JavaMail API提供的类和方法来发送和接收邮件,如Session、MimeMessage、Transport等。具体实现步骤可以参考JavaMail API的官方文档或相关教程。 ### 回答2: Java实现邮件收取和发送可以使用JavaMail API。JavaMail API是一个用于发送和接收邮件Java标准扩展,它提供了一组类和方法来处理SMTP、POP3、IMAP等邮件协议。 首先,我们需要下载并导入JavaMail API的jar包,然后在代码中引入相关的类和方法。 要实现邮件收取,我们需要连接到邮件服务器,并通过协议(如POP3或IMAP)读取收件箱中的邮件。具体步骤如下: 1. 创建一个`Properties`对象,设置邮件服务器的一些属性,如主机名、端口等。 2. 创建一个`Session`对象,用于与邮件服务器建立连接,需要传递上一步中的`Properties`对象和认证信息。 3. 创建一个`Store`对象,用于连接到邮件服务器。 4. 打开`Store`连接。 5. 获取收件箱的`Folder`对象。 6. 打开`Folder`连接。 7. 遍历收件箱中的邮件,并进行相应的操作,比如获取邮件内容、附件、发送者等等。 8. 关闭连接。 要实现邮件发送,我们需要连接到邮件服务器,并通过协议(如SMTP)发送邮件。具体步骤如下: 1. 创建一个`Properties`对象,设置邮件服务器的一些属性,如主机名、端口等。 2. 创建一个`Session`对象,用于与邮件服务器建立连接,需要传递上一步中的`Properties`对象和认证信息。 3. 创建一个`MimeMessage`对象,用于构建邮件的内容。 4. 设置邮件的各种属性,如发送者、收件人、主题、内容、附件等等。 5. 创建一个`Transport`对象,用于连接到邮件服务器。 6. 打开`Transport`连接。 7. 发送邮件。 8. 关闭连接。 以上就是使用Java实现邮件收取和发送的基本步骤。在具体实现中,我们还可以添加一些额外的功能,如邮件的加密、认证等。 ### 回答3: JAVA可以使用JavaMail API来实现邮件收取和发送功能。 邮件收取可以通过POP3协议或IMAP协议来实现。使用JavaMail可以建立与邮件服务器的连接,然后通过相应的协议进行邮件收取。可以使用POP3协议的POP3Store类来实现通过POP3收取邮件,使用IMAP协议的IMAPStore类来实现通过IMAP收取邮件。在收取邮件时,需要提供邮件服务器的地址、端口、用户名和密码等信息。 邮件的发送可以通过SMTP协议来实现。使用JavaMail可以建立与邮件服务器的连接,并通过SMTP协议发送邮件。可以使用SMTPTransport类来发送邮件。在发送邮件时,需要提供邮件服务器的地址、端口、用户名和密码等信息,同时还需要设置发件人、收件人、主题、内容等邮件信息。 除了收取和发送邮件JavaMail还提供了许多其他功能,如附件的添加、HTML邮件的发送、收取邮件的附件下载等。 总的来说,通过JavaMail API,可以方便地实现邮件收取和发送功能,并且具有一定的灵活性,可以满足不同场景下的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值