javamail邮件发送与接收源码

时间:2022-09-24 09:20:08

package com.mail.tool;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.text.DateFormat;
import java.util.Date;
import java.util.Properties;
import java.util.StringTokenizer;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import com.mail.bean.MailBean;
import com.mail.bean.UserBean;
import com.mail.dao.ReceiveDao;
import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility;

public class MailManager {
 public int getUnreadCount(UserBean user){//读取未读邮件的个数,POP3没有此功能
  int count=0;
  try{
   Properties props=new Properties();//创建一个空的配置
   Session mailSession = Session.getInstance(props);//获取一个Session的实例
   mailSession.setDebug(true);
   Store store = mailSession.getStore("pop3");//设置接收邮件的服务器类型
   store.connect(user.getPop(), user.getEmail(), user.getEmailPSW());//连接服务器
   Folder folder = store.getFolder("INBOX");//获取收件箱中的邮件
   folder.open(Folder.READ_ONLY);
   count=folder.getUnreadMessageCount();//获取未读邮件的个数
   folder.close(true);
   store.close();
  }
  catch (Exception e) {
   e.printStackTrace();
  }
  return count;
 }
 //接收邮件
 public boolean receiveMail(UserBean user){
  try{
   Properties props=new Properties();//创建一个空的配置
   Session mailSession = Session.getInstance(props);//获取一个Session实例
   mailSession.setDebug(true);
   Store store = mailSession.getStore("pop3");//设置接收服务器类型
   store.connect(user.getPop(), user.getEmail(), user.getEmailPSW());//连接服务器
   Folder folder = store.getFolder("INBOX");//获取收件箱中的邮件
   folder.open(Folder.READ_WRITE);//打开Folder
   Message message[] = folder.getMessages();//获取所有邮件
   ReceiveDao receiveDao = new ReceiveDao();//建立保存邮件的数据库
   for (int i = 0; i < message.length; i++){
    MailBean mail=new MailBean();
    mail.setFrom(((InternetAddress)message[i].getFrom()[0]).getAddress());//读取发件人
    mail.setTo(user.getEmail());//读取收件人
    mail.setTheme(message[i].getSubject());//读取邮件主题
    DateFormat format=DateFormat.getDateInstance(DateFormat.SHORT);//获取邮件发送日期
    mail.setDate(format.format(message[i].getSentDate()));
    /////////////////////////////////////////////////
    Object content = message[i].getContent();//获取邮件所有内容
    String textPlain=contentParser(message[i],"text/plain");//解析邮件中的文本正文
    String textHtml=contentParser(message[i],"text/html");//解析邮件中的html正文
    if(textHtml.length()>0)
     mail.setContent(MimeUtility.decodeText(textHtml));
    if(textPlain.length()>0)
     mail.setContent(MimeUtility.decodeText(textPlain));
    if (content instanceof Multipart){//获取邮件中的附件
     Multipart mp = (Multipart) message[i].getContent();//判断邮件是否为Multipart
     for (int j = 0; j < mp.getCount(); j++){
      Part part = mp.getBodyPart(j);//取得Multipart中的BodyPart
      String disposition = part.getDisposition();
      if ((disposition != null)&&((disposition.equals(Part.ATTACHMENT))
        ||(disposition.equals(Part.INLINE)))){//判断是否为附件
       String filename=MimeUtility.decodeText(part.getFileName());//取得附件文件的文件名
       File file = new File(Constants.WEB_ABS_ATTACH_PATH
         + "/" + filename);//新建文件用来保存附件的文件
       for (int k = 0; file.exists(); k++){
        int index = filename.indexOf(".");
        String ext = filename.substring(index);
        file = new File(Constants.WEB_ABS_ATTACH_PATH
          + "/"
          + filename.substring(0, index)
          + k + ext);
       }
       FileOutputStream myFileoutputstream = new FileOutputStream(file);
       int chunk = part.getSize();

       byte[] buffer = new byte[chunk];
       InputStream instream = part.getInputStream();
       instream.read(buffer, 0, chunk);
       myFileoutputstream.write(buffer, 0, chunk);
       instream.close();
       myFileoutputstream.close();
       String attach=mail.getAttachment();
       if(attach.length()>0)attach+=";";
       mail.setAttachment(attach+"attachment" + "/"
         + file.getName());
       mail.setFlag(MailBean.UNREAD);
      }
     }
    }
    //////////////////////////////////////////////////////
    mail.setFlag(MailBean.UNREAD);
    mail.setUserID(user.getUserID());
    if (receiveDao.addReceive(mail))
     message[i].setFlag(Flags.Flag.DELETED, true);
   }

   folder.close(true);
   store.close();

   return true;
  }
  catch (Exception e){
   e.printStackTrace();
  }

  return false;
 }
 //发送邮件
 public boolean sendMail(MailBean mail,UserBean user){//发送邮件方法
  try{
   Properties props =new Properties();
   props.put("mail.smtp.host",user.getSmtp());//进行邮件服务器认证
   props.put("mail.smtp.auth","true");
   Session mailSession = Session.getInstance(props);
   mailSession.setDebug(true);
   MimeMessage newMessage = new MimeMessage(mailSession);
   newMessage.setFrom(new InternetAddress(mail.getFrom()));
   newMessage.setSubject(mail.getTheme());
   newMessage.setSentDate(new Date());
   InternetAddress[] toList = getToList(mail.getTo());
   newMessage.setRecipients(Message.RecipientType.TO, toList);
   BodyPart mbp = new MimeBodyPart();
   mbp.setContent(mail.getContent(), "text/html;charset=GBK");
   Multipart multipart = new MimeMultipart();
   multipart.addBodyPart(mbp);

   if (mail.getAttachment().length()>0){
    String[] files=mail.getAttachment().split(";");
    for(int i=0;i<files.length;i++){//设置邮件附件部分
     mbp = new MimeBodyPart();
     String attPath=Constants.WEB_ABS_PATH+files[i];
     File file=new File(attPath);
     DataSource source = new FileDataSource(file);
     mbp.setDataHandler(new DataHandler(source));
     mbp.setFileName(MimeUtility.encodeText(file.getName()));//编码文件名解决中文乱码
     multipart.addBodyPart(mbp);
    }
   }
   newMessage.setContent(multipart);
   Transport transport;
   transport = mailSession.getTransport("smtp");
   transport.connect(user.getSmtp(), user.getEmail(), user.getEmailPSW());
   transport.sendMessage(newMessage, newMessage.getAllRecipients());
   transport.close();
   return true;
  }
  catch (Exception e){
   e.printStackTrace();
  }
  return false;
 }
 //取得地址列表
 public InternetAddress[] getToList(String toSeq) throws AddressException{
  StringTokenizer token = new StringTokenizer(toSeq, ",");
  InternetAddress[] addr = new InternetAddress[token.countTokens()];
  int i = 0;
  while (token.hasMoreTokens()){
   addr[i] = new InternetAddress(token.nextToken().toString());
   i++;
  }
  return addr;
 }
 //解析邮件获取邮件文本
 public String contentParser(Part part,String type) throws Exception{
  String content="";
  if(part.isMimeType(type)){
   content=(String)part.getContent();
  }
  else{
   if(part.getContent() instanceof Multipart){
    Multipart mp = (Multipart)part.getContent();
    int count = mp.getCount();
    for (int i = 0; i < count; i++)
    content+=contentParser(mp.getBodyPart(i),type);
   }
  }
  return content;
 }
}