您的位置:首页 > 其它

kettle 发送邮件附件乱码问题

2017-01-15 10:30 246 查看
大清早无聊,又想起了之前kettle 发送中文附件乱码的问题;心血来潮,又开始倒腾起来。折腾了好一会儿居然成功了,这个问题已经搞了大半个月了;其实解决方法很简单,只是过程比较复杂。简单讲下思路。

       一开始出现邮件附件文件名乱码问题,我觉得是kettle bug 问题;后来发现 pentaho data-integration (kettle)都出到 7 的版本了;这个问题依旧存在。个人认为 kettle 后面版本暂时也不会解决邮件附件中文兼容性的问题。还好 kettle 源码是开源的,所以我们只能自己修改源代码,满足我们自己特定需求。

     讲到这儿,问题就清晰了;问题的解决过程如下:

     1.  下载对应版本项目源码;(https://github.com/pentaho/pentaho-kettle/tree/6.1.0.0-R  )

     2.  导入源码项目;( 将源码中 engine 子项目作为一个Java project 导入 eclipse 中)

     3.  修改编译源码;(参考blog :http://blog.csdn.net/mendan/article/details/48784565)

     4.  替换编译好的jar 包程序。(kettle-engine-6.0.1.0-386.jar)

  

    其中第二步花了我大量时间,我一开始不懂怎么使用 ant 编译打包一个项目。本机安装好 执行 ant 命令,我发现它底层跟maven 原理也差不多,都是下载远程资源库的jar 包到本地资源库;而问题再也 ant 远程资源库网站链接网络不稳定导致 jar 包下载非常慢。后面我只好断网,看它缺少那些包,手动下载;但是问题依赖的包太多了,手动下载太蛋疼;于是就放弃了!后来想起 maven 资源库有的时候也连不上,但是会有一个镜像的网站;因此我想 ant 应该也有一个类似的网站,果然替换后,大部分 jar
包都能下载下来;不能下载的再断网手动下载。

   balabala这么多,上面的过程花了我大量时间;最后依赖包下载完后,ant还是编译不通过。最后不得不放弃这个方法。改用 eclipse 去编译修改源代码。

   历史往往惊人的相似,换用eclipse后,我一开始把 kettle 7.0 版本源码中 engine 项目导入 eclipse中,然后添加 java jdk包 和 kettle 中 lib 包,源码一直报错,报缺少相关 java 类,而且还是kettle 源码中缺少类,不是java jdk版本问题。折腾了相当久,最后想,要不先测试 kettle 6.0 版本得了;同样的方法,6.0版本一导入就通过了。妈蛋,这也太神奇了。

  上面废话讲了一大堆,接下来上干货。

  第一步我就不讲了,从第二步开始。第二步中你需要将 源码项目中的 engine 子项目单独拷贝至 eclipse 的workspace 中, 然后eclipse 以java project 项目形式导入engine 项目。

  Import =》general =》Existing Projects into Workspace

  给项目添加 jdk 运行环境,项目properties 中选择 java build path ,在libraries 中 添加 Add Library 选择 JRE System Library ,然后选择你本机的jdk(这个地方我建议选择jdk7)

  接下来把 kettle 相关依赖 jar 包添加到项目中,项目新建 一个lib 文件夹,把 /data-integration/lib 下面所有的 jar包都添加进来,然后删除 kettle-engine-XXX.jar 包(因为kettle-engine这个jar是需要重编译的);添加完后,在lib文件夹中选中所有 jar 包右键 build path =》 add build path

 到这,项目编译通过,没有其他错误了。接下来修改源代码,主要包含两个类:

org.pentaho.di.job.entries.mail.JobEntryMail#execute 和 

org.pentaho.di.trans.steps.mail.Mail#addAttachedFilePart   一个是 Job中的发邮件实现类,一个是Transform中的发邮件实现类。

修改的代码都是一样的 

                  //files.setFileName( file.getName().getBaseName() );

                  

                  //add by
zhoujianfeng

                  BASE64Encoder enc =
new BASE64Encoder();

                  String fileName="=?UTF-8?B?"+enc.encode(file.getName().getBaseName().getBytes("UTF-8"))+"?=";

                  files.setFileName(fileName);

再接下来就更简单了,项目 export =》 Java =》 Jar file ,Jar Export 要编译的文件之选择源码文件夹 src 即可;然后next next等。

最后把 编译好的 jar 包替换 /data-integration/lib中的 kettle-engine-XXX.jar包即可。

到这已经完成。

问题解决方法很简单,只是过程比较繁琐;复杂的东西简单做,简单的东西复杂做。这个过程也能吸取不少教训。

最后上两张成果图片:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: