package foundation.send.mail;
|
|
import java.util.Date;
|
|
import javax.mail.Session;
|
import javax.mail.Transport;
|
import javax.mail.internet.InternetAddress;
|
import javax.mail.internet.MimeMessage;
|
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
|
import foundation.action.ActionContext;
|
import foundation.action.SingletonActionProvider;
|
import foundation.dao.DataPackage;
|
import foundation.dao.DataReader;
|
import foundation.dao.DataWriter;
|
import foundation.data.entity.Entity;
|
import foundation.data.object.DataObject;
|
import foundation.data.object.EntitySaver;
|
import foundation.util.ID;
|
import foundation.util.Util;
|
|
public class MailCenter extends SingletonActionProvider {
|
|
private static Logger logger;
|
private static MailCenter instance;
|
private static MailActionBucket actionBucket;
|
private static DataObject mailLogObject;
|
|
static {
|
logger = LogManager.getLogger(MailCenter.class);
|
}
|
|
private MailCenter() {
|
actionBucket = MailActionBucket.getInstance();
|
mailLogObject = DataObject.getInstance("sys_mail_log");
|
}
|
|
public static synchronized MailCenter getInstance() {
|
if (instance == null) {
|
instance = new MailCenter();
|
}
|
|
return instance;
|
}
|
|
@Override
|
protected void publishMethod() {
|
//1. 发送文件
|
addMethod("sendMail");
|
|
//2. 获取邮件内容
|
addMethod("getMail");
|
}
|
|
public void sendMail(ActionContext context) throws Exception {
|
DataReader dataReader = context.getDataReader();
|
DataWriter dataWriter = context.getDataWriter();
|
DataPackage dataPackage = dataReader.getDataPackage();
|
|
String mailName = dataReader.getString("mail_name");
|
if (Util.isEmpty(mailName)) {
|
mailName = context.getActionParam();
|
}
|
|
String message = sendMailByDataPackage(dataPackage, mailName);
|
dataWriter.reportOneMessage(mailName, message);
|
}
|
|
public String sendMailByDataPackage(DataPackage dataPackage, String mailName) throws Exception {
|
MailAction action = actionBucket.get(mailName);
|
|
//1. 记录日志开始
|
if (action == null) {
|
logger.error("send mail error, mail action not exists: {}", mailName);
|
return "mail action not exists";
|
}
|
|
String id = writeLogBegin(action);
|
|
//2. 创建邮件内容对象
|
Mail mail = new Mail(action);
|
mail.build(dataPackage);
|
|
//3. 创建邮件 session
|
MailServer server = action.getServer();
|
Session session = Session.getDefaultInstance(server.getPropertys(), server.getAuthenticator());
|
|
//4.设置邮件内容
|
MimeMessage mimeMessage = new MimeMessage(session);
|
mimeMessage.setFrom(new InternetAddress(server.getAccount()));
|
mimeMessage.setSubject(mail.getSubject());
|
mimeMessage.setContent(mail.getMailContent(), mail.getContentType());
|
|
//5. 发送邮件
|
Transport transport = session.getTransport();
|
transport.connect(server.getAccount(), server.getPassword());
|
transport.sendMessage(mimeMessage, mail.getToAddress());
|
|
//6. 记录日志结束
|
writeLogEnd(id);
|
|
//7. 返回提示
|
String message = "[" + mail.getSubject() + "]邮件已发出";
|
|
return message;
|
}
|
|
public void getMail(ActionContext context) throws Exception {
|
DataReader dataReader = context.getDataReader();
|
DataWriter dataWriter = context.getDataWriter();
|
|
String mailName = dataReader.getString("mail_name");
|
if (Util.isEmpty(mailName)) {
|
mailName = context.getActionParam();
|
}
|
|
//1. 获取Mail 指令,并重新加载模板
|
MailAction action = actionBucket.get(mailName);
|
|
if (action == null) {
|
logger.error("send mail error, mail action not exists: {}", mailName);
|
return;
|
}
|
|
//2. 创建邮件内容对象
|
DataPackage dataPackage = dataReader.getDataPackage();
|
Mail mail = new Mail(action);
|
mail.build(dataPackage);
|
|
dataWriter.addValue("mail", mail.getMailContent());
|
}
|
|
private String writeLogBegin(MailAction action) throws Exception {
|
String id = ID.newValue();
|
String targetId = action.getFieldTargetId();
|
String targetCode = action.getFieldTargetCode();
|
String targetName = action.getFieldTargetName();
|
String targetMailAddress = action.getFieldMailAddress();
|
|
Entity logEntity = mailLogObject.createTableEntity(true);
|
logEntity.set("id", id);
|
logEntity.set("target_id", targetId);
|
logEntity.set("target_code", targetCode);
|
logEntity.set("target_name", targetName);
|
logEntity.set("target_mail_address", targetMailAddress);
|
logEntity.set("action_name", action.getName());
|
logEntity.set("mail_subject", action.getSubject());
|
logEntity.set("begin_time", new Date());
|
|
mailLogObject.insertEntity(logEntity);
|
|
return id;
|
}
|
|
private void writeLogEnd(String id) throws Exception {
|
EntitySaver saver = mailLogObject.createEntitySaver(id);
|
saver.set("end_time", new Date());
|
saver.update();
|
}
|
|
protected boolean validateMethodParameter(Class<?>[] parameters) {
|
return true;
|
}
|
|
}
|