公司项目使用到snaker流程引擎,要使用发送邮件功能,即在审批提交的时候通知下一步的处理人处理审批。主要涉及到MailService接口,mailServiceImpl接口,*.properties文件中配置发送者信息以及在具体地方调用接口。
1、我在message.properties中配置:
send_mail_adress=smtp.163.com
send_mail_userName=1825607****@163.com
send_mail_passwd=*****
2、MailService.java接口代码如下:
package com.wonders.bigdata.manageplatform.service.common.service;
import java.util.Map;
public interface MailService {
/**
* 发送邮件
* @return
*/
public void sendEmailData(String receiver,String subject,Map<String,String> content);
/**
* 发送邮件
* @param receiver 邮件接受者
* @param subject 邮件主题
* @param content 邮件内容
*/
}
3、MailServiceImpl.java接口的代码如下:(也可以看详细的对于方法参数的讲解http://blog.163.com/java_star/blog/static/11771480520136511023957/(转侵删))
package com.wonders.bigdata.manageplatform.service.common.service.Impl;
import com.wonders.bigdata.manageplatform.service.common.service.MailService;
import com.wonders.bigdata.manageplatform.utils.Messages;
import org.springframework.stereotype.Service;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Map;
import java.util.Properties;
/**
* Created by Administrator on 2016/3/23.
*/
@Service("MailServiceImpl")
public class MailServiceImpl implements MailService{
private static String send_mail_adress = Messages.getString("send_mail_adress");
private static String send_mail_userName = Messages.getString("send_mail_userName");
private static String send_mail_passwd = Messages.getString("send_mail_passwd");
private static Thread thread;
@Override
public void sendEmailData(final String receiver, final String subject, final Map<String, Object> content) {
final Properties props = new Properties();
thread = new Thread(new Runnable() {
@Override
public void run() {
//表示SMTP发送邮件,需要进行身份验证
props.put("mail.smtp.auth","true");
props.put("mail.smtp.host",send_mail_adress);
//发件人帐号
props.put("mail.user",send_mail_userName);
props.put("mail.password",send_mail_passwd);
//构建授权信息,用于进行SMTP身份验证
Authenticator authenticator = new Authenticator(){
@Override
protected PasswordAuthentication getPasswordAuthentication(){
String userName = props.getProperty("mail.user");
String password = props.getProperty("mail.password");
return new PasswordAuthentication(userName,password);
}
};
//使用环境属性和授权信息,创建邮件会话
Session mailSession = Session.getInstance(props,authenticator);
//创建邮件消息
MimeMessage message = new MimeMessage(mailSession);
//设置发件人
InternetAddress form = null;
try {
form = new InternetAddress(props.getProperty("mail.user"));
message.setFrom(form);
//设置收件人
InternetAddress to = new InternetAddress(receiver);//receiver为收件人邮箱!
message.setRecipient(Message.RecipientType.TO,to);
//设置邮件标题
message.setSubject("【大数据管理平台】"+subject);
//设置邮件的内容体
String cd = "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>"
+ "<html xmlns='http://www.w3.org/1999/xhtml'>"
+ "<head>"
+ "<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />"
+ "<title>无标题文档</title>"
+ "</head>"
+ "<body>"
// + "<p>【大数据管理平台】</p>"
+ "<p>尊敬的"+content.get("userName")+",您好:</p>"
+ "<p>您有一条来自"+"【大数据管理平台】"+"的"+"【"+subject+"】"+"待处理事件,请及时处理!</p>"
// + "<p>您有一条来自"+"["+content.get("applyOwner")+"]"+"的"+"["+subject+"]"+"申请,请及时处理!</p>"
+ "<p>【大数据管理平台】网址:https://data.wondersgroup.com</p>"
+ "<div align='center'>"
+ "<p align='center'> </p>"
+ "<div data-spm='100' class='copyright-100 ' margin-up='300px'>"
+ "<div class='y-row copyright' data-spm='25'>"
+ "<h4 align='center' class='big'>"
+ "<a target='blank' href='http://www.wondersgroup.com/about-wd/201412310639133820.html'>关于我们</a> "
+ "<a target='blank' href='http://www.wondersgroup.com/news'>服务公告</a> "
+ "<a target='blank' href='http://www.wondersgroup.com/contact'>联系我们</a> "
+ "</h4><h5> © 1995 - 2015 WONDERS INFORMATION CO., LTD. ALL RIGHTS RESERVED. **信息股份有限公司版权所有 沪ICP备05002296号 </h5></div></div></body></html>";
message.setContent(cd,"text/html;charset=UTF-8");
//发送邮件
Transport.send(message);
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
}
}
备注:如出现com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 126 smtp6,j9KowAAnRcUi.......这样的bug。 在MailService接口中将邮件给自己抄送一份就行了不懂的见http://blog.163.com/java_star/blog/static/11771480520136511023957/
4.1 项目ApplyPackageController.java中具体调用的地方:
//发送短信、邮件
String nextOperator_message = params.get("S-ACTOR").toString();//本项目中获取下一步处理人
String applyName_message = params.get("packName").toString();//本项目中获取申请名称
String decision_message = params.get("decision").toString();//这也是本项目独有的
if (StringUtils.isNotEmpty(nextOperator_message) && StringUtils.isNotEmpty(applyName_message)) {
UserPO userPO = accountService.findUserByLoginName(nextOperator_message);
if (userPO != null) {
String reciver = userPO.getName(); //获取接收人用户名
String reciveNum = userPO.getMobile(); //获取接收人手机号
Map<String,Object> map = new HashMap<>();
map.put("userMailAddress",userPO.getEmail());//给map增加的信息,以备使用
map.put("userName",userPO.getName());//给map增加的信息,以备使用
String receiver = userPO.getEmail();//接受人的邮箱赋值给receiver
if (decision_message.equals("1")) {
}
//以上都是获取需要的相关参数,比如发送邮件方法中的接受邮箱, 申请名,map包含的信息,再调用发送邮件接口,
mailService.sendEmailData(receiver, applyName_message,map );
//调用发送短信接口,这是项目的另一个功能
textAndEmailService.sendMessageInfo(reciver, reciveNum, applyName_message);
}
}
4.2 整个ApplyPackageController.java:(可以不看)
package com.wonders.bigdata.manageplatform.web.flow;
import com.wonders.bigdata.manageplatform.engine.EngineFacets;
import com.wonders.bigdata.manageplatform.service.common.service.HiveService;
import com.wonders.bigdata.manageplatform.service.common.service.MailService;//导入
import com.wonders.bigdata.manageplatform.service.common.service.TextAndEmailService;
import com.wonders.bigdata.manageplatform.service.datapackage.model.po.DataPackagePO;
import com.wonders.bigdata.manageplatform.service.datapackage.service.DataPackageService;
import com.wonders.bigdata.manageplatform.service.metadata.model.po.MetadataTablePO;
import com.wonders.bigdata.manageplatform.service.metadata.service.MetadataTableService;
import com.wonders.bigdata.manageplatform.service.processrelate.service.ProcessRelateService;
import com.wonders.bigdata.manageplatform.service.resourcetype.model.po.CatalogTablePO;
import com.wonders.bigdata.manageplatform.service.resourcetype.model.po.StandardCatalogPO;
import com.wonders.bigdata.manageplatform.service.resourcetype.service.CatalogTableService;
import com.wonders.bigdata.manageplatform.service.resourcetype.service.StandardCatalogService;
import com.wonders.bigdata.manageplatform.service.sysauthoritymanage.model.po.UserUsergroupPO;
import com.wonders.bigdata.manageplatform.service.sysauthoritymanage.model.po.UsergroupPO;
import com.wonders.bigdata.manageplatform.service.sysauthoritymanage.service.UserUsergroupService;
import com.wonders.bigdata.manageplatform.service.sysauthoritymanage.service.UsergroupService;
import com.wonders.bigdata.manageplatform.service.user.dao.UserDao;
import com.wonders.bigdata.manageplatform.service.user.model.po.UserDataPackagePO;
import com.wonders.bigdata.manageplatform.service.user.model.po.UserPO;
import com.wonders.bigdata.manageplatform.service.user.service.Impl.ShiroDbRealm.ShiroUser;
import com.wonders.bigdata.manageplatform.service.user.service.AccountService;
import com.wonders.bigdata.manageplatform.service.user.service.UserDataPackageService;
import com.wonders.bigdata.manageplatform.service.user.service.UserGradeService;
import com.wonders.bigdata.manageplatform.utils.Constant;
import com.wonders.bigdata.manageplatform.utils.LogsSave;
import com.wonders.bigdata.manageplatform.utils.Messages;
import com.wonders.bud.framework.common.util.RestMsg;
import com.wonders.engine.SnakerEngine;
import com.wonders.engine.access.QueryFilter;
import com.wonders.engine.entity.HistoryOrder;
import com.wonders.engine.entity.HistoryTask;
import com.wonders.engine.entity.Order;
import com.wonders.engine.entity.Task;
import com.wonders.engine.helper.JsonHelper;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;
import org.apache.shiro.SecurityUtils;
import org.hibernate.internal.util.ConfigHelper;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
@Controller
@RequestMapping("api/flow/applyPacakgeprocess")
public class ApplyPackageController {
protected Logger log = Logger.getLogger(ApplyPackageController.class);
private Log logProgress = LogFactory.getLog("Administrator_Process");
private Log logger = LogFactory.getLog("Tenant_Application"); //数据申请日志 输出日志格式:数据申请+” ”+用户名+” ”+ip地址+” ”+日期+” ”+申请名称+” ”+表名(多表用逗号隔开)+” ”+所属数据目录+Description;
@Autowired
private EngineFacets facets;
@Autowired
private UserDataPackageService userDataPackageService;
@Autowired
private DataPackageService dataPackageService;
@Autowired
private HiveService hiveService;
@Autowired
private MetadataTableService metadataTableService;
@Autowired
private CatalogTableService catalogTableService;
@Autowired
private UserDao userDao;
@Autowired
private StandardCatalogService standardCatalogService;
@Autowired
private AccountService accountService;
@Resource
private UserUsergroupService userUsergroupService;
@Resource
private UsergroupService usergroupService;
@Resource
private TextAndEmailService textAndEmailService;
@Resource
private MailService mailService;//导入
/**
* 用户暂存申请信息
*
* @param request
* @return
*/
@RequestMapping(value = "/tempStore", method = RequestMethod.POST)
@ResponseBody
public RestMsg<String> tempStore(HttpServletRequest request) {
RestMsg<String> rm = new RestMsg<String>();
Map<String, Object> params = GetParametersCommon(request);
//数据申请日志
LogsSave.Tenant_Application(logger,this.getUname(),request.getRemoteAddr(),params.get("packName").toString(),params.get("selectedTablesName").toString(),params.get("selectedSourcesName").toString()," 用户暂存申请信息");
//根据流程类型获取流程id
CommonProcess commonProcess = new CommonProcess(facets);
String processId = commonProcess.getProcessIdByType(Constant.PROCESS_TYPE_USERAPPLY);
String orderId = request.getParameter("orderId");
String taskId = request.getParameter("taskId");
String username = getUname();
if (StringUtils.isEmpty(orderId) && StringUtils.isEmpty(taskId)) {
facets.startAndTempStore(processId, username, params);
} else {
String methodStr = request.getParameter("method");
int method = 0;
if (StringUtils.isNotEmpty(methodStr)) {
method = Integer.parseInt(methodStr);
}
switch (method) {
case 0://任务执行
Task task = facets.getEngine().query().getTask(taskId);
task.setVariable(JsonHelper.toJson(params));
facets.getEngine().task().updateTask(task);
break;
case -1://驳回、任意跳转
facets.executeAndJump(taskId, username, params, request.getParameter("nodeName"));
break;
default:
facets.execute(taskId, username, params);
break;
}
}
rm.successMsg();
return rm;
}
/**
* 管理员暂存申请包的生成
*
* @param request
* @return
*/
@RequestMapping(value = "/adminTempStoreApply", method = RequestMethod.POST)
@ResponseBody
public RestMsg<String> adminTempStoreApply(HttpServletRequest request) {
RestMsg<String> rm = new RestMsg<String>();
Map<String, Object> params = new HashMap<String, Object>();
Enumeration<String> paraNames = request.getParameterNames();
while (paraNames.hasMoreElements()) {
String element = paraNames.ne