您的位置:首页 > 编程语言 > Java开发

javamail邮件发送与接收源码

2013-07-09 15:28 387 查看
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;

 }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: