用Javamail写的邮件接收程序

前段时间一直忙于学校里面的事情,没有时间静下心来写接收邮件的程序,现在学校里的事情终于忙完了,可以静下心里做自己喜欢做的事情了,这种感觉真的很好!

对我自己而言,刚开始在用JavaMail来编写收邮件的程序时最重要和最难的要数解析附件和邮件正文的部分,因为Mime类型实在是太多了!下面的这段代码是我自己学习JavaMail的一段体会,供大家来参考(请高手指教,有什么更好的办法,请回复此文章),具体代码如下:

package coffeecatwebmail;
import java.io.*;
import java.text.*;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
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;
  System.out.println("create a PraseMimeMessage object........");
 }
 public void setMimeMessage(MimeMessage mimeMessage){
  this.mimeMessage = mimeMessage;
 }
/**
 * 获得发件人的地址和姓名
 */
 public String getFrom()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"---密送人地址
 */
 public String getMailAddress(String type)throws Exception{
  String mailaddr = "";
  String addtype = type.toUpperCase();
  InternetAddress []address = null;
  if(addtype.equals("TO") || addtype.equals("CC") ||addtype.equals("BCC")){
   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{
   throw new Exception("Error emailaddr type!");
   }
   return mailaddr;
  }
 /**
  * 获得邮件主题
  */
  public String getSubject()throws MessagingException{
   String subject = "";
   try{
    subject = MimeUtility.decodeText(mimeMessage.getSubject());
    if(subject == null) subject="";
   }catch(Exception exce){
   }
   return subject;
  }
 /**
  * 获得邮件发送日期
  */
  public String getSentDate()throws Exception{
    Date sentdate = mimeMessage.getSentDate();
    SimpleDateFormat format = new SimpleDateFormat(dateformat);
    return format.format(sentdate);
  }
 /**
  * 获得邮件正文内容
  */
  public String getBodyText(){
   return bodytext.toString();
  }
 /**
  * 解析邮件,把得到的邮件内容保存到一个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;
     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 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{}
    }
 /**
  * 判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false"
  */
  public boolean getReplySign()throws MessagingException{
    boolean replysign = false;
    String needreply[] = mimeMessage.getHeader("Disposition-Notification-To");
    if(needreply != null){
     replysign = true;
    }
    return replysign;
  }
 /**
  * 获得此邮件的Message-ID
  */
  public String getMessageId()throws MessagingException{
   return mimeMessage.getMessageID();
  }
 /**
  * 【判断此邮件是否已读,如果未读返回返回false,反之返回true】
  */
  public boolean isNew()throws MessagingException{
   boolean isnew = false;
   Flags flags = ((Message)mimeMessage).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;
 }
/**
 * 判断此邮件是否包含附件
 */
 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 i=0;i<mp.getCount();i++){
    BodyPart mpart = mp.getBodyPart(i);
    String disposition = mpart.getDisposition();
    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;
 }
/**
 * 【保存附件】
 */
 public void saveAttachMent(Part part)throws Exception{
  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 disposition = mpart.getDisposition();
    if((disposition != null) &&((disposition.equals(Part.ATTACHMENT)) ||(disposition.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/*")){
 saveAttachMent(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")){
  saveAttachMent((Part)part.getContent());
}
}
/**
 * 【设置附件存放路径】
 */
 public void setAttachPath(String attachpath){
  this.saveAttachPath = attachpath;
 }
/**
 * 【设置日期显示格式】
 */
 public void setDateFormat(String format)throws Exception{
   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){
    separator = "\\"
  if(storedir == null || storedir.equals("")) storedir="c:\\tmp";
  }else{
   separator = "/";
   storedir = "/tmp";
  }
  File storefile = new File(storedir+separator+fileName);
  System.out.println("storefile's path: "+storefile.toString());
 //for(int i=0;storefile.exists();i++){
 //storefile = new File(storedir+separator+fileName+i);
 //}
 BufferedOutputStream bos = null;
 BufferedInputStream  bis = null;
 try{
  bos = new BufferedOutputStream(new FileOutputStream(storefile));
  bis = new BufferedInputStream(in);
  int c;
  while((c=bis.read()) != -1){
    bos.write(c);
    bos.flush();
  }
 }catch(Exception exception){
   exception.printStackTrace();
   throw new Exception("文件保存失败!");
 }finally{
   bos.close();
   bis.close();
 }
}
/**
 * PraseMimeMessage类测试
 */
 public static void main(String args[])throws Exception{
  String host = "主机名/ip";     //【pop.mail.yahoo.com.cn】
  String username ="用户名";     //【wwp_1124】
  String password ="密码";       //【........】
  Properties props = new Properties();
  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();
  System.out.println("Messages's length: "+message.length);
  PraseMimeMessage pmm = null;
  for(int i=0;i<message.length;i++){
   pmm = new PraseMimeMessage((MimeMessage)message[i]);
   System.out.println("Message "+i+" subject: "+pmm.getSubject());
   System.out.println("Message "+i+" sentdate: "+pmm.getSentDate());
   System.out.println("Message "+i+" replysign: "+pmm.getReplySign());
   System.out.println("Message "+i+" hasRead: "+pmm.isNew());
   System.out.println("Message "+i+"  containAttachment: "+pmm.isContainAttach((Part)message[i]));
   System.out.println("Message "+i+" form: "+pmm.getFrom());
   System.out.println("Message "+i+" to: "+pmm.getMailAddress("to"));
   System.out.println("Message "+i+" cc: "+pmm.getMailAddress("cc"));
   System.out.println("Message "+i+" bcc: "+pmm.getMailAddress("bcc"));
   pmm.setDateFormat("yy年MM月dd日 HH:mm");
   System.out.println("Message "+i+" sentdate: "+pmm.getSentDate());
   System.out.println("Message "+i+" Message-ID: "+pmm.getMessageId());
   pmm.getMailContent((Part)message[i]);
   System.out.println("Message "+i+" bodycontent: \r\n"+pmm.getBodyText());
   pmm.setAttachPath("c:\\tmp\\coffeecat1124");
   pmm.saveAttachMent((Part)message[i]);
  }
 }
}

上面就是用JavaMail来解析MimeMessage的具体程序代码,具体使用方法参考main方法里的测试代码,请大家在看过之余多提宝贵的意见,共同学习,共同成长!!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, 邮件
, import
, public
, address
java收邮件
javamail接收邮件、javamail接收qq邮件、javamail邮件接收过程、spring mail 接收邮件、apache mail 接收邮件,以便于您获取更多的相关知识。

时间: 2024-09-28 03:49:53

用Javamail写的邮件接收程序的相关文章

JavaMail:简单的邮件接收程序

实现了 JavaMail 中邮件内容的创建.邮件的发送,现在就看看怎样接收邮件了. 邮件的接收与邮件的发送的基本操作步骤很类似,邮件的发送需要用到 Transport 类,邮件的接收则需要使用 Store 类,而不管是发送还是接收, Session 类和 Properties 类都是必需的.使用 Properties 对象设置连接 SMTP 服务器. POP3 服务器的主机名.协议等,通过 Properties 对象获取应用于整个邮件程序所必须的 Session 对象,它保存了建立网络连接的会话

为什么我写的邮件发送程序中只能发送英文字符串,而发送的汉字用邮箱接收显示的是乱码,

问题描述 我写的邮件发送程序,是把邮件内容用UTF8转换成字节序列,然后通过NetworkStram发送出去.可我用邮箱接收发送的邮件时,英文字符串可以正确显示,汉字就显示的是乱码.帮解决下,谢谢~ 解决方案 解决方案二:那你再换成别的格式试试看,不要先转换!解决方案三:编码有问题,,换成GB2132试试解决方案四:用gb2312..简体中文一般用这个.

运用C#实现POP3邮件接收程序

程序 微软的VS.Net开发工具推出已有一段时日了,其中的那门新语言C#也日渐为大家所熟悉并接受.C#作为一门新兴的语言相信具有传统语言不可比拟的优越性,特别是在网络应用方面,开发者更是感觉到了C#的强大功能.所以本文就通过运用C#来实现一个基于POP3协议的邮件接收程序来向大家展示C#网络编程的功能强大,同时也向大家介绍一下基于POP3协议的电子邮件接收原理. 首先我向大家介绍邮件接收的基本原理: 一开始便是客户端与服务器的连接.不过,在客户端连接到服务器之前,注意把端口设为POP3协议默认的

一段邮件接收程序代码

问题描述 大家好,我的这段代码是用c#实现的基于POP3协议的邮件接收程序的网络编程.现在其中的一个功能是完成"把邮件服务器设置成pop.sina.com,在输入用户名和密码后,单击连接按钮来与服务器进行连接"但是当我单击了之后,却没有反映,这是怎么回事啊,大家帮我看看这段代码,看看问题出在哪里? privatevoidConnect_Click(objectsender,EventArgse){//将光标置为等待状态Cursorcr=Cursor.Current;Cursor.Current=

基于JAVAMAIL包的邮件发送程序----kangkang

程序      JavaMail API 是一个用于阅读.编写和发送电子消息的可选包(标准扩展),可以用来建立基于标准的电子邮件客户机,它配置了各种因特网邮件协,包括SMTP .POP .IMAP和 MIME ,还包括相关的 NNTP .S/MIME 及其它协议.通常开发JavaMail 程序还需要有Sun 的JavaBeans Activation Framework (JAF ).JavaBeans Activation Framework 的运行很复杂,这里简单的说就是JavaMail 的

JavaMail实现email邮件发送程序代码

JavaMail 的基础知识使用JavaMail 是发送电子邮件所需要的组件. JavaMail 的机构使处理电子邮件非常容易.下面列出了一些我们需要的类: 1.Properties JavaMail 需要Properties 来创建一个session 对象.它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机,如: Properties props = new Properties (); props.put("mail.smtp.host",

我正在用C#写一个邮件客户端程序,不知道如何下手,请高手帮忙!!

问题描述 如题,提供源码也可.但要全.邮箱sxliang04@163.com谢谢!! 解决方案 解决方案二:http://www.blogjava.net/blogpig/archive/2006/10/21/76581.html

利用JavaMail API编写邮件发关程序

随着互联网的发展和计算机应用的普及,电子邮件越来越成为一种重要的通信方式.目前,有多种开发工具可以编制邮件发送程序,其中以利用JavaMail API编程最为简单.本文通过一个完整的例子介绍如何通过JavaMail API编制邮件发送程序.没有装载JavaMail API的读者,可以到www.javasoft.com站点下载JavaMail API 1.2或JavaMail API 1.3, 并按照Readme.txt设置好ClassPath.例子代码如下: import java.util.*

用JavaMail API编写可带附件的邮件发送程序

程序 利用Sun公司提供的JavaMail API可以很方便的开发邮件发送程序.也许你已经可以利用它来发送一段简单的文本了,但想不想使你的程序像OUTLOOK一样也能发送附件呢?本文在简单介绍了JavaMail之后,详细讲解了一段完整的送信的JavaBean及一个十分轻巧的servlet. (没有装载JavaMail API的读者,可以到此站点下载,并按照Readme.txt设置好ClassPath) 一.JavaMail中一些我们需要的类 1.Properties JavaMail需要Prop