java Mail邮件接收工具类

下面是一个邮件接收的工具类,有点长!!!

public class ReciveMail {
 private MimeMessage msg = null;
  private String saveAttchPath = "";
  private StringBuffer bodytext = new StringBuffer();
  private String dateformate = "yy-MM-dd HH:mm"; 

  public ReciveMail(MimeMessage msg){
    this.msg = msg;
    }
  public void setMsg(MimeMessage msg) {
    this.msg = msg;
  } 

  /**
   * 获取发送邮件者信息
   * @return
   * @throws MessagingException
   */
  public String getFrom() throws MessagingException{
    InternetAddress[] address = (InternetAddress[]) msg.getFrom();
    String from = address[0].getAddress();
    if(from == null){
      from = "";
    }
    String personal = address[0].getPersonal();
    if(personal == null){
      personal = "";
    }
    String fromaddr = personal +"<"+from+">";
    return fromaddr;
  } 

  /**
   * 获取邮件收件人,抄送,密送的地址和信息。根据所传递的参数不同 "to"-->收件人,"cc"-->抄送人地址,"bcc"-->密送地址
   * @param type
   * @return
   * @throws MessagingException
   * @throws UnsupportedEncodingException
   */
  public String getMailAddress(String type) throws MessagingException, UnsupportedEncodingException{
    String mailaddr = "";
    String addrType = type.toUpperCase();
    InternetAddress[] address = null; 

    if(addrType.equals("TO")||addrType.equals("CC")||addrType.equals("BCC")){
      if(addrType.equals("TO")){
        address = (InternetAddress[]) msg.getRecipients(Message.RecipientType.TO);
      }
      if(addrType.equals("CC")){
        address = (InternetAddress[]) msg.getRecipients(Message.RecipientType.CC);
      }
      if(addrType.equals("BCC")){
        address = (InternetAddress[]) msg.getRecipients(Message.RecipientType.BCC);
      }
      if(address != null){
        for(int i=0;i<address.length;i++){
          String mail = address[i].getAddress();
          if(mail == null){
            mail = "";
          }else{
            mail = MimeUtility.decodeText(mail);
          }
          String personal = address[i].getPersonal();
          if(personal == null){
            personal = "";
          }else{
            personal = MimeUtility.decodeText(personal);
          }
          String compositeto = personal +"<"+mail+">";
          mailaddr += ","+compositeto;
        }
        mailaddr = mailaddr.substring(1);
      }
    }else{
      throw new RuntimeException("Error email Type!");
    }
    return mailaddr;
  } 

  /**
   * 获取邮件主题
   * @return
   * @throws UnsupportedEncodingException
   * @throws MessagingException
   */
  public String getSubject() throws UnsupportedEncodingException, MessagingException{
    String subject = "";
    subject = MimeUtility.decodeText(msg.getSubject());
    if(subject == null){
      subject = "";
    }
    return subject;
  } 

  /**
   * 获取邮件发送日期
   * @return
   * @throws MessagingException
   */
  public String getSendDate() throws MessagingException{
    Date sendDate = msg.getSentDate();
    SimpleDateFormat smd = new SimpleDateFormat(dateformate);
    return smd.format(sendDate);
  } 

  /**
   * 获取邮件正文内容
   * @return
   */
  public String getBodyText(){
    return bodytext.toString();
  } 

  /**
   * 解析邮件,将得到的邮件内容保存到一个stringBuffer对象中,
   * 解析邮件 主要根据MimeType的不同执行不同的操作,一步一步的解析
   * @param part
   * @throws MessagingException
   * @throws IOException
   */
  public void getMailContent(Part part) throws MessagingException, IOException{ 

    String contentType = part.getContentType();
    int nameindex = contentType.indexOf("name");
    boolean conname = false;
    if(nameindex != -1){
      conname = true;
    }
    System.out.println("CONTENTTYPE:"+contentType);
    if(part.isMimeType("text/plain")&&!conname){
      bodytext.append((String)part.getContent());
    }else if(part.isMimeType("text/html")&&!conname){
      bodytext.append((String)part.getContent());
    }else if(part.isMimeType("multipart/*")){
      Multipart multipart = (Multipart) part.getContent();
      int count = multipart.getCount();
      for(int i=0;i<count;i++){
        getMailContent(multipart.getBodyPart(i));
      }
    }else if(part.isMimeType("message/rfc822")){
      getMailContent((Part) part.getContent());
    } 

  } 

  /**
   * 判断邮件是否需要回执,如需回执返回true,否则返回false
   * @return
   * @throws MessagingException
   */
  public boolean getReplySign() throws MessagingException{
    boolean replySign = false;
    String needreply[] = msg.getHeader("Disposition-Notification-TO");
    if(needreply != null){
      replySign = true;
    }
    return replySign;
  } 

  /**
   * 获取此邮件的message-id
   * @return
   * @throws MessagingException
   */
  public String getMessageId() throws MessagingException{
    return msg.getMessageID();
  } 

  /**
   * 判断此邮件是否已读,如果未读则返回false,已读返回true
   * @return
   * @throws MessagingException
   */
  public boolean isNew() throws MessagingException{
    boolean isnew = false;
    Flags flags = ((Message)msg).getFlags();
    Flags.Flag[] flag = flags.getSystemFlags();
    System.out.println("flags's length:"+flag.length);
    for(int i=0;i<flag.length;i++){
      if(flag[i]==Flags.Flag.SEEN){
        isnew = true;
        System.out.println("seen message .......");
        break;
      }
    }
    return isnew;
  } 

  /**
   * 判断是是否包含附件
   * @param part
   * @return
   * @throws MessagingException
   * @throws IOException
   */
  public boolean isContainAttch(Part part) throws MessagingException, IOException{
    boolean flag = false; 

    //String contentType = part.getContentType();
    if(part.isMimeType("multipart/*")){
      Multipart multipart = (Multipart) part.getContent();
      int count = multipart.getCount();
      for(int i=0;i<count;i++){
        BodyPart bodypart = multipart.getBodyPart(i);
        String dispostion = bodypart.getDisposition();
        if((dispostion != null)&&(dispostion.equals(Part.ATTACHMENT)||dispostion.equals(Part.INLINE))){
          flag = true;
        }else if(bodypart.isMimeType("multipart/*")){
          flag = isContainAttch(bodypart);
        }else{
          String conType = bodypart.getContentType();
          if(conType.toLowerCase().indexOf("appliaction")!=-1){
            flag = true;
          }
          if(conType.toLowerCase().indexOf("name")!=-1){
            flag = true;
          }
        }
      }
    }else if(part.isMimeType("message/rfc822")){
      flag = isContainAttch((Part) part.getContent());
    } 

    return flag;
  } 

  /**
   * 保存附件
   * @param part
   * @throws MessagingException
   * @throws IOException
   */
  public void saveAttchMent(Part part) throws MessagingException, IOException{
    String filename = "";
    if(part.isMimeType("multipart/*")){
      Multipart mp = (Multipart) part.getContent();
      for(int i=0;i<mp.getCount();i++){
        BodyPart mpart = mp.getBodyPart(i);
        String dispostion = mpart.getDisposition();
        if((dispostion != null)&&(dispostion.equals(Part.ATTACHMENT)||dispostion.equals(Part.INLINE))){
          filename = mpart.getFileName();
          if(filename.toLowerCase().indexOf("gb2312")!=-1){
            filename = MimeUtility.decodeText(filename);
          }
          saveFile(filename,mpart.getInputStream());
        }else if(mpart.isMimeType("multipart/*")){
          saveAttchMent(mpart);
        }else{
          filename = mpart.getFileName();
          if(filename != null&&(filename.toLowerCase().indexOf("gb2312")!=-1)){
            filename = MimeUtility.decodeText(filename);
          }
          saveFile(filename,mpart.getInputStream());
        }
      } 

    }else if(part.isMimeType("message/rfc822")){
      saveAttchMent((Part) part.getContent());
    }
  }
  /**
   * 获得保存附件的地址
   * @return
   */
  public String getSaveAttchPath() {
    return saveAttchPath;
  }
  /**
   * 设置保存附件地址
   * @param saveAttchPath
   */
  public void setSaveAttchPath(String saveAttchPath) {
    this.saveAttchPath = saveAttchPath;
  }
  /**
   * 设置日期格式
   * @param dateformate
   */
  public void setDateformate(String dateformate) {
    this.dateformate = dateformate;
  }
  /**
   * 保存文件内容
   * @param filename
   * @param inputStream
   * @throws IOException
   */
  private void saveFile(String filename, InputStream inputStream) throws IOException {
    String osname = System.getProperty("os.name");
    String storedir = getSaveAttchPath();
    String sepatror = "";
    if(osname == null){
      osname = "";
    } 

    if(osname.toLowerCase().indexOf("win")!=-1){
      sepatror = "//";
      if(storedir==null||"".equals(storedir)){
        storedir = "d://temp";
      }
    }else{
      sepatror = "/";
      storedir = "/temp";
    } 

    File storefile = new File(storedir+sepatror+filename);
    System.out.println("storefile's path:"+storefile.toString()); 

    BufferedOutputStream bos = null;
    BufferedInputStream bis = null; 

    try {
      bos = new BufferedOutputStream(new FileOutputStream(storefile));
      bis = new BufferedInputStream(inputStream);
      int c;
      while((c= bis.read())!=-1){
        bos.write(c);
        bos.flush();
      }
    } catch (FileNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }finally{
      bos.close();
      bis.close();
    } 

  } 

  public void recive(Part part,int i) throws MessagingException, IOException{
    System.out.println("------------------START-----------------------");
    System.out.println("Message"+i+" subject:" + getSubject());
    System.out.println("Message"+i+" from:" + getFrom());
    System.out.println("Message"+i+" isNew:" + isNew());
    boolean flag = isContainAttch(part);
    System.out.println("Message"+i+" isContainAttch:" +flag);
    System.out.println("Message"+i+" replySign:" + getReplySign());
    getMailContent(part);
    System.out.println("Message"+i+" content:" + getBodyText());
    setSaveAttchPath("c://temp//"+i);
    if(flag){
      saveAttchMent(part);
    }
    System.out.println("------------------END-----------------------");
  }

}

邮件接收与工具类的使用,有好几种邮件接收的写法!:

看了很多网上其他代码,pop3Server的值是pop.mail.163.com,但是试了试不成功,还有 user的值既可以是带有 username@...com也可以是username。

如果收件邮箱是163邮箱,必须先登陆163邮箱中设置,开启pop3服务。至于别的邮箱暂不知道。

public static void main(String[] args) throws Exception {
    // 连接pop3服务器的主机名、协议、用户名、密码
    String pop3Server = "pop.163.com";
    String protocol = "pop3";
    String user = "username";
    String pwd = "password"; 

    // 创建一个有具体连接信息的Properties对象
    Properties props = new Properties();
    props.setProperty("mail.store.protocol", protocol);
    props.setProperty("mail.pop3.host", pop3Server); 

    // 使用Properties对象获得Session对象
    Session session = Session.getInstance(props);
    session.setDebug(true); 

    // 利用Session对象获得Store对象,并连接pop3服务器
    Store store = session.getStore();
    store.connect(pop3Server, user, pwd); 

    // 获得邮箱内的邮件夹Folder对象,以"只读"打开
    Folder folder = store.getFolder("inbox");
    folder.open(Folder.READ_ONLY); 

    // 获得邮件夹Folder内的所有邮件Message对象
    Message [] messages = folder.getMessages();
    ReciveMail rm = null;
    for(int i=0;i< messages.size() ;i++){
      rm = new ReciveMail((MimeMessage) messages[i]);
      rm.recive(messages[i],i);;
    }
     folder.close(false);
    store.close();
}
(0)

相关推荐

  • java中javamail发送带附件的邮件实现方法

    本文实例讲述了java中javamail发送带附件的邮件实现方法.分享给大家供大家参考.具体分析如下: JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输,JavaMail是可选包,因此如果需要使用的话你需要首先从java官网上下载.目前最新版本是JavaMail1.5.0,下面我们来看看javamail发送带附件的邮件实例 mail.java 代码: 复制代码 代码如下: package mail;

  • Java邮件发送程序(可以同时发给多个地址、可以带附件)

    发送邮件的主程序 import java.util.Properties; import common.util.Email_Autherticatorbean; import javax.mail.Authenticator; import javax.mail.internet.InternetAddress; import org.apache.commons.lang.StringUtils; import javax.mail.internet.MimeBodyPart; import

  • java mail使用qq邮箱发邮件的配置方法

    程序入口:Test_Email_N.java 复制代码 代码如下: import java.io.IOException;import java.util.Date;import java.util.Properties; import javax.mail.Authenticator;import javax.mail.BodyPart;import javax.mail.Message;import javax.mail.MessagingException;import javax.mai

  • Java Mail与Apache Mail发送邮件示例

    一.邮件简介 一封邮件由很多信息构成,主要的信息如下,其他的暂时不考虑,例如抄送等: 1.收件人:收件人的邮箱地址,例如xxx@xx.com 2.收件人姓名:大部分的邮件显示时都会显示,例如loadfate 779554589@qq.com 3.发件人:发件人的邮箱地址 4.发件人姓名: 5.主题:邮件的标题 6.内容及附件:邮件的主要内容 二.使用Java发邮件的通用步骤 一般的项目中没有单独的邮件服务器,一般情况下都是使用别人的服务器. 1.设置smtp服务器:不同的邮件服务器有不同的地址,

  • struts2集成javamail发邮件示例详解

    一.代码预览这两天在做struts2上的邮件发送.以前的项目有用到spring,用spring提供的邮件支持类很方便可以完成这个功能,但是现在只用struts2的话,就碰到了一系列的问题. 请先将自己下载的 mail.jar,及activation.jar加入到classpath 复制代码 代码如下: package com.nerve.cloudoffice.common.util; import java.util.List;import java.util.Properties; impo

  • java发送javax.mail邮件实例讲解

    平时我们网上逛网站的时候,经常会用到网站的注册.有很多方法,比如发短信验证,发邮箱验证.最近在SSH框架下,做了一个简单的邮件发送激活链接到邮箱,然后激活注册用户的一个功能.我用到的MailServer是易邮邮件服务器,引用的是javax.mail.jar包.javamail顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输. [常用类介绍] 下面有一些常用的类,给大家介绍一下: [Authenticator] 这个是

  • java发送邮件的具体实现

    首先是继承自javax.mail.Authenticator的一个具体类.getPasswordAuthentication()方法也就是构建一个PasswordAuthentication对象并返回,有点费解JAVA Mail这样的设计意图,可能javax.mail.Authenticator为我们提供了附加的保证安全的验证措施吧. 复制代码 代码如下: package com.mzule.simplemail; import javax.mail.Authenticator;import j

  • java 发送邮件的实例代码(可移植)

    以一个web项目为例,代码是可以移植的 首先要导入mail.jar包,然后创建自己的类 1:HTMLSender类 复制代码 代码如下: package com.txq.mail; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.NoSuchProviderException; import javax.mail.Sess

  • javax.mail.SendFailedException: Sending failed问题原因

    最近一直在使用邮件发送功能,老是遇到问题,后面才找到,原来并不是程序问题引起的,我吧问题整出来, javax.mail.SendFailedException: Sending failed; nested exception is: class javax.mail.MessagingException: 554 MI:STC 0,smtp10,DsCowLC7LwPACzRN7qcQAA--.2883S2 1295256512 at javax.mail.Transport.send0(Tr

  • java Mail邮件接收工具类

    下面是一个邮件接收的工具类,有点长!!! public class ReciveMail { private MimeMessage msg = null; private String saveAttchPath = ""; private StringBuffer bodytext = new StringBuffer(); private String dateformate = "yy-MM-dd HH:mm"; public ReciveMail(Mime

  • Java实现的分页工具类与用法示例

    本文实例讲述了Java实现的分页工具类与用法.分享给大家供大家参考,具体如下: 今天闲来没事,写了一个页面的分页工具类,具有很好的兼容性与实用性哦. 不管怎么样,先来瞧一瞧: package com.bw.utils; /** * 分页工具类 * * @author H.ros * */ public class PageUtils2 { // 当前页(从页面获取的当前页码,未计算) private int currentPage; // 前一页 private int prevPage; //

  • java实现的正则工具类

    本文实例讲述了java实现的正则工具类.分享给大家供大家参考.具体如下: 这里实现的正则工具类适用于:正则电话号码.邮箱.QQ号码.QQ密码.手机号 java代码如下: package com.zhanggeng.contact.tools; /** * RegexTool is used to regex the string ,such as : phone , qq , password , email . * * @author ZHANGGeng * @version v1.0.1 *

  • Java常用的时间工具类实例

    本文实例讲述了Java常用的时间工具类.分享给大家供大家参考,具体如下: package org.zhy.date; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; /** * 时间类型工具类 * * @author zhengyi * */ pu

  • Java TokenProcessor令牌校验工具类

    关于TokenProcessor令牌校验工具类废话不多说了,直接给大家贴代码了,一切内容就在下面一段代码中,具体代码详情如下所示: public class TokenProcessor { private long privious;// 上次生成表单标识号得时间值 private static TokenProcessor instance = new TokenProcessor(); public static String FORM_TOKEN_KEY = "FORM_TOKEN_KE

  • 详解JAVA中使用FTPClient工具类上传下载

    详解JAVA中使用FTPClient工具类上传下载 在Java程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件.本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件. 1.写一个javabean文件,描述ftp上传或下载的信息 实例代码: public class FtpUseBean { private String host; private Integer port; private String us

  • Java基础之java处理ip的工具类

    java处理ip的工具类,包括把long类型的Ip转为一般Ip类型.把xx.xx.xx.xx类型的转为long类型.根据掩码位获取掩码.根据 ip/掩码位 计算IP段的起始IP.根据 ip/掩码位 计算IP段的终止IP等方法,可以直接使用! 复制代码 代码如下: package com.hh.test; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang3.StringUtils; /**

  • Java实现的汉语拼音工具类完整实例

    本文实例讲述了Java实现的汉语拼音工具类.分享给大家供大家参考,具体如下: package test; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; import net.sourceforge.piny

  • Java 中DateUtils日期工具类的实例详解

    Java 中DateUtils日期工具类的实例详解 介绍 在java中队日期类型的处理并不方便,通常都需要借助java.text.SimpleDateFormat类来实现日期类型 和字符串类型之间的转换,但是在jdk1.8之后有所改善,jdk1.7以及之前的版本处理日期类型并不方便, 可以借助Joda Time组件来处理,尤其是日期类型的一些数学操作就更是不方便. java代码 /** * * 日期工具类 java对日期的操作一直都很不理想,直到jdk1.8之后才有了本质的改变. * 如果使用的

  • Java生成图形验证码工具类

    生成验证码效果 ValidateCode.java 验证码生成类 package cn.dsna.util.images; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.FileOutputStream; import java.io.IOException; import java.io.Ou

随机推荐