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

原创 2008年10月03日 18:48:00

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

但是从控制台转移到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.修改方法,设置全局变量

java读取邮件时,邮件含有正文跟附件的时候,读取不到正文内容

String pop3Server = "pop3.163.com"; // 收件服务器 pop3.163.com  8531.icoremail.net         String protoco...
  • qq_19806865
  • qq_19806865
  • 2017年12月20日 17:09
  • 138

Web端的邮件内容HTML格式规范总结

一、页面要求 1)  统一使用标准的页头和页尾 2)统一使用gb2312编码格式 3)页面显示宽度400px-800px,高度一般控制在一屏以内。 4)页面不向出现js代码及f...
  • houzhiwen_yy
  • houzhiwen_yy
  • 2016年11月03日 14:24
  • 699

用ASP发送HTML格式的邮件

用ASP发送HTML格式的邮件 Dim objMail  Set objMail = CreateObject("CDONTS.Newmail")  objMail.TO = "bhumph...
  • u014440209
  • u014440209
  • 2014年05月11日 15:30
  • 508

解决zabbix 报警邮件以附件形式发送

1、yum install dos2unix 2、修改sendmail.sh #!/bin/sh #export.UTF-8 FILE=/tmp/mailtmp.txt echo...
  • u010603691
  • u010603691
  • 2016年03月11日 12:49
  • 2109

今天收到PMI的邮件得知通过了PMP考试

今天一早得到了PMI的邮件,看到标题就知道通过了PMP考试Congratulations, you have obtained a PMI credential成绩是2P4M,比自己预期的低了些。不过...
  • yaoyasong
  • yaoyasong
  • 2010年04月20日 22:19
  • 1744

Java使用Velocity模板发送HTML格式邮件并解决中文乱码问题

项目中经常会遇到发送邮件的问题,有时还需要发送html格式的邮件,如果直接在java文件硬编码写html,那么维护起来将会非常麻烦,利用Velocity模板引擎可以解决这个问题,使得业务处理和视图渲染...
  • wang704987562
  • wang704987562
  • 2017年01月18日 18:26
  • 1617

HTML规范 - 邮件内容

邮件环境 邮件内容所在上下文或者说所在外部容器(以下简称环境)都是由邮箱服务商决定的,这就要求邮件内容需要在任何一种情况下都要正确显示。 这些环境可能是以下某几种情况: 可能是个iframe,你...
  • Dracotianlong
  • Dracotianlong
  • 2015年07月06日 21:19
  • 1383

c#抓取邮件内容解析

using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System....
  • xqf222
  • xqf222
  • 2006年10月15日 08:38
  • 4667

RFC822邮件格式

RFC822邮件格式 邮件内容的格式在RFC822文档中定义,它包括两个主要的组成部分:邮件头和邮件体。在第2章的SMTP协议的实验中,it315_test @sohu.com邮箱中接收到的it315...
  • wliang11
  • wliang11
  • 2014年02月27日 14:03
  • 2384

Microsoft OutLook 部分邮件不能收到的经验。

情景: 1:刚去公司,公司给配置了一个台式机(TSJ)。 上面有 Microsoft OutLook 邮箱。 邮箱工作很正常。 2:自己为了方便,写了很多规则,方便邮件收到的时候能自动的分...
  • greenbird811
  • greenbird811
  • 2012年04月17日 14:44
  • 7459
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:接受邮件中处理复杂格式邮件时收到的内容为空的问题
举报原因:
原因补充:

(最多只允许输入30个字)