Configure jBPM to send mail

User Rating: 0 / 5

Star InactiveStar InactiveStar InactiveStar InactiveStar Inactive
 

One common problem many users face in Java is sending mail through a Microsoft Exchange server. In this tutorial we will show how to send an authenticated mail using Java Mail Api and how to configure JBPM to use our Authenticator.

Sending a mail through Microsoft Exchange Server

The first problem will be sending an authenticated mail using Java Mail Api.

Pick up your Microsoft Exchange server address and add it as SMTP_HOST_NAME in this code. Replace as well SMTP_AUTH_USER and SMTP_AUTH_PWD with your user and password.

package sample;

import javax.mail.*;
import javax.mail.internet.*;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

import java.util.Properties;


public class MailWithAuthentication {

    private static final String SMTP_HOST_NAME = "192.168.10.1";
    private static final String SMTP_AUTH_USER = "fmarchioni";
    private static final String SMTP_AUTH_PWD  = "francesco";

    public static void main(String[] args) throws Exception{
       new MailWithAuthentication().test();
    }

    public void test() throws Exception{
        Properties props = new Properties();
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.host", SMTP_HOST_NAME);
        props.put("mail.smtp.auth", "true");

        Authenticator auth = new SMTPAuthenticator();
        Session mailSession = Session.getDefaultInstance(props, auth);
        // uncomment for debugging infos to stdout
        // mailSession.setDebug(true);
        Transport transport = mailSession.getTransport();

        MimeMessage message = new MimeMessage(mailSession);
        message.setContent("This is a test", "text/plain");
        message.setFrom(new InternetAddress("HERE-MAIL_ADDRESS"));
        message.addRecipient(Message.RecipientType.TO,
             new InternetAddress("HERE-MAIL_ADDRESS"));

        transport.connect();
        transport.sendMessage(message,
            message.getRecipients(Message.RecipientType.TO));
        transport.close();
    }

   
}

package sample;

public class SMTPAuthenticator extends javax.mail.Authenticator {
        public PasswordAuthentication getPasswordAuthentication() {
           String username = SMTP_AUTH_USER;
           String password = SMTP_AUTH_PWD;
           return new PasswordAuthentication(username, password);
        }
}

Run your MailWithAuthenticator class and verify that the mail is received correctly.

If you receive an error like "Connection Refused" it's likely that there's a firewall problem. It can be either that you have a firewall on your machine (most likely) or that you have another firewall between you and the mail server.


Sending a mail from your JBPM process.

Ok, now let's move to jbpm. JBPM has built-in support for mail with mail nodes. However the main configuration file (jbpm-cfg.xml) has default non-authentication mail support, so we have to extend its configuration.

Let's start with a simple process:
<?xml version="1.0" encoding="UTF-8"?>

<process name="MailExample4" xmlns="http://jbpm.org/4.3/jpdl">

    <start g="43,109,48,48">
        <transition to="review" />
    </start>
    <mail g="99,25,115,45" language="juel" name="review">
        <to addresses="HERE-EMAIL-ADDRESS" />
        <subject>This is the subject</subject>
        <text>This is the body of the message with a ${property} </text>
        <transition name="to end1" to="end1" g="-42,-18" />
    </mail>
    <end name="end1" g="269,109,48,48" />

</process>

Here, the sendmail node takes care to send an e-mail to the address specified by the <to addresses > tag.

Now the configuration: the configuration is contained in jbpm-cfg.xml. In this file you have the Mail Session properties and the Authenticator class which will be used to authenticate your mail on MS Exchange Server.

Where is the pitfall ? as reported by many users on jbpm forum, by upgrading jbpm-cfg.xml with just the <mail-session> information seem not to work. Because, if you import <import resource="jbpm.default.cfg.xml" /> then JBPM does not override the <mail-session> information provided.

So the solution is not to import jbpm.default.cfg.xml file. Rather insert it in your project with the <mail-session> information as follows:
<?xml version="1.0" encoding="UTF-8"?>

<jbpm-configuration>

   
  <import resource="jbpm.businesscalendar.cfg.xml" />
  <import resource="jbpm.tx.hibernate.cfg.xml" />
  <import resource="jbpm.jpdl.cfg.xml" />
  <import resource="jbpm.bpmn.cfg.xml" />
  <import resource="jbpm.identity.cfg.xml" />
  <import resource="jbpm.default.scriptmanager.xml" />

  <process-engine-context>
  
    <repository-service />
    <repository-cache />
    <execution-service />
    <history-service />
    <management-service />
    <identity-service />
    <task-service />

    <object class="org.jbpm.pvm.internal.id.DatabaseDbidGenerator">
      <field name="commandService"><ref object="newTxRequiredCommandService" /></field>
    </object>

    <object class="org.jbpm.pvm.internal.id.DatabaseIdComposer" init="eager" />

    <types resource="jbpm.variable.types.xml" />

    <address-resolver />

    <mail-template name='task-notification'>
      <to users="${task.assignee}"/>
      <subject>${task.name}</subject>
      <text><![CDATA[Hi ${task.assignee},
Task "${task.name}" has been assigned to you.
${task.description}

Sent by JBoss jBPM
]]></text>
    </mail-template>
  
    <mail-template name='task-reminder'>
      <to users="${task.assignee}"/>
      <subject>${task.name}</subject>
      <text><![CDATA[Hey ${task.assignee},
Do not forget about task "${task.name}".
${task.description}

Sent by JBoss jBPM
]]></text>
    </mail-template>
  
  </process-engine-context>

  <transaction-context>
    <repository-session />
    <db-session />
    
    <message-session />
    <timer-session />
    
    <history-sessions>
      <object class="org.jbpm.pvm.internal.history.HistorySessionImpl" />
    </history-sessions>
    
    <mail-session>
      <mail-server>
        <session-properties resource="jbpm.mail.properties" />
        <authenticator class="sample.CustomAuthenticator" auto-wire="true"/>
      </mail-server>
    </mail-session>

  </transaction-context>

</jbpm-configuration>

And add the jbpm-mail.properties file to your classpath as well:

mail.smtp.auth=true
mail.smtp.host=192.168.10.1
mail.smtp.port=25
mail.transport.protocol=smtp


With the above configuration, you should be able to send mail from a jbpm mail node.

Related articles available on mastertheboss.com

JBPM tutorial

JBoss jBPM 3 is a flexible, extensible framework for process lang

How do I fire an action every time a JBPM Node enters?

JBoss recipe of the day

JBoss Jbpm superstates

What is a superstate ? a Superstate is a group of nodes. Supersta

Jbpm Mail delivery

Almost every workflow needs a notification of the process activit

How do you embed Java code in your JPDL ?

  You can use a BeanShell expression to add a Java script in you

JBPM best practices

There's no perfect rule to model your workflow, it depends on the