Unified API Developer Manual / Version 2304
Table Of Contents
Here you find the partial process definition and the simple implementation of an action sending emails. The
action is implemented as a SimpleAction
with predefined timeout.
If you need to increase the timeout, you
should implement interface LongAction instead, which is better suited for long-running actions.
Assuming there are process variables field
and document
the mail action can be defined
as follows:
<?xml version="1.0" encoding="iso-8859-1"?> <Workflow> <Process name="SendMailProcess" startTask="SendMail"> <Variable name="receiver" type="String"> <String value="default@test.com"/> </Variable> <Variable name="field" type="String"/> <Variable name="document" type="Resource"/> <Variable name="delivered" type="Boolean"> <Boolean value="false"/> </Variable> <AutomatedTask name="SendMail" description="mail-task" final="true"> <Action class="com.coremedia.extension.workflow.mail.SendMail" receiverVariable="receiver" documentVariable="document" fieldVariable="field" successVariable="delivered"/> </AutomatedTask> ... </Process> </Workflow>
The implementation then looks as follows:
package com.coremedia.extension.workflow.mail; import com.coremedia.cap.content.Content; import com.coremedia.cap.workflow.Process; import com.coremedia.cap.workflow.plugin.SimpleAction; import com.coremedia.xml.Markup; import org.slf4j.*; import javax.mail.*; import javax.mail.event.*; import javax.mail.internet.*; public class SendMail extends SimpleAction { private static final Logger LOG = LoggerFactory.getLogger(SendMail.class); static final long serialVersionUID = 1258062873454333627L; protected String transportType = "smtp"; protected String host = "smtp.coremedia.com"; protected String user = "testuser"; protected String password = "testpassword"; protected String from = "testuser@coremedia.com"; protected String subject = "This is a test mail"; protected String receiverVariable; protected String fieldVariable; protected String documentVariable; protected Message createMessage(Session session, String from, String to, String subject, String text) throws MessagingException { MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); message.setSubject(subject); message.setText(text); message.saveChanges(); return message; } protected boolean send(String host, String username, String password, String from, String to, String subject, String text, String transport_type) throws MessagingException { Session session = Session.getDefaultInstance (System.getProperties(), null); Message message = createMessage(session,from,to,subject,text); MessageDelivery delivery = new MessageDelivery(); Transport transport = session.getTransport(transport_type); transport.addTransportListener(delivery); transport.connect(host, username, password); transport.sendMessage(message, message.getAllRecipients()); transport.close(); transport.removeTransportListener(delivery); return delivery.isMailDelivered(); } @Override protected boolean doExecute(Process process) { String to = process.getString(receiverVariable); Content content = process.getLink(documentVariable); if (content == null) { return false; } String field = process.getString(fieldVariable); Markup markup = content.getMarkup(field); String body = markup == null ? "" : markup.toString(); try { return send(host, user, password, from, to, subject, body, transportType); } catch (MessagingException e) { LOG.error(e.getMessage()); } return false; } // Setters for configuring the action in a process definition. public void setReceiverVariable(String receiverVariable) { this.receiverVariable = receiverVariable; } public void setFieldVariable(String fieldVariable) { this.fieldVariable = fieldVariable; } public void setDocumentVariable(String documentVariable) { this.documentVariable = documentVariable; } protected static class MessageDelivery implements TransportListener{ // wait a second for delivery // (If you need to increase the timeout, you should instead // implement interface LongAction which is better suited // for long-running actions. You should also implement method // #abort correctly so that the execution of the action does // not interfere with the shutdown of the Workflow Server.) private static final long TIMEOUT = 1000; private Boolean delivered = null; protected synchronized boolean isMailDelivered() { long timeout = System.currentTimeMillis() + TIMEOUT; while (delivered == null) { long now = System.currentTimeMillis(); if (now >= timeout) { break; } try { wait(timeout - now); } catch (InterruptedException e) { LOG.error(e.getMessage()); } } return Boolean.TRUE.equals(delivered); } private synchronized void deliverySuccess(boolean state) { delivered = state; notifyAll(); } public void messageDelivered(TransportEvent e) { deliverySuccess(true); } public void messageNotDelivered(TransportEvent e) { deliverySuccess(false); } public void messagePartiallyDelivered(TransportEvent e) { deliverySuccess(false); } } }
Example 6.4. The SendMail action