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; } }