Waqas Ali Razzaq
Waqas Ali Razzaq

Reputation: 669

WSO2 ESB email message with text and attachement

I am trying to send and an email message from my proxy service. Email is sent but only attachment. Message body is not sent. My requirement is send email with body text and error detail in attachment.

My proxy code is:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="EmailSender"
       transports="jms"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <log/>
         <property name="transport.mail.Format" value="Attachment" scope="axis2"/>
         <property name="AttachmentFile" value="Error.txt" scope="axis2"/>
         <property name="messageType"
                   value="text/html"
                   scope="axis2"
                   type="STRING"/>
         <property name="ContentType"
                   value="text/html"
                   scope="axis2"
                   type="STRING"/>
         <property name="Subject"
                   value="GLBookingError"
                   scope="transport"
                   type="STRING"/>
         <property name="OUT_ONLY" value="true" scope="default" type="STRING"/>
         <property name="FORCE_SC_ACCEPTED"
                   value="true"
                   scope="axis2"
                   type="STRING"/>
         <property name="ClientApiNonBlocking" scope="axis2" action="remove"/>
         <payloadFactory media-type="xml">
            <format>
               <Error xmlns="">
   $1
</Error><Body>$2</Body>
            </format>
            <args>
               <arg evaluator="xml" expression="$body"/>
               <arg value="Dear user,Unfortunately an error occurred within the WSO2 ESB environment.The specific details of this error can be found within the attachment. Best regards WSO2 ESB Support Team"/>
            </args>
         </payloadFactory>
         <send>
            <endpoint key="conf:/endpoints/EmailSender_EPLOCAL.xml"/>
         </send>
      </inSequence>
      <outSequence/>
      <faultSequence>
         <log separator="..... Email Sender Fault Sequence....."
              description="INFOLOG"/>
         <log level="custom"
              category="ERROR"
              separator="EmailSender-ErrorLog"
              description="EmailErrorLog">
            <property name="ERROR_CODE" expression="get-property('ERROR_CODE')"/>
            <property name="ERROR_MESSAGE" expression="get-property('ERROR_MESSAGE')"/>
            <property name="ERROR_DETAIL" expression="get-property('ERROR_DETAIL')"/>
            <property name="ERROR_EXCEPTION" expression="get-property('ERROR_EXCEPTION')"/>
         </log>
         <property name="SET_ROLLBACK_ONLY"
                   value="true"
                   scope="default"
                   type="STRING"
                   description="RollBack"/>
      </faultSequence>
   </target>
   <parameter name="transport.jms.ContentType">
      <rules>
         <jmsProperty>contentType</jmsProperty>
         <default>application/xml</default>
      </rules>
   </parameter>
   <parameter name="transport.jms.ConnectionFactory">myQueueConnectionFactory</parameter>
   <parameter name="transport.jms.DestinationType">queue</parameter>
   <parameter name="transport.jms.Destination">ErrorQueue.01</parameter>
   <description/>
</proxy>

First argument is Error attachment and second argument is body. Currently it is sending attachment with both arguments.

Upvotes: 2

Views: 1475

Answers (1)

Waqas Ali Razzaq
Waqas Ali Razzaq

Reputation: 669

After analyzing the internal code of WSO2 ESB, I have found that WSO2 has put hard coded string (Web service attachment) message when we try to send multi part message. If you want you put your custom message then edit source code and recompile the jar.

You can find the respective jar at {WSO2 ESB_HOME}/repository/components/patches/patch000x/axis2_1.6.1.wso2v10.jar. (Above mentioned path is specific to WSO2 ESB 4.8.0)

In this jar go to /org/apache/axis2/transport/mail/MailTransportSender.java. Edit this file and replace patched jar at above location.

Here is the code for sendEmail function: (Message with **** is my custom message)

private String sendMail(MailOutTransportInfo outInfo, MessageContext msgContext)
    throws AxisFault, MessagingException, IOException
  {
    OMOutputFormat format = BaseUtils.getOMOutputFormat(msgContext);

    format.setProperty("org.apache.axiom.om.OMFormat.use.cteBase64.forNonTextualAttachments", Boolean.valueOf(true));

    MessageFormatter messageFormatter = BaseUtils.getMessageFormatter(msgContext);

    if (this.log.isDebugEnabled()) {
      this.log.debug("Creating MIME message using message formatter " + 
        messageFormatter.getClass().getSimpleName());
    }

    WSMimeMessage message = null;
    if (outInfo.getFromAddress() != null)
      message = new WSMimeMessage(this.session, outInfo.getFromAddress().getAddress());
    else {
      message = new WSMimeMessage(this.session, "");
    }

    Map trpHeaders = (Map)msgContext.getProperty("TRANSPORT_HEADERS");
    if ((this.log.isDebugEnabled()) && (trpHeaders != null)) {
      this.log.debug("Using transport headers: " + trpHeaders);
    }

    if ((outInfo.getTargetAddresses() != null) && (outInfo.getFromAddress() != null)) {
      if (this.log.isDebugEnabled()) {
        this.log.debug("Setting From header to " + outInfo.getFromAddress().getAddress() + 
          " from OutTransportInfo");
      }
      message.setFrom(outInfo.getFromAddress());
      message.setReplyTo(new Address[] { outInfo.getFromAddress() });
    } else if ((trpHeaders != null) && (trpHeaders.containsKey("From"))) {
      InternetAddress from = 
        new InternetAddress((String)trpHeaders.get("From"));
      if (this.log.isDebugEnabled()) {
        this.log.debug("Setting From header to " + from.getAddress() + 
          " from transport headers");
      }
      message.setFrom(from);
      message.setReplyTo(new Address[] { from });
    }
    else if (this.smtpFromAddress != null) {
      if (this.log.isDebugEnabled()) {
        this.log.debug("Setting From header to " + this.smtpFromAddress.getAddress() + 
          " from transport configuration");
      }
      message.setFrom(this.smtpFromAddress);
      message.setReplyTo(new Address[] { this.smtpFromAddress });
    } else {
      handleException("From address for outgoing message cannot be determined");
    }

    if ((trpHeaders != null) && (trpHeaders.containsKey("To"))) {
      Address[] to = 
        InternetAddress.parse((String)trpHeaders.get("To"));
      if (this.log.isDebugEnabled()) {
        this.log.debug("Setting To header to " + InternetAddress.toString(to) + 
          " from transport headers");
      }
      message.setRecipients(Message.RecipientType.TO, to);
    } else if (outInfo.getTargetAddresses() != null) {
      if (this.log.isDebugEnabled()) {
        this.log.debug("Setting To header to " + InternetAddress.toString(
          outInfo.getTargetAddresses()) + " from OutTransportInfo");
      }
      message.setRecipients(Message.RecipientType.TO, outInfo.getTargetAddresses());
    } else {
      handleException("To address for outgoing message cannot be determined");
    }

    if ((trpHeaders != null) && (trpHeaders.containsKey("Cc"))) {
      Address[] cc = 
        InternetAddress.parse((String)trpHeaders.get("Cc"));
      if (this.log.isDebugEnabled()) {
        this.log.debug("Setting Cc header to " + InternetAddress.toString(cc) + 
          " from transport headers");
      }
      message.setRecipients(Message.RecipientType.CC, cc);
    } else if (outInfo.getCcAddresses() != null) {
      if (this.log.isDebugEnabled()) {
        this.log.debug("Setting Cc header to " + InternetAddress.toString(
          outInfo.getCcAddresses()) + " from OutTransportInfo");
      }
      message.setRecipients(Message.RecipientType.CC, outInfo.getCcAddresses());
    }

    if ((trpHeaders != null) && (trpHeaders.containsKey("Bcc"))) {
      InternetAddress[] bcc = 
        InternetAddress.parse((String)trpHeaders.get("Bcc"));
      if (this.log.isDebugEnabled()) {
        this.log.debug("Adding Bcc header values " + InternetAddress.toString(bcc) + 
          " from transport headers");
      }
      message.addRecipients(Message.RecipientType.BCC, bcc);
    }
    if (this.smtpBccAddresses != null) {
      if (this.log.isDebugEnabled()) {
        this.log.debug("Adding Bcc header values " + InternetAddress.toString(this.smtpBccAddresses) + 
          " from transport configuration");
      }
      message.addRecipients(Message.RecipientType.BCC, this.smtpBccAddresses);
    }

    if ((trpHeaders != null) && (trpHeaders.containsKey("Subject"))) {
      if (this.log.isDebugEnabled()) {
        this.log.debug("Setting Subject header to '" + trpHeaders.get(
          "Subject") + "' from transport headers");
      }
      message.setSubject((String)trpHeaders.get("Subject"));
    } else if (outInfo.getSubject() != null) {
      if (this.log.isDebugEnabled()) {
        this.log.debug("Setting Subject header to '" + outInfo.getSubject() + 
          "' from transport headers");
      }
      message.setSubject(outInfo.getSubject());
    } else {
      if (this.log.isDebugEnabled()) {
        this.log.debug("Generating default Subject header from SOAP action");
      }
      message.setSubject("SOAPAction: " + msgContext.getSoapAction());
    }

    if (outInfo.getRequestMessageID() != null) {
      message.setHeader("In-Reply-To", outInfo.getRequestMessageID());
      message.setHeader("References", outInfo.getRequestMessageID());
    }
    else {
      if ((trpHeaders != null) && 
        (trpHeaders.containsKey("In-Reply-To"))) {
        message.setHeader("In-Reply-To", 
          (String)trpHeaders.get("In-Reply-To"));
      }
      if ((trpHeaders != null) && (trpHeaders.containsKey("References"))) {
        message.setHeader("References", 
          (String)trpHeaders.get("References"));
      }

    }

    message.setSentDate(new Date());

    message.setHeader("SOAPAction", msgContext.getSoapAction());
    MessageFormatterEx messageFormatterEx;
    MessageFormatterEx messageFormatterEx;
    if ((messageFormatter instanceof MessageFormatterEx))
      messageFormatterEx = (MessageFormatterEx)messageFormatter;
    else {
      messageFormatterEx = new MessageFormatterExAdapter(messageFormatter);
    }

    DataHandler dataHandler = new DataHandler(messageFormatterEx.getDataSource(msgContext, format, msgContext.getSoapAction()));

    MimeMultipart mimeMultiPart = null;

    String mFormat = (String)msgContext.getProperty("transport.mail.Format");
    if (mFormat == null) {
      mFormat = this.defaultMailFormat;
    }

    if (this.log.isDebugEnabled())
      this.log.debug("Using mail format '" + mFormat + "'");
    MimePart mainPart;
    String fileName;
    MimePart mainPart;
    if ("Multipart".equals(mFormat)) {
      mimeMultiPart = new MimeMultipart();
      MimeBodyPart mimeBodyPart1 = new MimeBodyPart();
      mimeBodyPart1.setContent("*****Dear user,\r\n \r\nUnfortunately an error occurred within the WSO2 ESB environment.****", "text/plain");
      MimeBodyPart mimeBodyPart2 = new MimeBodyPart();
      mimeMultiPart.addBodyPart(mimeBodyPart1);
      mimeMultiPart.addBodyPart(mimeBodyPart2);
      message.setContent(mimeMultiPart);
      mainPart = mimeBodyPart2;
    }
    else
    {
      MimePart mainPart;
      if ("Attachment".equals(mFormat)) {
        mimeMultiPart = new MimeMultipart();
        MimeBodyPart mimeBodyPart1 = new MimeBodyPart();

        mimeBodyPart1.setContent("****Dear user,\r\n \r\nUnfortunately an error occurred within the WSO2 ESB environment.*****", "text/plain");
        MimeBodyPart mimeBodyPart2 = new MimeBodyPart();
        mimeMultiPart.addBodyPart(mimeBodyPart1);
        mimeMultiPart.addBodyPart(mimeBodyPart2);
        message.setContent(mimeMultiPart);

        fileName = (String)msgContext.getProperty(
          "AttachmentFile");
        if (fileName != null)
          mimeBodyPart2.setFileName(fileName);
        else {
          mimeBodyPart2.setFileName("attachment");
        }

        mainPart = mimeBodyPart2;
      } else {
        mainPart = message;
      }
    }
    try {
      mainPart.setHeader("SOAPAction", msgContext.getSoapAction());
      mainPart.setDataHandler(dataHandler);

      if (msgContext.getOptions().getProperty("Content-Transfer-Encoding") != null) {
        mainPart.setHeader("Content-Transfer-Encoding", 
          (String)msgContext.getOptions().getProperty("Content-Transfer-Encoding"));
      } else {
        String contentType = dataHandler.getContentType().toLowerCase();
        if ((!contentType.startsWith("multipart/")) && (CommonUtils.isTextualPart(contentType))) {
          mainPart.setHeader("Content-Transfer-Encoding", "quoted-printable");
        }

      }

      if (msgContext.getOptions().getProperty("transport.mail.custom.headers") != null) {
        Map customTransportHeaders = (Map)msgContext.getOptions().getProperty("transport.mail.custom.headers");
        for (fileName = customTransportHeaders.keySet().iterator(); fileName.hasNext(); ) { Object header = fileName.next();
          mainPart.setHeader((String)header, (String)customTransportHeaders.get(header));
        }

      }

      this.log.debug("Sending message");
      Transport.send(message);

      this.metrics.incrementMessagesSent(msgContext);
      long bytesSent = message.getBytesSent();
      if (bytesSent != -1L)
        this.metrics.incrementBytesSent(msgContext, bytesSent);
    }
    catch (MessagingException e)
    {
      this.metrics.incrementFaultsSending();
      handleException("Error creating mail message or sending it to the configured server", e);
    }

    return message.getMessageID();
  }

Upvotes: 2

Related Questions