当前位置: 代码迷 >> Lotus >> java 调用Notes读取邮件的Body[格式显示错乱及Body中嵌入的table、链接等怎么获取]有关问题
  详细解决方案

java 调用Notes读取邮件的Body[格式显示错乱及Body中嵌入的table、链接等怎么获取]有关问题

热度:532   发布时间:2016-05-05 06:42:54.0
java 调用Notes读取邮件的Body[格式显示错乱及Body中嵌入的table、链接等如何获取]问题
本帖最后由 a307433749 于 2014-06-21 17:16:47 编辑
最近在做通过java调用Notes的WEB开发,根据需求,读取指定时间的邮件,并写入数据库。toNotesMails方法是连接lotes并将获取到的信息存入实体中返回,最后关闭Notes,看代码:

/**
 * 将获取到的Notes邮件转换为java实体Bean,根据指定的day来获取day天的邮件
 * @param na 当前账号
 * @param day 获取从今天到之前多少天的邮件
 * @return
 * @throws Exception 
 */
public List<NotesMail> toNotesMails(NotesAccount na,int day) throws Exception{
List<NotesMail> mails=new ArrayList<NotesMail>();
Session session = null;
View view = null;
try {
boolean isloaded = loadProperty(na);
if (isloaded) {
session = getNotesSession();
view = getView(session);
if(view==null) return null;
ViewEntryCollection collection=view.getAllEntries();
int count=collection.getCount();
if(count==0) return null;
ViewEntry entry=collection.getNthEntry(1);
Document doc=null;
if(entry!=null && entry.isValid() && entry.isDocument()){
doc=entry.getDocument();
Integer day_=getDays(doc);//两个日期相差的天数
if(day_>=day){
//如果第一封邮件的日期大于要读取的第day天的日期,那么从第count封邮件开始读取,标示isLastDoc为true
while(count>0){
entry=collection.getNthEntry(count);
count--;
if(entry!=null && entry.isValid() && entry.isDocument()){
doc=entry.getDocument();
day_=getDays(doc);//两个日期相差的天数
if(day_>=day){
return mails;
}
if(doc!=null){
//读取doc信息,将读取的信息存入NotesMail实体
NotesMail nm=toNotesMail(doc);
if(nm!=null){
mails.add(nm);
}
}
}
}
}else{
for (int i = 1; i <= count; i++) {//邮件的index从1开始读取
entry=collection.getNthEntry(i);
if(entry!=null && entry.isValid() && entry.isDocument()){
doc=entry.getDocument();
day_=getDays(doc);//两个日期相差的天数
if(day_>=day){
return mails;
}
if(doc!=null){
//读取doc信息,将读取的信息存入NotesMail实体
NotesMail nm=toNotesMail(doc);
if(nm!=null){
mails.add(nm);
}
}
}
}
}
}
}
} catch (NotesException e) {
e.printStackTrace();
throw new NotesException();
}finally {
closeNotess(session,database,view);
}
return null;
}


toNotesMail是根据传入的doc,将doc内的(发件人、收件人、抄送人、标题、内容等)存入实体,返回,其中内容(Body),取到的内容格式不是html格式的,该如何设置?  

/**
 * 将获取到的Notes邮件转换为java实体Bean
 * @param doc
 * @return
 * @throws NotesException
 */
@SuppressWarnings("rawtypes")
public NotesMail toNotesMail(Document doc) throws NotesException{
String notesId=na.getUserFile()+"/"+doc.getUniversalID();
List<Object[]> nid=findSql("notes_id","notes_id=?0",notesId);
if(nid!=null && nid.size()>0){
//System.out.println("nid已经重复,val:"+nid.get(0));
//如果读取的第一封邮件就存在,则后面的邮件都已存在,直接返回null
return null;
}
NotesMail nm=new NotesMail();
nm.setNotesAccount(na);
nm.setTo(na.getUsername());
MIMEEntity mime= doc.getMIMEEntity("Body");
if(mime!=null && !"".equals(mime.getContentAsText())){
nm.setContent(mime.getContentAsText());
}else{
                        //公司的用户在Notes客户端发送邮件后,默认读取的邮件内容是在getItemValueString中,而非getMIMEEntity
String body=doc.getItemValueString("Body");
nm.setContent(body);
}
//省略部分代码.......
}

通过String body=doc.getItemValueString("Body");  取得的邮件内容没有任何样式,只有内容,格式看着比较混乱,java该如何正确读取Notes邮件的Body?

下图是Notes客户端中邮件内容体的大致情况:


该图是notes邮件的内容中包含链接(该链接通过什么方式获取):


notes邮件的内容内嵌的表格等获取





------解决方案--------------------
我也没太用过notes,note官方应该是有api文档的吧,你参照那个看看,那个是最准的
------解决方案--------------------
官方没有相关的文档,问IBM也不会有回复。我以前做过,在取得Body对象后,使用DOM对象,然后按Node解析相关资源。隔得时间太长了,现在代码找不到,先给你个思路吧。不过DOM对象需要将邮件整个解析,如果是多次转发或抄送的邮件,恐怕内存会出现不足的情况。
  相关解决方案