转载请注明出处:http://blog.csdn.net/soartju
作者:高飞
总算把通过html邮件提交数据的问题搞定了。 做这个功能遇到的问题很多,记录如下
1、不同的邮件客户端过滤的条件不一样,基本上会过滤掉有用的自定义标签。本来打算用自定义标签<property id="name" value="gaofei">记录信息,当用户回复的时候再解析出来的。结果,在很多邮件客户端,不是将这个标签直接过滤了就是使的标签不完整。 解决办法:使用html的标准标签,如td等。td还是非常好用的,基本上是不会被过滤的。同时,做好用<td id="name:gaofei;xx...">的形式封装自己的数据,因为有的客户端(如outlook)回复邮件后,自定义的标签属性也会被过滤掉。如果使用id属性,基本是没有问题的。
2、outlook回复邮件的问题outlook回复邮件时,会使用word编辑器对回复的html邮件重新编码,导致会添加很多没有的标签,同时又会删除很多我们需要的标签。如果不是用<td id="xxx">方式,当用户在回复区域填写数据时,用户填写的数据也不会在我们自定义的标签内,导致后来解析时,用户输入的数据就找不到了。 解决办法:用<td id=“xx”>方式,用户输入的数据一定是在td标签下,就算是outlook也无所谓,便于我们后来的数据处理。
3、html邮件style更改的问题通过对多个邮件客户端的测试,包括foxmail,outlook2007,yahoo浏览器客户端等,发现在自定义的html邮件中,如果自定义<style>....<style>,然后在个标签中引用class,在有的客户端可能会出现问题,不能正确显示页面。 解决办法:直接把style写到各个标签中,如<td style="font-size=12px;...">虽然代码冗余,但这能很好的适应不同的邮件客户端,基本上不会出现显示问题。
4、用户回复邮件后,仍然是一个html,这次采用了开源的nekohtml对这个html进行的解析,nekohtml解析后会返回一个DOM,但用这个dom取节点数据时,很可能出现乱码, 解决办法如下,加一个编码的设置就好了。
DOMParser parser = new DOMParser();
try{
InputStream is = new ByteArrayInputStream(content.getBytes());
parser.setProperty("http://cyberneko.org/html/properties/default-encoding", "GB2312"); parser.parse(new InputSource(is));
is.close();
}