用了非常多的时间来解决jbpm3.2发送邮件的问题,现在记录下来,以备后患,也希望能帮助到大家,闲话不多说,开始吧。
本书的例子采用的是高杰的《深入浅出jbpm》,版本为jbpm3.2,我本人的开发工具是myeclipse7.5.
问题:相信读过这本书得同学都知道,他给出的发送邮件的实例是没有经过邮件系统验证的,就是没有发送方的用户名和密码。对于没有自己的邮件服务器的人员来说就面临着530 Authentication required,could not send mail这样的困扰,解决办法有两个:
一:修改jbpm的源码,加入验证过程,并替换原来的class文件重新导入。
二:开发自己的java mail ,将他的mail-node替换成一个简单的node并在这个action 的action里边发送邮件。
这里谈谈两种方法的解决体会:
方法一:
http://jacky6024.javaeye.com/blog/317480?page=8#comments
这是作者给出的解决方案,作为一个菜鸟,对原码的编译十分痛苦,我本人将jbpm包下所有的文件拷贝到一个工程下,并导入它提示缺少的包。
没有管其他文件的错误,我将workspace下的bin中的mail.class文件拷贝出来,并复制到了对应的jbpm-jpdl.jar包中的mail文件夹里,重新打包为zip文件(注意要打一个只有一层的包),重命名为jar,重新导入,运行。。。。。。
结果:报错:缺少一个mail$1.class,我又重新把workspace下的bin中的mail$1.class文件拷贝出来,重复上述动作,运行。。。。。。
结果:报错:还是530错误。
期间,我尝试各种反编译手段,在装jad的时候竟然它把我的myeclipse的配置文件删除了,后又将我的configuration文件夹下的所有文件都删除,搞得我快疯掉。
解决未遂,放弃此方法,如果有谁解决了,麻烦指导一下。
方法二:用自己的java mail方法替换它的发邮件过程。
步骤一:相信大家对javamail都很熟悉,我就不在这里赘述了。
步骤二:将mail-node替换为一个普通的node,并对这个node添加action,对这个action设置hander,实现actionhander接口。
源码如下:
mailnodetest.xml:
<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.2" name="mailnodetest">
<start-state name="start-state1">
<transition to="send-mail-node1"></transition>
</start-state>
<node name="send-mail-node1">
<action name="send mail action" class="test.TestSimpleMailSender"></action>
<transition to="end-state1"></transition>
</node>
<end-state name="end-state1"></end-state>
</process-definition>
TestSimpleMailSender.java
这里我用sina的邮箱向外发送
package test;
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;
import util.MailSenderInfo;
import util.SimpleMailSender;
@SuppressWarnings("serial")
public class TestSimpleMailSender implements ActionHandler {
public void execute(ExecutionContext executionContext) throws Exception {
MailSenderInfo mailInfo = new MailSenderInfo();
mailInfo.setMailServerHost("smtp.sina.com");
mailInfo.setMailServerPort("25");
mailInfo.setValidate(true);
mailInfo.setUserName("your name ");
mailInfo.setPassword("your password");
mailInfo.setFromAddress("your [email protected]");
mailInfo.setToAddress("to email");
mailInfo.setSubject("test");
mailInfo.setContent("test");
SimpleMailSender.sendTextMail(mailInfo);
SimpleMailSender.sendHtmlMail(mailInfo);
System.out.println("OK");
}
}