写这个接收邮件的类花了很多时间,参考了网上的很多例子,最后经过修改完善终于实现了可以完美的将邮件各部分解析,并且在控制台输出各部分的内容。
但是从控制台转移到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.修改方法,设置全局变量