一个解析本地邮件的例子。

由于把邮件收取到本地,要提取里面的信息,原来走了一些弯路。先看看邮件的格式:

Message-ID: <31164770.1121223075375.JavaMail.Administrator@zbh>
Date: Wed, 13 Jul 2005 10:51:15 +0800 (CST)
From: boss <dankes@163.com>
To: dankes@tom.com
Subject: good
Mime-Version: 1.0
Content-Type: multipart/mixed;
 boundary="----=_Part_0_19152757.1121223075171"

------=_Part_0_19152757.1121223075171
Content-Type: text/html
Content-Transfer-Encoding: quoted-printable

<P>=D7=F0=BE=B4=B5=C4  :</P>
<P>&nbsp;&nbsp; =D4=DA=B4=CB=D7=AB=D0=B4=D3=CA=BC=FE=C4=DA=C8=DD</P>
<P>=A1=A1=A1=A1=CB=B3=D7=A3<BR>=C9=CC=E7=F7!<BR>&nbsp;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2005-07-13</P>
------=_Part_0_19152757.1121223075171--


.

作者:  来自:  阅读次数:<script language="javascript" src="../inc/info.aspx?Info_SN=20400" type="text/javascript"> </script> 13

Quoted-Printable也是MIME邮件中常用的编码方式之一。同Base64一样,

它也将输入的字符串或数据编码成全是ASCII码的可打印字符串。

Quoted-Printable编码的基本方法是:输入数据在33-60、62-126范围内的,

直接输出;其它的需编码为“=”加两个字节的HEX码(大写)。为保证输出行不超过规定长度,

可在行尾加“=/r/n”序列作为软回车。

在这个上面浪费了一些时间了,老是想着怎么去解码,后来在网上找了 一个代码,大家可以参考一西啊。

其实不需要用到这个方法。看看也可以的。

public final String qpDecoding(String str)
 {
  if (str == null)
  {
   return "";
  }
  try
  {
   str = str.replaceAll("=/n", "");
   byte[] bytes = str.getBytes("US-ASCII");
   for (int i = 0; i < bytes.length; i++)
   {
    byte b = bytes[i];
    if (b != 95)
    {
     bytes[i] = b;
    }
    else
    {
     bytes[i] = 32;
    }
   }
   if (bytes == null)
   {
    return "";
   }
   ByteArrayOutputStream buffer = new ByteArrayOutputStream();
   for (int i = 0; i < bytes.length; i++)
   {
    int b = bytes[i];
    if (b == '=')
    {
     try
     {
      int u = Character.digit((char) bytes[++i], 16);
      int l = Character.digit((char) bytes[++i], 16);
      if (u == -1 || l == -1)
      {
       continue;
      }
      buffer.write((char) ((u << 4) + l));
     }
     catch (ArrayIndexOutOfBoundsException e)
     {
      e.printStackTrace();
     }
    }
    else
    {
     buffer.write(b);
    }
   }
   return new String(buffer.toByteArray(), "GBK");
  }
  catch (Exception e)
  {
   e.printStackTrace();
   return "";
  }
 }

其实用下面的方法就很方便了,不用考虑得太复杂。

      if (contentType.startsWith("text/plain") ||
          contentType.startsWith("text/html")) {
        InputStream ism = messagePart.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(ism));
        String thisLine = reader.readLine();
        bf = new StringBuffer();
        bf.append(thisLine);
        int i = 0;
        while (thisLine != null) {
          thisLine = reader.readLine();
          if (thisLine != null) {
            bf.append(thisLine);
          }
        }

下面是具体代码的实现。

package test;

import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.io.*;
import javax.mail.internet.MimeUtility;
import java.sql.Date;
import java.text.SimpleDateFormat;

public class testMail {
  Message mimeMessage = null;
  private String dateformat = "yy-MM-dd HH:mm"; //默认的日前显示格式
  public testMail() {
    try {
      File file = new File("D://mail-log//O00268.dat");
      InputStream is = new BufferedInputStream(new FileInputStream(file));
      mimeMessage = new MimeMessage(null, is);
      InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();
      String from = address[0].getAddress();
      String personal = address[0].getPersonal();

      InternetAddress addressto[] = (InternetAddress[]) mimeMessage.
          getRecipients(Message.RecipientType.TO);
      String to = addressto[0].getAddress();
      InternetAddress addresscc[] = (InternetAddress[]) mimeMessage.
          getRecipients(Message.RecipientType.CC);
      String cc = addresscc[0].getAddress();
      InternetAddress addressBcc[] = (InternetAddress[]) mimeMessage.
          getRecipients(Message.RecipientType.BCC);
      String bcc = addressBcc[0].getAddress();

      Part messagePart = mimeMessage;
      Object content = messagePart.getContent();

      if (content instanceof Multipart) {
        messagePart = ( (Multipart) content).getBodyPart(0);
      }

      String contentType = messagePart.getContentType();
      StringBuffer bf = null;
      if (contentType.startsWith("text/plain") ||
          contentType.startsWith("text/html")) {
        InputStream ism = messagePart.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(ism));
        String thisLine = reader.readLine();
        bf = new StringBuffer();
        bf.append(thisLine);
        int i = 0;
        while (thisLine != null) {
          thisLine = reader.readLine();
          if (thisLine != null) {
            bf.append(thisLine);
          }
        }
      }

      setDateFormat("yy年MM月dd日 HH:mm");
      System.out.println("发件人:" + personal + "<" + from + ">");
      System.out.println("日期:" + mimeMessage.getSentDate().toLocaleString());

      System.out.println("发送日期是:" + getSentDate());
      System.out.println("收件人是:" + to);
      System.out.println("主题是:" + mimeMessage.getSubject());
      System.out.println("内容是:" + bf.toString());

    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {

    new testMail();
  }

  public void setDateFormat(String format) throws Exception {
    this.dateformat = format;
  }

  public String getSentDate() throws Exception {
    //  Date sentdate  =(Date)mimeMessage.getSentDate();
    //SimpleDateFormat  format  =  new SimpleDateFormat(dateformat);
    // return format.format(sentdate);
    return "";
  }

  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[0].getAddress();
          if (email == null) {
            email = "";
          }
          else {
            email = MimeUtility.decodeText(email);
          }
          String personal = address[0].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;
  }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值