JSP虚拟主机,jsp空间,java空间,java虚拟空间JSP虚拟主机,jsp空间,java空间,java虚拟空间

Javamail操作指南(二)



作者:    文章来源:
发布日期:2007年04月17日
Bromon原创 请尊重版权
 二、 邮件的收取 

 通常情况下我们都使用pop3协议来收邮件,IMAP嘛现在就不涉及了。收邮件的功能虽然我用了很多时间才基本搞清楚,不过讲起来就so easy了,一个程序就可以基本包括。

 邮件大致可以分三种:纯文本邮件、含有其他数据的文本邮件、含有附件的邮件。

 
  1. /*
  2.  * Created on 2004-4-26
  3.  */
  4.  package org.bromon.mail;
  5.  import javax.mail.*;
  6.  import java.util.*;
  7.  import java.io.*;
  8.  /**
  9.  * @author Bromon
  10.  */
  11.  public class Receiver
  12.  {
  13.  Folder inbox;
  14.  Store store;
  15.  //连接邮件服务器,获得所有邮件的列表
  16.  public Message[] getMail(String host,String name,String password) throws Exception
  17.  {
  18.   Properties prop=new Properties();
  19.   prop.put("mail.pop3.host",host);
  20.   Session session=Session.getDefaultInstance(prop);
  21.   store=session.getStore("pop3");
  22.   store.connect(host,name,password);
  23.   
  24.   inbox=store.getDefaultFolder().getFolder("INBOX");
  25.   inbox.open(Folder.READ_ONLY);
  26.   
  27.   Message[] msg=inbox.getMessages();
  28.   
  29.   FetchProfile profile=new FetchProfile();
  30.   profile.add(FetchProfile.Item.ENVELOPE);
  31.   inbox.fetch(msg,profile);
  32.   
  33.   return(msg);
  34.  }
  35.  //处理任何一种邮件都需要的方法
  36.  private void handle(Message msg) throws Exception
  37.  {
  38.   System.out.println("邮件主题:"+msg.getSubject());
  39.   System.out.println("邮件作者:"+msg.getFrom()[0].toString());
  40.   System.out.println("发送日期:"+msg.getSentDate());
  41.  }
  42.  //处理文本邮件
  43.  public void handleText(Message msg) throws Exception
  44.  {
  45.   this.handle(msg);
  46.   System.out.println("邮件内容:"+msg.getContent());
  47.  }
  48.  //处理Multipart邮件,包括了保存附件的功能
  49.  public void handleMultipart(Message msg) throws Exception
  50.  {
  51.   String disposition;
  52.   BodyPart part;
  53.   
  54.   Multipart mp=(Multipart)msg.getContent();
  55.   int mpCount=mp.getCount();//Miltipart的数量,用于除了多个part,比如多个附件
  56.   for(int m=0;m<mpCount;m++)
  57.   {
  58.    this.handle(msg);
  59.    
  60.    part=mp.getBodyPart(m);
  61.    disposition=part.getDisposition();
  62.    if(disposition!=null && disposition.equals(Part.ATTACHMENT))//判断是否有附件
  63.    {
  64.     //this.saveAttach(part);//这个方法负责保存附件,注释掉是因为附件可能有病毒,请清理信箱之后再取掉注释
  65.    }else{
  66.     System.out.println(part.getContent());
  67.    }
  68.   }
  69.  }
  70.  private void saveAttach(BodyPart part) throws Exception
  71.  {
  72.   String temp=part.getFileName();//得到未经处理的附件名字
  73.   String s=temp.substring(11,temp.indexOf("?=")-1);//去到header和footer
  74.   
  75.   //文件名一般都经过了base64编码,下面是解码
  76.   String fileName=this.base64Decoder(s);
  77.   System.out.println("有附件:"+fileName);
  78.   
  79.   InputStream in=part.getInputStream();
  80.   FileOutputStream writer=new FileOutputStream(new File(fileName));
  81.   byte[] content=new byte[255];
  82.   int read=0;
  83.   while((read=in.read(content))!=-1)
  84.   {
  85.    writer.write(content);
  86.   }
  87.   writer.close();
  88.   in.close();
  89.  }
  90.  //base64解码
  91.  private String base64Decoder(String s) throws Exception
  92.  {
  93.   sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
  94.   byte[] b=decoder.decodeBuffer(s);
  95.   
  96.   return(new String(b));
  97.  }
  98.  //关闭连接
  99.  public void close() throws Exception
  100.  {
  101.   if(inbox!=null)
  102.   {
  103.    inbox.close(false);
  104.   }
  105.   
  106.   if(store!=null)
  107.   {
  108.    store.close();
  109.   }
  110.  }
  111.  public static void main(String args[])
  112.  {
  113.   String host="pop.163.com";
  114.   String name="bromon";
  115.   String password="My password";
  116.   
  117.   Receiver receiver=new Receiver();
  118.   
  119.   try
  120.   {   
  121.    Message[] msg=receiver.getMail(host,name,password);
  122.    
  123.    for(int i=0;i<msg.length;i++)
  124.    {
  125.     if(msg[i].isMimeType("text/*"))//判断邮件类型
  126.     {
  127.      receiver.handleText(msg[i]);
  128.     }else{
  129.      receiver.handleMultipart(msg[i]);
  130.     }
  131.     System.out.println("****************************");
  132.    }
  133.    receiver.close();
  134.   }catch(Exception e)
  135.   {
  136.    System.out.println(e);
  137.   }
  138.  }
  139.  } 


 没有习惯读java代码的兄弟可能会觉得麻烦了一点,其中有个小问题,下载的附件会再文件名后面加上一个”#”符号,不知道这是javamail的特别处理还是pop3的规范。通过程序更改文件名很简单,就不说了。对于email还有很多其他的操作,可以自己取查看一下javadoc,我就不影响大家探索的乐趣了。在Properties里配置代理服务器,可以让程序通过代理收发邮件,一般的HTTP、socks 4、socks 5都支持。
Copyright © 2002-2012 JSPCN.net. All rights reserved.
JSP中文网    备案号:粤ICP备09171188号
成都恒海科技发展有限公司    成都市一环路南二段6号新瑞楼三楼8号