CSDN博客

img ja_II_ck

接受邮件中处理复杂格式邮件时收到的内容为空的问题

发表于2008/10/3 18:48:00  672人阅读

分类: 问题汇总 Java Mail

写这个接收邮件的类花了很多时间,参考了网上的很多例子,最后经过修改完善终于实现了可以完美的将邮件各部分解析,并且在控制台输出各部分的内容。

但是从控制台转移到web平台又遇到了很多麻烦。

首先就是返回值的问题,以前可以很简单的打印到标准输出,但是现在要保存到变量中以便于下一步持久化到数据库中,处理邮件头的问题还算简单,返回了个HashMap,其中包含了from,to,subject,date等内容;

但是在处理邮件正文部分时,犯了个严重且低级的错误,要知道邮件正文是有好几个部分的,但是改造处理邮件正文部分的方法时,我只是为方法简单的设置了一个String返回值,结果所有含有附件的邮件全部无法正确解析了,因为当这个处理邮件内容的方法执行到最后,发现邮件中含有附件时会返回附件的保存位置(即一个url),于是以前String content的值,原本保存的邮件内容就被这个附件地址所覆盖,造成邮件内容丢失。

就这个弱智问题,让我用eclipse的dubug功能调试了半天才发现。不过倒是对如何使用dubug熟练了不少,呵呵。

 

//处理邮件内容的方法

private String handleContent(Part msg) throws Exception
 {
  String content = "";
  if ((msg.getContentType().indexOf("text/plain") != -1))// 判断邮件类型
  {
   // handleText(msg);// 纯文本格式
   content = (String)msg.getContent();
  }
  else if ((msg.getContentType().indexOf("text/html") != -1))
  {
   // handleHtml(msg);//超文本格式
   content = (String)msg.getContent();
  }
  else if ((msg.getContentType().indexOf("multipart/") != -1))
  {

//handle
   content = handleMultipart(msg);// 复杂格式
  }
  return StrUtil.strFilter(content);
 }

//处理复杂格式的邮件正文的方法

// 处理Multipart邮件,包括了保存附件的功能
 public String handleMultipart(Part msg) throws Exception
 {
  String temp="";//用于保存附件位置url的变量
  String disposition;
  BodyPart part;
  try
  {
   Multipart mp = (Multipart) msg.getContent();
   int mpCount = mp.getCount();// Miltipart的数量,用于除了多个part,比如多个附件
   for (int m = 0; m < mpCount; m++)
   {
    part = mp.getBodyPart(m);
    disposition = part.getDisposition();
    if (disposition != null && disposition.equals(Part.ATTACHMENT))// 判断是否有附件
    {
     // System.out.println("********附件*********");
     temp = this.saveAttach(part);
     //return temp;// 这个方法负责保存附件,注释掉是因为附件可能有病毒,请清理信箱之后再取掉注释
    }
    else
    {
     // System.out.println("********不是附件*********");     
     temp = handleContent(part);// 递归调用
    }
    // System.out.println("-------handle Multipart-----");
   }   
  }
  catch (Exception e)
  {
   // System.out.println(e);
   e.printStackTrace();
  }
  return temp;
 }

接收邮件方法中的问题代码:

for (int i = 0; i < msgs.length; i++)
   {
    System.out.println("-!!!-----第" + (i + 1) + "-封------");

    // 处理邮件头
    head = handleHead(msgs[i]);

 

     from = (String) head.get("from");
     to = (String) head.get("to");
    subject = (String) head.get("subject");
    date = (String) head.get("date");

    // 处理邮件内容
    content = handleContent(msgs[i]);//仅返回一个String变量!!!

 

  //将数据写入数据库
    String inSql = "insert into inbox values('" + sUsername
      + "', '" + from + "', '" + to + "', '" + date + "', '"
      + subject + "', '0','" + content + "' ) ";
    ds.execute(inSql);// throws SQLException
   }

处理思路:1.增加handleContent()的返回值个数

                   2.修改方法,设置全局变量

0 0

相关博文

我的热门文章

img
取 消
img