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包即可。
到这已经完成。
问题解决方法很简单,只是过程比较繁琐;复杂的东西简单做,简单的东西复杂做。这个过程也能吸取不少教训。
最后上两张成果图片:
一开始出现邮件附件文件名乱码问题,我觉得是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包即可。
到这已经完成。
问题解决方法很简单,只是过程比较繁琐;复杂的东西简单做,简单的东西复杂做。这个过程也能吸取不少教训。
最后上两张成果图片:
相关文章推荐
- 【转】Kettle发送邮件步骤遇到附件名是中文名变成乱码的问题解决办法
- javamail发送带有附件的邮件时遇到的乱码问题解决方案
- javaMail发送邮件附件名乱码问题
- android 原生 电子邮件 应用 发送邮件附带 中文名附件时 附件名称乱码问题解决
- Android4.1.2 Email发送邮件附件中文名乱码问题
- C# 发送邮件,附件带中文名称的Excel乱码问题
- java发送邮件附件名称乱码问题
- asp jmail发送带附件的邮件出现乱码问题
- python邮件发送(带附件,解决中文乱码问题)
- javaMail发送邮件时的中文乱码问题
- 关于解决Jmail发送附件和html邮件的问题
- 关于解决Jmail发送附件和html邮件的问题
- PHP使用mail函数发送邮件标题乱码问题
- javamail发送邮件时附件名显示为乱码的解决
- 用smtp命令发送邮件附件给新浪邮箱的问题
- vbs处理数组 和 Jmail发送带附件邮件 乱码
- 利用Jmail发送带附件的邮件时乱码的解决方案
- 使用mail函数发送邮件标题乱码问题
- 关于Delphi2010使用Indy发送邮件乱码问题的解决
- PHP使用mail函数发送邮件标题乱码问题