`

java 接收、解析邮件实例(三)

阅读更多
package com.prase.email.four;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;

import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;

public class PraseMimeMessage{
	
 private MimeMessage mimeMessage=null;
 private String saveAttachPath="";//附件下载后的存放目录
 private  StringBuffer bodytext=new StringBuffer();
 //存放邮件内容的StringBuffer对象
 private String dateformat="yy-MM-dd HH:mm";//默认的日前显示格式
  /**
  * 构造函数,初始化一个MimeMessage对象
  */
 public PraseMimeMessage() {
 }
 public PraseMimeMessage(MimeMessage mimeMessage) {
  this.mimeMessage=mimeMessage;
 }
 public void setMimeMessage(MimeMessage mimeMessage){
  this.mimeMessage=mimeMessage; 
 }
 /**
  * 获得发件人的地址和姓名
  */
 public String getFrom1()throws Exception{
  InternetAddress address[]=(InternetAddress[])mimeMessage.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"---密送人地址  
  * @throws Exception */
 public String getMailAddress(String type){
  String mailaddr="";
  try {  
   String addtype=type.toUpperCase();
   InternetAddress []address=null;
   if(addtype.equals("TO")||addtype.equals("CC")||addtype.equals("BBC")){
    if(addtype.equals("TO")){
     address=(InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.TO);
    }
    else if(addtype.equals("CC")){
     address=(InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.CC);
    }
    else{
     address=(InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.BCC);
    }
    if(address!=null){
     for (int i = 0; i < address.length; i++) {
      String email=address[i].getAddress();
      if(email==null)email="";
      else{
       email=MimeUtility.decodeText(email);
      }
      String personal=address[i].getPersonal();
      if(personal==null)personal="";
      else{
       personal=MimeUtility.decodeText(personal);
      }
      String compositeto=personal+"<"+email+">";
      mailaddr+=","+compositeto;
     }
     mailaddr=mailaddr.substring(1);
    }
   }
   else{
   }
  } catch (Exception e) {
   // TODO: handle exception
  } 
  return mailaddr;
 }
 /**
   * 获得邮件主题   
  */
 public String getSubject()
 {
  String subject="";
  try {
   subject=MimeUtility.decodeText(mimeMessage.getSubject());
   if(subject==null)subject="";
  } catch (Exception e) {
   // TODO: handle exception
  }
  return subject;
 }
 /**
   * 获得邮件发送日期
   */
 public String getSendDate()throws Exception{
  Date senddate=mimeMessage.getSentDate();
  SimpleDateFormat format=new SimpleDateFormat(dateformat);
  return format.format(senddate);
 }
 /**
   * 解析邮件,把得到的邮件内容保存到一个StringBuffer对象中,解析邮件
   * 主要是根据MimeType类型的不同执行不同的操作,一步一步的解析
   */
 public void getMailContent(Part part)throws Exception{
  String contenttype=part.getContentType();
  int nameindex=contenttype.indexOf("name");
  boolean conname=false;
  if(nameindex!=-1)conname=true;
  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 counts=multipart.getCount();
   for(int i=0;i<counts;i++){
    getMailContent(multipart.getBodyPart(i));
   }
  }else if(part.isMimeType("message/rfc822")){
   getMailContent((Part)part.getContent());
  }
  else{}
 }
 /**
  * 获得邮件正文内容
   */
 public String getBodyText(){ 
  return bodytext.toString();
 }
 /**
   * 判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false"
   
  * @throws MessagingException */
 public boolean getReplySign() throws MessagingException{
  boolean replysign=false;
  String needreply[]=mimeMessage.getHeader("Disposition-Notification-To");
  if(needreply!=null){
   replysign=true;
  }
  return replysign;
 }
 /**
  * 获得此邮件的Message-ID   
  * @throws MessagingException */
 public String getMessageId() throws MessagingException{
  return mimeMessage.getMessageID();
 }
 
 /**
  * 【判断此邮件是否已读,如果未读返回返回false,反之返回true】   
  * @throws MessagingException */
 public boolean isNew() throws MessagingException{
  boolean isnew =false;
  Flags flags=((Message)mimeMessage).getFlags();
  Flags.Flag[]flag=flags.getSystemFlags();
  for (int i = 0; i < flag.length; i++) {
   if(flag[i]==Flags.Flag.SEEN){
    isnew=true;
    break;
   }
  }
  return isnew;
 }
 /**
  * 判断此邮件是否包含附件  
  * @throws MessagingException */
 public boolean isContainAttach(Part part) throws Exception{
  boolean attachflag=false;
  String contentType=part.getContentType();
  if(part.isMimeType("multipart/*")){
   Multipart mp=(Multipart)part.getContent();
   //获取附件名称可能包含多个附件
   for(int j=0;j<mp.getCount();j++){
    BodyPart mpart=mp.getBodyPart(j);
    String disposition=mpart.getDescription();
    if((disposition!=null)&&((disposition.equals(Part.ATTACHMENT))||(disposition.equals(Part.INLINE)))){
     attachflag=true;
    }else if(mpart.isMimeType("multipart/*")){
     attachflag=isContainAttach((Part)mpart);
    }else{
     String contype=mpart.getContentType();
     if(contype.toLowerCase().indexOf("application")!=-1) attachflag=true;
     if(contype.toLowerCase().indexOf("name")!=-1) attachflag=true;
    }
   }
  }else if(part.isMimeType("message/rfc822")){
   attachflag=isContainAttach((Part)part.getContent());
  }
  return attachflag;
 }
 /**
  * 【保存附件】  
  * @throws Exception
  * @throws IOException
  * @throws MessagingException
  * @throws Exception */
 public void saveAttachMent(Part part) throws Exception {
  String fileName="";
  if(part.isMimeType("multipart/*")){
   Multipart mp=(Multipart)part.getContent();
   for(int j=0;j<mp.getCount();j++){
    BodyPart mpart=mp.getBodyPart(j);
    String disposition=mpart.getDescription();
    if((disposition!=null)&&((disposition.equals(Part.ATTACHMENT))||(disposition.equals(Part.INLINE)))){
     fileName=mpart.getFileName();
     if(fileName.toLowerCase().indexOf("GBK")!=-1){
      fileName=MimeUtility.decodeText(fileName);
     }
     saveFile(fileName,mpart.getInputStream());
    }
    else if(mpart.isMimeType("multipart/*")){
     fileName=mpart.getFileName();   
    }
    else{
     fileName=mpart.getFileName();
     if((fileName!=null)){
      fileName=MimeUtility.decodeText(fileName);
      saveFile(fileName,mpart.getInputStream());
     }
    }
   }
  }
  else if(part.isMimeType("message/rfc822")){
   saveAttachMent((Part)part.getContent());
  }
 }
 /**
  * 【设置附件存放路径】
  */
 public void setAttachPath(String attachpath){
  this.saveAttachPath=attachpath;
 }
 
 /**
  * 【设置日期显示格式】
  */
 public void setDateFormat(String format){
  this.dateformat=format;
 }

 /**
  * 【获得附件存放路径】
  */
 
 public String getAttachPath()
 {
  return saveAttachPath;
 }
 /**
  * 【真正的保存附件到指定目录里】
  */
 private void saveFile(String fileName,InputStream in)throws Exception{
  String osName=System.getProperty("os.name");
  String storedir=getAttachPath();
  String separator="";
  if(osName==null)osName="";
  if(osName.toLowerCase().indexOf("win")!=-1){
   //如果是window 操作系统
   separator="/";
   if(storedir==null||storedir.equals(""))storedir="c:\tmp";
  }
  else{
   //如果是其他的系统
   separator="/";
   storedir="/tmp";
  }
  File strorefile=new File(storedir+separator+fileName);
  BufferedOutputStream bos=null;
  BufferedInputStream bis=null;
  try {
   bos=new BufferedOutputStream(new FileOutputStream(strorefile));
   bis=new BufferedInputStream(in);
   int c;
   while((c=bis.read())!=-1){
    bos.write(c);
    bos.flush();
   }
  } catch (Exception e) {
   // TODO: handle exception
  }finally{
   bos.close();
   bis.close();
  }
 }
 /**
  * PraseMimeMessage类测试
  
  * @throws Exception */
 public static void main(String[] args) throws Exception {
//  String host="mail.21gmail.com";
//  String username="fjj0@21gmail.com";
//  String password="123456789";
  
  Properties props=new Properties();
  
//使用网络代理
  props.setProperty("proxySet","true");
  props.setProperty("ProxyHost","10.24.5.105");
  props.setProperty("ProxyPort","39002"); 
  
  Session session=Session.getDefaultInstance(props,null);
  Store store=session.getStore("pop3");
  store.connect(host,username,password);
  Folder folder=store.getFolder("INBOX");
  folder.open(Folder.READ_ONLY);
  Message message[]=folder.getMessages();
  PraseMimeMessage pmm=null;
  for (int i = 0; i < message.length; i++) {
   System.out.println("****************************************第"+(i+1)+"封邮件**********************************");
   pmm=new PraseMimeMessage((MimeMessage)message[i]);
   System.out.println("主题 :"+pmm.getSubject());
   pmm.setDateFormat("yy年MM月dd日 HH:mm");
   System.out.println("发送时间 :"+pmm.getSendDate());
   System.out.println("是否回执 :"+pmm.getReplySign());
   System.out.println("是否包含附件 :"+pmm.isContainAttach((Part)message[i]));
   System.out.println("发件人 :"+pmm.getFrom1());
   System.out.println("收件人 :"+pmm.getMailAddress("TO"));
   System.out.println("抄送地址 :"+pmm.getMailAddress("CC"));
   System.out.println("密送地址 :"+pmm.getMailAddress("BCC"));    
   System.out.println("邮件ID :"+i+":"+pmm.getMessageId());
   pmm.getMailContent((Part)message[i]);  //根据内容的不同解析邮件
   pmm.setAttachPath("d:/temp");  //设置邮件附件的保存路径
   pmm.saveAttachMent((Part)message[i]); //保存附件
   System.out.println("邮件正文 :"+pmm.getBodyText());
   System.out.println("*********************************第"+(i+1)+"封邮件结束*************************************");
  }
 }
}
1
4
分享到:
评论

相关推荐

    Java查询OutLook邮件代码

    它包括了 javax.mail 和 javax.mail.internet 包,这两个包提供了发送、接收邮件以及解析邮件内容的类和接口。例如,`Session` 类用于设置邮件服务器的配置,`Store` 类用于连接邮箱并获取邮件,`Folder` 类用于操作...

    java收发邮件完整版

    这个"java收发邮件完整版"项目提供了一个完整的Java邮件发送和接收的解决方案,确保用户可以顺利地通过编程方式处理电子邮件。在这个压缩包中,可能包含了一个或多个Java源代码文件,例如"71112303梁洁"和"71112418...

    JAVA100例之实例48 使用JavaMail接收邮件

    以上就是关于"JAVA100例之实例48 使用JavaMail接收邮件"的主要内容,通过学习和实践这个实例,开发者将能够熟练地使用JavaMail API来实现邮件的接收功能,这对于构建自动化邮件系统或者处理邮件相关的业务需求非常有...

    Java使用SOAP获取webservice实例解析

    ### Java使用SOAP获取WebService实例解析 #### WebService简介 WebService是一种跨编程语言和操作系统平台的、在网络上进行数据交换的一种方式。它使用标准的Internet协议,如HTTP、XML、SOAP等来实现不同系统间的...

    银联iso8583简单解析实例(java)

    本文将深入探讨如何在Java环境中解析银联ISO8583报文,以及如何通过提供的代码示例`Iso8583Util.java`和`Helloworld.java`进行实践。 ISO8583协议定义了一个固定长度的报文结构,包含了多个字段,每个字段都有其...

    JAVA100例之实例46 使用SMTP协议接收邮件

    实例46中可能具体展示了如何将上述步骤整合到一个完整的Java程序中,包括异常处理和更复杂的情况,如解析邮件附件、处理HTML内容等。这个实例对于学习和理解Java邮件处理是非常有价值的,可以加深对SMTP协议及...

    Java_Modbus的操作(实例)

    Java ModBus 操作实例主要涉及了使用Java进行ModBus通信以及串口通信的过程。ModBus是一种广泛应用的工业通信协议,常用于PLC、数采仪等设备之间进行数据交换。在Java环境中,开发者需要实现相应的功能来与这些设备...

    java邮件开发实例

    ### Java邮件开发实例知识点 #### 一、Java邮件发送机制概览 在Java开发中,邮件功能是非常实用的一项技术,可以用于用户注册验证、找回密码等场景。本篇将通过一个具体的实例——“Java邮件开发实例”,来详细...

    Java发送邮件实例源代码

    JavaMail API是一个开源库,它允许开发者通过Java程序发送和接收电子邮件。在本实例中,我们需要两个关键的库:`mail.jar`和`activation.jar`,这两个JAR文件提供了JavaMail所需的功能。 首先,确保你的项目已经...

    JavaModbus的操作(实例).pdf

    在本实例中,我们使用了三个主要的类:DB.java、Test.java和CRC16.java。DB.java用于获取实时数据并将其保存到数据库中,Test.java用于接收数采仪数据并将其发送到ModBus,CRC16.java用于计算CRC16校验码。 2. Test...

    java发送邮件_实例.doc

    本文将基于提供的“java发送邮件_实例.doc”文件,深入探讨Java发送邮件的核心技术和实践方法。 #### Mail.jar包的重要性 首先,成功发送邮件的关键之一是下载并正确配置`Mail.jar`包。`Mail.jar`是JavaMail API的...

    Java实现解析dcm医学影像文件并提取文件信息的方法示例

    本文主要介绍了Java实现解析dcm医学影像文件并提取文件信息的方法,结合实例形式分析了Java基于第三方库文件针对dcm医学影像文件的解析操作相关实现技巧。下面将详细介绍该方法的实现步骤和相关知识点。 一、安装...

    java Udp 收发结构体实例 Socket编程

    总结来说,Java UDP收发结构体实例和Socket编程涉及创建`DatagramSocket`,构造`DatagramPacket`,进行数据的发送和接收。了解这些基本概念和操作对于进行Java UDP通信至关重要。在实际应用中,我们需要考虑数据的分...

    HL7解析 Java

    在Java中,HL7解析通常涉及使用HAPI(HL7 Application Programming Interface)库。HAPI是Java平台上的一个开源框架,它提供了对HL7 v2.x消息的强大支持,包括解析、创建和验证HL7消息。HAPI不仅简化了HL7消息处理,...

    java邮件收发系统

    Java邮件收发系统是一种利用Java编程语言实现的软件,它能够模拟类似微软Outlook的邮件管理功能,包括发送、接收邮件以及执行其他辅助任务。在Java中,这通常通过使用JavaMail API来实现,该API提供了处理SMTP(简单...

    javaMail发送和接收邮件

    JavaMail 是一个开源的 Java 库,用于在 Java 应用程序中发送和接收电子邮件。它提供了丰富的 API,使得开发者可以方便地与各种邮件服务器进行交互,支持 SMTP、POP3 和 IMAP 协议。本篇文章将深入探讨 JavaMail 的...

    JAVA版的iec61850实例

    1. **监听与响应**:服务端需要监听客户端的连接请求,并根据MMS协议解析接收到的报文。 2. **数据提供**:当接收到读请求时,服务端应返回对应数据对象的值;对于写请求,更新数据并确认操作。 3. **数据发布**:...

    java中email邮件发送接受和处理excel文件(xls)实例

    在Java编程环境中,电子邮件的发送、接收以及处理Excel文件(XLS格式)是常见的任务,尤其是在数据处理和自动化流程中。下面将详细讲解这两个主要功能的实现。 首先,让我们来看看如何使用Java发送电子邮件。...

    java web 二维码生成与解析实例

    总结来说,这个Java Web二维码生成与解析实例涵盖了Java编程、Web开发、二维码编码解码以及HTTP服务处理等多个技术领域。通过实践这个实例,开发者不仅可以掌握基础的二维码操作,还能深入理解Java Web应用的开发...

Global site tag (gtag.js) - Google Analytics