企业邮件发送有自己的发送平台,其它系统包括业务系统常常将发送邮件的任务交给该平台。
该平台通过activemq 建立 queue 接受外围系统的发来的报文格式。
报文格式如下:
"[{\"sys\":\"fssc\", \"key\":\"QWESAD456\", \"type\":\"1\", \"email\":\"ysen@xxxx.com\", \"telno\":\"13601942660\", \"pernr\":\"\", \"subject\":\"mysubject\", \"body\":\"xxx,您好!<br>截至今日xx点,您还有xxx条待办事项尚未及时处理,<br>其中紧急事项xxx条,请通过以下链接进入系统--“我的待办”页面,尽快处理。谢谢!此邮件通过系统自动发送,请勿直接回复。如您已经处理,请忽略本邮件。<br>mm/dd/yyyy\", \"aux\":\"020910\"}]";
sys 对应的外围系统名字
type 对应的是发送方式1.email,2 .短信
key 对应的是密码
服务端对这段报文格式先做校验,再做业务处理
客户端需要根据不同的业务制定不同的模板,业务包括body里面的xxx业务数据。
这是业务bo,不同的email模板对应不同的msg对象
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class SendAMQBO {
private String user = ActiveMQConnection.DEFAULT_USER;
private String password = ActiveMQConnection.DEFAULT_PASSWORD;
private String url = "failover://tcp://10.111.11.111:61616";
private Destination destination;
public static void main(String[] args) {
SimpleSendAMQ mySend = new SimpleSendAMQ();
mySend.sendMessage();
}
void sendMessage(Object msg ) {
try {
Connection connection = null;
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
user, password, url);
connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("unsQueue");
MessageProducer producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
TextMessage message = session.createTextMessage();
message.setText(msg.toString());
producer.send(message);
connection.close();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
msg对象需要一个父类需要对报文格式作json化,包括freemarker加载body模板
import java.io.IOException;
import java.io.StringWriter;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.util.PropertyFilter;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public abstract class EmailTemplate {
private String sys = "fssc";
private String key = "QWESAD456";
private String type = "1";
private String email = " ";
private String telno;
private String pernr;
private String subject;
protected String body;
private String aux;
protected String templateName = "";
public static Configuration conf = new Configuration();
public JsonConfig config = new JsonConfig();
static {
conf.setClassForTemplateLoading(EmailTemplate.class, "/templates/");
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getSys() {
return sys;
}
public void setSys(String sys) {
this.sys = sys;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getPernr() {
return pernr;
}
public void setPernr(String pernr) {
this.pernr = pernr;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAux() {
return aux;
}
public void setAux(String aux) {
this.aux = aux;
}
public String getTelno() {
return telno;
}
public void setTelno(String telno) {
this.telno = telno;
}
public String toString() {
return JSONObject.fromObject(this, config()).toString();
}
public void setBody(String body) {
this.body = body;
}
protected JsonConfig config() {
config.setJsonPropertyFilter(new PropertyFilter() {
public boolean apply(Object object, String name, Object value) {
Field[] fields = object.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
if (name.equals(fields[i].getName())) {
return true;
}
}
if (name.equals("templateName")) {
return true;
}
return false;
}
});
return config;
}
public String setFrBody() {
try {
if(null==templateName||"".equals(templateName)){
templateName = this.getClass().getName()+".ftl";
}
Template t = conf.getTemplate(templateName, "UTF-8");
Map<String, Object> root = new HashMap<String, Object>();
root.put("taskEmail", this);
StringWriter sw = new StringWriter();
try {
t.process(root, sw);
return sw.toString();
} catch (TemplateException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
return body;
}
public String getBody() {
body = this.setFrBody();
return body;
}
public String getTemplateName() {
return templateName;
}
public void setTemplateName(String templateName) {
this.templateName = templateName;
}
}
具体业务对象 包含的业务属性不需要做json化,因为它们是包含在body里面的业务数据
public class TaskEmail extends EmailTemplate {
/**
* body contect
*/
private String numTask = "2";
private String urgentTask = "2";
private String time = "9";
public static void main(String[] args) {
TaskEmail taskEmail = new TaskEmail();
//taskEmail.setTemplateName("TaskEmail.ftl");
System.out.println(taskEmail.toString());
}
public String getNumTask() {
return numTask;
}
public void setNumTask(String numTask) {
this.numTask = numTask;
}
public String getUrgentTask() {
return urgentTask;
}
public void setUrgentTask(String urgentTask) {
this.urgentTask = urgentTask;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
}
对应的TaskEmail.ftl
截至今日${taskEmail.time?if_exists}点,您还有${taskEmail.numTask?if_exists}条待办事项尚未及时处理,其中紧急事项${taskEmail.urgentTask?if_exists}条,<br>请通过以下链接进入系统--“我的待办”页面,尽快处理。谢谢!
所以添加新的email发送业务只需要添加客户提供的email模板以及包含简单的body属性的对象即可