package foundation.icall.connector;
|
|
import java.io.File;
|
import java.util.Date;
|
import java.util.Properties;
|
|
import javax.activation.DataHandler;
|
import javax.activation.FileDataSource;
|
import javax.mail.Address;
|
import javax.mail.PasswordAuthentication;
|
import javax.mail.Session;
|
import javax.mail.Transport;
|
import javax.mail.internet.InternetAddress;
|
import javax.mail.internet.MimeBodyPart;
|
import javax.mail.internet.MimeMessage;
|
import javax.mail.internet.MimeMultipart;
|
import javax.mail.internet.MimeUtility;
|
|
import org.apache.logging.log4j.LogManager;
|
|
import foundation.dao.DataPackage;
|
import foundation.dao.bizlogic.IRequest;
|
import foundation.dao.bizlogic.ResponseType;
|
import foundation.data.entity.Entity;
|
import foundation.data.object.DataObject;
|
import foundation.data.object.EntitySaver;
|
import foundation.icall.ICall;
|
import foundation.icall.ICallDirection;
|
import foundation.icall.callout.HttpServerMeta;
|
import foundation.icall.callout.JSONResponse;
|
import foundation.icall.callout.send.IMailRequest;
|
import foundation.icall.callout.send.SendAction;
|
import foundation.util.ID;
|
import foundation.workflow.Moment;
|
import foundation.workflow.WorkStep;
|
import foundation.workflow.reference.IOSender;
|
|
public class MailConn extends HttpServerConn {
|
|
public static boolean Test = false;
|
public static int ConnectTimeout = 60;
|
public static int WriteTimeout = 60;
|
public static int ReadTimeout = 60;
|
private static DataObject mailLogObject;
|
private static String monitorId = "MailConn";
|
private static MailConn instance;
|
|
private Properties propertys;
|
private Session session;
|
private String instanceId;
|
|
static {
|
logger = LogManager.getLogger(MailConn.class);
|
}
|
|
protected MailConn() {
|
mailLogObject = DataObject.getInstance("sys_mail_log");
|
propertys = new Properties();
|
}
|
|
public static synchronized MailConn getInstance() {
|
if (instance == null) {
|
instance = new MailConn();
|
}
|
|
return instance;
|
}
|
|
public void init(HttpServerMeta meta) {
|
this.meta = meta;
|
|
propertys.clear();
|
propertys.setProperty("mail.debug", "false");
|
propertys.setProperty("mail.host", meta.getString("host"));
|
propertys.setProperty("mail.transport.protocol", meta.getString("transport_protocol"));
|
propertys.setProperty("mail.smtp.auth", meta.getString("auth"));
|
propertys.put("mail.smtp.ssl.enable", true);
|
|
propertys.setProperty("mail.smtp.socketfactory.class", meta.getString("smtp_socketfactory_class"));
|
propertys.setProperty("mail.smtp.socketfactory.fallback", meta.getString("smtp_socketfactory_fallback"));
|
propertys.setProperty("mail.smtp.socketfactory.port", meta.getString("smtp_socketfactory_port"));
|
}
|
|
@Override
|
public void login(WorkStep step, ICall iCall) throws Exception {
|
Authenticator authenticator = new Authenticator();
|
session = Session.getDefaultInstance(propertys, authenticator);
|
instanceId = ID.newValue();
|
}
|
|
@Override
|
public void logout(WorkStep step, ICall iCall) throws Exception {
|
|
}
|
|
@Override
|
public IMailRequest createRequest(String mailName) {
|
//1. get mail action
|
SendAction action = SendAction.getInstance(mailName);
|
|
if (action == null) {
|
logger.info("send mail error, mail action {} not exists", mailName);
|
return null;
|
}
|
|
IMailRequest mail = new IMailRequest(action);
|
return mail;
|
}
|
|
@Override
|
public IRequest buildBody(IRequest request, WorkStep step, ICall iCall) throws Exception {
|
IMailRequest mailRequest = (IMailRequest)request;
|
DataPackage dataPackage = step.getDataPackage();
|
|
mailRequest.build(dataPackage);
|
|
MimeMessage mimeMessage = new MimeMessage(session);
|
mimeMessage.setFrom(new InternetAddress(meta.getString("account")));
|
mimeMessage.setSubject(iCall.getTitle());
|
|
MimeMultipart multipart = new MimeMultipart();
|
//1. 内容部分
|
MimeBodyPart contentPart = new MimeBodyPart();
|
contentPart.setText(mailRequest.getMailContent(),"UTF-8");
|
contentPart.setHeader("Content-Type", mailRequest.getContentType());
|
multipart.addBodyPart(contentPart);
|
|
//1.2 默认附件
|
File[] files = mailRequest.getFiles(dataPackage);
|
|
if (files != null) {
|
for (File file : files) {
|
MimeBodyPart filePart = new MimeBodyPart();
|
DataHandler handler = new DataHandler(new FileDataSource(file));
|
filePart.setDataHandler(handler);
|
String name = file.getName();
|
String fileName = name;
|
filePart.setFileName(MimeUtility.encodeText(fileName));
|
multipart.addBodyPart(filePart);
|
}
|
}
|
|
//2. 附件部分
|
//2.1 导出附件
|
IOSender sender = step.getSender(IOSender.class, Moment.After);
|
if (sender == null || sender.getExportFile() == null) {
|
mimeMessage.setContent(multipart);
|
mailRequest.setMessage(mimeMessage);
|
return request;
|
}
|
|
File file = sender.getExportFile();
|
|
MimeBodyPart filePart = new MimeBodyPart();
|
DataHandler handler = new DataHandler(new FileDataSource(file));
|
filePart.setDataHandler(handler);
|
String name = file.getName();
|
String fileName = name;
|
filePart.setFileName(fileName);
|
multipart.addBodyPart(filePart);
|
|
mimeMessage.setContent(multipart);
|
mailRequest.setMessage(mimeMessage);
|
|
return request;
|
}
|
|
@Override
|
public <T>T post(boolean simulate, IRequest request, ResponseType responseType) throws Exception {
|
IMailRequest mail = (IMailRequest)request;
|
Address[] toAddress = mail.getToAddress();
|
|
if (simulate) {
|
String testAddress = meta.getString("test_address");
|
toAddress = InternetAddress.parse(testAddress);
|
}
|
|
//1. write mail begin log
|
writeLogBegin(mail.getAction());
|
|
//2. send mail
|
Transport transport = session.getTransport();
|
transport.connect(meta.getString("account"), meta.getString("password"));
|
transport.sendMessage(mail.getMessage(), toAddress);
|
|
//3. write mail end log
|
writeLogEnd(instanceId);
|
|
//4. return result
|
String message = "[" + mail.getSubject() + "]邮件已发出";
|
int responseCode = 200;
|
|
return (T) new JSONResponse(message, responseCode, null);
|
}
|
|
public class Authenticator extends javax.mail.Authenticator {
|
|
@Override
|
protected PasswordAuthentication getPasswordAuthentication() {
|
return new PasswordAuthentication(meta.getString("account"), meta.getString("password"));
|
}
|
|
}
|
|
private void writeLogBegin(SendAction action) throws Exception {
|
String targetId = action.getFieldTargetId();
|
String targetCode = action.getFieldTargetCode();
|
String targetName = action.getFieldTargetName();
|
String targetMailAddress = action.getFieldAddress();
|
|
Entity logEntity = mailLogObject.createTableEntity(true);
|
logEntity.set("id", instanceId);
|
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);
|
}
|
|
private void writeLogEnd(String id) throws Exception {
|
EntitySaver saver = mailLogObject.createEntitySaver(id);
|
saver.set("end_time", new Date());
|
saver.update();
|
}
|
|
@Override
|
public Object get() {
|
return this;
|
}
|
|
public ICallDirection getDirection() {
|
return ICallDirection.RemoteServer;
|
}
|
|
public HttpServerMeta getMeta() {
|
return meta;
|
}
|
|
@Override
|
public String getName() {
|
return meta.getName();
|
}
|
}
|