Java发邮件的用户名有时候不能使用带后缀的用户名。
使用jbpm时jbpm.mail.preperties有以下几组配置
#Gmail
#mail.smtp.host=smtp.gmail.com
#mail.smtp.port=25
#mail.from=herosea &at gmail &dot com
#mail.debug=true
#mail.smtp.starttls.enable=true
#mail.smtp.auth=true
如果设置了mail.smtp.user不设mail.from则发送的地址设为 ${mail.smtp.user}@机器名。
mail.from不是可以验证的邮件地址时会报错。
mail.debug=true在调试时可以看到准确的原因。
jbpm.default.cfg.xml中添加如下段
<mail-session>
<mail-server>
<!-- address-filter>
<include>[email protected]</include>
</address-filter-->
<session-properties resource="jbpm.mail.properties" />
<authenticator class="com.impl.TestAuthenticator">
<field name="userName"><string value="yourname"/></field>
<field name="password"><string value="*****"/></field>
</authenticator>
</mail-server>
</mail-session>
TestAuthenticator.java文件
package com.service.impl;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
/**
* @author test
* 简单的实现认证接口
*/
public class TestAuthenticator extends Authenticator {
private String userName;
private String password;
private PasswordAuthentication passwordAuthentication;
public TestAuthenticator() {
super();
// TODO Auto-generated constructor stub
}
public TestAuthenticator(String userName, String password) {
setUserName(userName);
setPassword(password);
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setPassword(String password) {
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication() {
if(passwordAuthentication == null){
passwordAuthentication = new PasswordAuthentication(userName, password);
}
return passwordAuthentication;
}
}
配置的工作流
<mail g='200,98,90,50' name='测试邮件节点'>
<to addresses='[email protected]'/>
<subject>Hello</subject>
<html>没有什么原因啊!html</html>
<transition g='306,123;306,59:0,-1' to='人工 1'/>
</mail>
发出的邮件正文为乱码。
可以修改jbpm的源码
org.jbpm.pvm.internal.email.impl.MailProducerImpl
将 htmlPart.setContent(html, "text/html"); 改为 htmlPart.setContent(html, "text/html;charset=gbk");
<mail-session>貌似不能出现在两个jbpm配置文件中
jbpm4的流程文件没有定义格式是因为可以完全自定义,在解析的时候可以复用JpdlParser中的邮件解析,定时器解析等等。
jbpm4的事件模型还看不明白。
自定义MailProducer很麻烦,mailTemplate尤其是inline的不会自动注入到MailProducer中。
TaskRemind
这个每隔一段时间提醒一次的事件原理是这样的。
在ObservableElementImpl上获得remind事件 event,
新建一个MailListener叫eventListener,并将其和remind事件关联event.createEventListenerReference(eventListener)。
scopeElement.createTimerDefinition()创建一个定时器timerDefinition,从xml中获取定时器的详细配置。
timerDefinition.setEventName(Event.REMIND)定时触发remind事件。
正则表达式的上下文由多个上下文组成
ExecutionContext是默认最高优先级的上下文,可以自定义一个放在其前面。MailListener就定义了TaskContext至于其前面。
jbpm内部定义的很多接口是给其他流程定义语言准备的,要换的话可能需要整套都换掉。(猜测)
可能正则表达式的Context也是jbpm的context。(猜测)
发短信接口实现(猜想):
仿照org.jbpm.pvm.internal.wire.binding.MailTemplateBinding解析一个短信模板。
仿照邮件包org.jbpm.pvm.internal.email.spi中的接口定义发短信的3个接口。
自定义binding要注意的两个方面:
jbpm.user.wire.binding.xml文件在src目录下,不在任何包内。
集成WireDescriptorBinding的类需要一个没有参数的构造函数。
我为发短信定义了mobile-template标签,他的name属性的取值不能和mail-template的一样,否则会出错。说是上下文中找不到我模板的注册类。