java Mail邮件接收工具类

作者:junjie 时间:2022-04-24 14:17:17 

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


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();
}
标签:java,Mail,邮件,接收,工具类
0
投稿

猜你喜欢

  • 详解java操作Redis数据库的redis工具(RedisUtil,jedis工具JedisUtil,JedisPoolUtil)

    2023-07-29 11:31:36
  • IDEA远程连接HBase及其Java API实战详解

    2023-11-27 21:54:46
  • java生成XML的方法

    2023-08-12 11:45:46
  • Android四种数据存储的应用方式

    2023-07-25 05:01:06
  • java代码执行字符串中的逻辑运算方法

    2023-11-29 12:13:06
  • java 文件上传到读取文件内容的实例

    2023-11-09 22:00:27
  • 浅析Java线程的中断机制

    2023-11-19 20:11:50
  • Flutter网络请求的3种简单实现方法

    2023-06-21 10:53:22
  • Android实现登录注册功能

    2023-07-31 09:35:44
  • opencv实现轮廓高斯滤波平滑

    2023-07-23 02:05:56
  • Spring中自定义数据类型转换的方法详解

    2022-10-09 02:56:51
  • AndroidStduio3.0 使用gradle将module打包jar文件的方法

    2023-07-01 06:57:20
  • jQuery 动画效果代码分享

    2023-11-24 00:10:12
  • mybatis-plus生成mapper扩展文件的方法

    2023-08-10 07:29:05
  • Java基于zxing生成二维码矩阵过程解析

    2023-11-23 06:04:06
  • 一文带你学会Spring JDBC的使用

    2023-11-29 17:05:34
  • Flutter WillPopScope拦截返回事件原理示例详解

    2023-07-19 12:53:35
  • Tomcat 实现WebSocket详细介绍

    2023-08-12 21:22:11
  • ShardingSphere数据分片算法及测试实战

    2023-11-28 02:23:03
  • SpringBoot 将配置文件挂到 jar 包外面的操作方法

    2023-11-17 11:09:32
  • asp之家 软件编程 m.aspxhome.com