I have a need to send pdf/png/jpeg files to emails via WSO2 EI 6.5.0
I have a proxy:
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="EmailService"
startOnLoad="true"
statistics="disable"
trace="disable"
transports="http,https">
<target>
<inSequence>
<log level="custom">
<property name="[EmailService] Initialize" value="SendMailSequence"/>
</log>
<property name="Subject" scope="transport" value="WSO2 EI Testing"/>
<property name="transport.mail.bodyWhenAttached"
scope="axis2"
value="This text will appear in body"/>
<property name="enableMTOM" scope="axis2" type="STRING" value="true"/>
<log level="custom">
<property expression="/" name="[EmailService] Before Send"/>
</log>
<property name="FORCE_SC_ACCEPTED" scope="axis2" value="true"/>
<property name="OUT_ONLY" value="true"/>
<property name="messageType"
scope="axis2"
type="STRING"
value="multipart/form-data"/>
<send>
<endpoint name="FileEpr">
<address optimize="mtom" uri="mailtoOwn:listopadov_as#kk.bank"/>
</endpoint>
</send>
</inSequence>
<outSequence/>
</target>
<description/>
</proxy>
I am trying to send a file (a cachier cheque) using Fiddler:
POST http://localhost:8280/services/EmailService HTTP/1.1
Content-Type: multipart/form-data; boundary=NewBoundary
--NewBoundary
Content-Disposition: form-data; name="attachment"; filename="cheque.png"
Content-Type: image/png
<...binary data...>
--NewBoundary--
And I get this in the WSO2 EI 6.5.0 console:
[2020-09-07 16:24:19,136] [] INFO - LogMediator [EmailService] Initialize = sendMailSequence
[2020-09-07 16:24:19,138] [] INFO - LogMediator [EmailService] Before Send = <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><mediate><attachment filename="cheque.png">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</attachment></mediate></soapenv:Body></soapenv:Envelope>
And in result I get the cheque.png file but it is corrupted because the data inside is base64 encoded and even if I decode it manually and insert decoded data back into the file the file is still corrupted so there is no way I can view it.
I tried several other options and tried placing base64Decode in the payload:
<payloadFactory media-type="xml">
<format>
<root>
<file filename="cheque.png">$1</file>
</root>
</format>
<args>
<arg evaluator="xml" expression="base64Decode(//*[local-name()='attachment']/text())"/>
</args>
</payloadFactory>
But still nothing helps.
Please help me with a working example of how to send a file over email in WSO2 EI 6.5.0
My axis2 messageBuilders are set and the MailTransportSender is uncommented and works fine.
Related
I am using WSO2 EI 6.5.0 to send email with attachment. Is it possible to send an HTML email with attachment while the attachment is in base64 string stored in database? As of now I tried to send email but the email received in plain text.
My flow should be:
Proxy service > Get base64 string from database sequence > Send email sequence.
I tried to find references but none found regarding my issue.
Below are the source code for send email sequence
<?xml version="1.0" encoding="UTF-8"?>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="SendMailSequence">
<log level="full">
<property name="sequence" value="sendMailSequence" />
</log>
<payloadFactory media-type="xml">
<format>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns:binary xmlns:ns="http://ws.apache.org/commons/ns/payload">$1</ns:binary>
</soapenv:Body>
</soapenv:Envelope>
</format>
<args>
<!-- messageBody is from database -->
<arg expression="$ctx:messageBody" />
</args>
</payloadFactory>
<property name="messageType" value="application/octet-stream" scope="axis2" />
<property name="Subject" value="File Received" scope="transport" />
<property name="OUT_ONLY" value="true" />
<send>
<endpoint name="FileEpr">
<address uri="mailto:my-email#gmail.com" />
</endpoint>
</send>
</sequence>
Is there any reason why you have set the messageType as application/octet-stream? If you set the right messageBuilder, it should work right. Have a look at the following links.
http://sachirajapakse.blogspot.com/2016/06/sending-mails-with-attachments-via-wso2.html
Why WSO2 ESB is Encoding Email Attachment in Base64
I'm trying to access retrieveTenants method from TenantMgtAdminService.
For this I've created a custom proxy in EI 6.6.0 with the following code :
<?xml version="1.0" encoding="UTF-8"?><proxy xmlns="http://ws.apache.org/ns/synapse" name="Proxy_RetrieveTenants" startOnLoad="true" statistics="disable" trace="disable" transports="http,https">
<target>
<inSequence>
<property name="POST_TO_URI" scope="axis2" value="true"/>
<property xmlns:ns="http://org.apache.synapse/xsd" expression="fn:concat('Basic ', base64Encode('ws.palmsoft:YWRtaW46YWRtaW4'))" name="Authorization" scope="transport"/>
<call>
<endpoint>
<wsdl uri="https://localhost:9443/services/TenantMgtAdminService.TenantMgtAdminServiceHttpsSoap12Endpoint HTTP/1.1"/>
<property name="action" scope="axis2" value="urn:retrieveTenants"/>
<property name="Host" scope="axis2" value="localhost:9443"/>
<property name="Content-Type" scope="axis2" value="application/soap+xml"/>
</endpoint>
</call>
</inSequence>
<outSequence>
<call/>
</outSequence>
<faultSequence/>
</target>
<description/>
</proxy>
When I try the proxy I get the following error :
[2020-03-16 12:33:49,874] ERROR {org.apache.axis2.description.ClientUtils} - The system cannot infer the transport information from the /services/Proxy_RetrieveTenants.Proxy_RetrieveTenantsHttpSoap12Endpoint URL.
[2020-03-16 12:33:49,877] ERROR {org.apache.synapse.core.axis2.Axis2Sender} - Unexpected error during sending message out org.apache.axis2.AxisFault: The system cannot infer the transport information from the /services/Proxy_RetrieveTenants.Proxy_RetrieveTenantsHttpSoap12Endpoint URL.
I'm able to access the same method through SoapUI.
Please what would be wrong with my proxy?
Thks
Érico
Can you please modify the proxy service as follows and try this again.
<?xml version="1.0" encoding="UTF-8"?><proxy xmlns="http://ws.apache.org/ns/synapse" name="Proxy_RetrieveTenants" startOnLoad="true" statistics="disable" trace="disable" transports="http,https">
<target>
<inSequence>
<property name="POST_TO_URI" scope="axis2" value="true"/>
<property xmlns:ns="http://org.apache.synapse/xsd" expression="fn:concat('Basic ', base64Encode('admin:admin'))" name="Authorization" scope="transport"/>
<property name="ContentType" scope="axis2" value="text/xml"/>
<property name="SOAPAction" scope="transport" value="urn:retrieveTenants"/>
<payloadFactory media-type="xml">
<format>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ser="http://services.mgt.tenant.carbon.wso2.org">
<soap:Header/>
<soap:Body>
<ser:retrieveTenants/>
</soap:Body>
</soap:Envelope>
</format>
<args/>
</payloadFactory>
<call>
<endpoint>
<address format="soap12" uri="https://localhost:9443/services/TenantMgtAdminService.TenantMgtAdminServiceHttpsSoap12Endpoint"/>
</endpoint>
</call>
<respond/>
</inSequence>
<outSequence>
<send/>
</outSequence>
<faultSequence/>
</target>
<description/>
I send Mail with WSO2 ESB 5.0.0
1. I have uncommented the following line in Axis2.xml file
<transportSender name="mailto" class="org.apache.axis2.transport.mail.MailTransportSender">
<parameter name="mail.smtp.host">smtp.gmail.com</parameter>
<parameter name="mail.smtp.port">587</parameter>
<parameter name="mail.smtp.starttls.enable">true</parameter>
<parameter name="mail.smtp.auth">true</parameter>
<parameter name="mail.smtp.user">lmphuong</parameter>
<parameter name="mail.smtp.password">password</parameter>
<parameter name="mail.smtp.from">lmphuong#gmail.com</parameter>
</transportSender>
<transportReceiver name="mailto" class="org.apache.axis2.transport.mail.MailTransportListener">
<!-- configure any optional POP3/IMAP properties
check com.sun.mail.pop3 and com.sun.mail.imap package documentation for more details-->
</transportReceiver>
2. Add content at messageFormatters in axis2.xml
<messageFormatter contentType="text/html" class="org.apache.axis2.transport.http.ApplicationXMLFormatter"/>
3. I have create Proxy Service in WSO2 ESB
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="EmailSender"
transports="http https"
startOnLoad="true">
<description/>
<target>
<inSequence>
<log/>
<property name="messageType"
value="text/html"
scope="axis2"
type="STRING"/>
<property name="ContentType" value="text/html" scope="axis2"/>
<property name="Subject" value="Testing ESB" scope="transport"/>
<property name="OUT_ONLY" value="true"/>
<property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/>
<payloadFactory media-type="xml">
<format>
<ns:text xmlns:ns="http://ws.apache.org/commons/ns/payload">$1</ns:text>
</format>
<args>
<arg value="Hello WSO2 ESB.....!"/>
</args>
</payloadFactory>
<log level="full"/>
<send>
<endpoint>
<address uri="mailto:ledung123#gmail.com"/>
</endpoint>
</send>
</inSequence>
<outSequence/>
</target>
</proxy>
4. I recieved error
ERROR - MailTransportSender Error creating mail message or sending it to the configured server
javax.mail.AuthenticationFailedException
at javax.mail.Service.connect(Service.java:306)
...
[2017-09-15 08:04:05,945] ERROR - MailTransportSender Error generating mail message
...
Please help me out how to soved this error
Looks like there´s something wrong with your credentials (AuthenticationFailedException). Do you have any special chracters in your credentials? Or is there are proxy server between esb and gmail?
What you could do is start esb in debug/enable wire log to see the complete traffic. More info can be found here.
https://docs.wso2.com/display/ESB500/Debugging+Mediation#DebuggingMediation-Viewingwirelogs
Another option might be to use the GMail connector which can be found here.
https://docs.wso2.com/display/ESBCONNECTORS/Gmail+Connector
https://store.wso2.com/store/pages/top-assets?q=%22_default%22%3A%22gmail%22
I'm wondering if someone can help me with the following setup.
I want to send a message from my application via JMS to WSO2 ESB so the ESB can send it as en email. I'm using ActiveMQ as queue. Until now, when I send a message via the ActiveMQ interface to the queue, wso2 esb gets it. Then, wso2 esb send the message as email to a specific email address.
So I could configure ActiveMQ and WSO2 esb to send the JMS message to a specific email address (eg. specificaddress#test.com).
And here is my question. How can I modify the receiver address for the email? In the ESB sequence configuration, I currently use a specific address. But the address is dependant on the user that uses my application. So I have to change the "To" property, dependant on the user that has to receive the email.
So how can I pass the values for the properties "To", but also for "Subject", through a JMS message to WSO2 esb sequence?
That's the configuration of the sequence I have:
<sequence xmlns="http://ws.apache.org/ns/synapse" name="sendMail">
<property name="messageType" value="text/html" scope="axis2" type="STRING"></property>
<property name="ContentType" value="text/html" scope="axis2"></property>
<property name="Subject" value="This is the subject." scope="transport"></property>
<property name="To" value="specificaddress#test.com" scope="transport"></property>
<property name="OUT_ONLY" value="true" scope="default" type="STRING"></property>
<log level="full"></log>
<send>
<endpoint>
<address uri="mailto:"></address>
</endpoint>
</send>
</sequence>
And this is my proxy:
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="sendToMailIn"
transports="jms"
statistics="disable"
trace="disable"
startOnLoad="true">
<target inSequence="sendMail"/>
<description/>
</proxy>
I hope someone has a clue.
UPDATE
I think I have the solution!!! Wow :-) Maybe, at first, I was stupid, but here it is ...
What you can do is sending a SOAP envelop through a JMS message to WSO2 ESB. And then, with an XPath expression, you can get the passed values. A little bit has to changed at the proxy and the sequence.
This is the new sequence:
<sequence xmlns="http://ws.apache.org/ns/synapse" name="sendMail">
<property name="messageType" value="text/html" scope="axis2" type="STRING"></property>
<property name="ContentType" value="text/html" scope="axis2"></property>
<property xmlns:ns="http://org.apache.synapse/xsd" name="Subject" expression="$body/subject" scope="transport"></property>
<property xmlns:ns="http://org.apache.synapse/xsd" name="To" expression="$body/to" scope="transport"></property>
<property name="OUT_ONLY" value="true" scope="default" type="STRING"></property>
<log level="full"></log>
<send>
<endpoint>
<address uri="mailto:"></address>
</endpoint>
</send>
</sequence>
And this is the new proxy:
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="sendToMailIn"
transports="jms"
statistics="disable"
trace="disable"
startOnLoad="true">
<target inSequence="sendMail"/>
<parameter name="transport.jms.ContentType">
<rules>
<jmsProperty>contentType</jmsProperty>
<default>text/xml</default>
</rules>
</parameter>
<description/>
</proxy>
And this was my SOAP Envelop that WSO2 ESB receives from my ActiMQ queue as JMS message:
<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org /soap/envelope/">
<soapenv:Body>
<subject>Email subject comes here.</subject>
<to>address#test.com</to>
</soapenv:Body>
</soapenv:Envelope>
you have couple of options here.
you can use http headers and send the "to", "subject" values to ESB.
Send it as a payload value and extract using XPath expression
I solved it with using JSON in a JMS message. Here is my setup that works for me.
This is my JSON message:
{"to":"mail#test.com","subject":"TestSubject","mailbody":"Some body text ..."}
This is my proxy:
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="sendToMailIn"
transports="jms"
statistics="disable"
trace="disable"
startOnLoad="true">
<target inSequence="sendMail"/>
<parameter name="transport.jms.ContentType">
<rules>
<jmsProperty>contentType</jmsProperty>
<default>application/json</default>
</rules>
</parameter>
<parameter name="transport.mail.ContentType">application/xml</parameter>
<description/>
</proxy>
And this is my sequence:
<sequence xmlns="http://ws.apache.org/ns/synapse" name="sendMail">
<property name="messageType" value="text/plain" scope="axis2" type="STRING"></property>
<property name="ContentType" value="text/plain" scope="axis2"></property>
<property xmlns:ns="http://org.apache.synapse/xsd" name="Subject" expression="json-eval($.subject)" scope="transport"></property>
<property xmlns:ns="http://org.apache.synapse/xsd" name="To" expression="json-eval($.to)" scope="transport"></property>
<property name="OUT_ONLY" value="true" scope="default" type="STRING"></property>
<script language="js">
<![CDATA[var mailbody = mc.getPayloadJSON().mailbody.toString(); mc.setPayloadXML(
<ns:text xmlns:ns="http://ws.apache.org/commons/ns/payload">{mailbody}</ns:text>);]]>
</script>
<log level="full"></log>
<send>
<endpoint>
<address uri="mailto:"></address>
</endpoint>
</send>
</sequence>
I am relatively new to WSO2 ESB,
Trying to invoke a REST Web service with GET parameter which is hosted on WSO2 ESB through another REST API.
This is a simple Web service(SampleREST) which replies with welcome messsage in XML format,
When i am invoking this service directly; i can see the correct response on browser, shown below
<Message xmlns="http://ws.apache.org/ns/synapse">WelcomeRanjan</Message>
Now i created another REST web service(InvokeSampleRest) which in turn invokes SampleREST web service with the parametrized GET,
the Invoke WebService Client returns me the XML response wrapped inside the mediator xml tag and other malformed tags, shown below
<mediate><<Message xmlns>"http://ws.apache.org/ns/synapse">WelcomeRanjan</Message></<Message xmlns></mediate>
Here is my Code for the SampleREST API
<?xml version="1.0" encoding="UTF-8"?>
<api xmlns="http://ws.apache.org/ns/synapse" name="SampleREST" context="/SampleRest" hostname="10.203.245.47">
<resource methods="GET" uri-template="/{str1}">
<inSequence>
<header name="To" action="remove"/>
<property name="RESPONSE" value="true" scope="default" type="STRING"/>
<property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
<payloadFactory>
<format>
<Message>$1</Message>
</format>
<args>
<arg expression="get-property('uri.var.str1')"/>
</args>
</payloadFactory>
<log level="full" separator=",">
<property name="sequence" value="*** Got Request ***"/>
</log>
<send/>
</inSequence>
<outSequence/>
<faultSequence/>
</resource>
</api>
The code for the InvokeSampleREST code is as shown below( i am calling SampleREST service from here )
<?xml version="1.0" encoding="UTF-8"?>
<api xmlns="http://ws.apache.org/ns/synapse" name="InvokeSampleREST" context="/InvokeSampleREST" hostname="10.203.245.47">
<resource methods="GET" uri-template="/{str1}">
<inSequence>
<log level="full" separator=","/>
<property name="REST_URL_POSTFIX" expression="fn:concat('/Welcome',get-property('uri.var.str1'))" scope="axis2" type="STRING"/>
<log level="full">
<property name="sequence" value="****Message Sent *** "/>
</log>
<send>
<endpoint>
<address uri="http://10.203.245.47:8280/SampleRest/"/>
</endpoint>
</send>
</inSequence>
<outSequence>
<log level="full" separator=",">
<property name="out" value="** Ouput of Rest call ***"/>
</log>
<property name="ContentType" value="application/xml" scope="axis2" type="STRING"/>
<send/>
</outSequence>
<faultSequence/>
</resource>
</api>
Appreciate any help.
Thanks,
Ranjan
Why are you using two APIs? You can design your flow, in a single API. I mean you can merge them together.
BTW, you need to set the contentType property in your backend API(ie:At SampleREST API)
Because, when you send back the response to "InvokeSampleREST" API, System doesnt know the content-type of the incoming response and try to handle it as text message.
Eg:
<api name="SampleREST" context="/SampleRest" hostname="localhost">
<resource methods="GET" uri-template="/{str1}">
<inSequence>
<header name="To" action="remove"/>
<property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
<property name="RESPONSE" value="true" scope="default" type="STRING"/>
<payloadFactory>
<format>
<Message>$1</Message>
</format>
<args>
<arg expression="get-property('uri.var.str1')"/>
</args>
</payloadFactory>
<log level="full" separator=",">
<property name="sequence" value="*** Got Request ***"/>
</log>
<property name="Content-Type"
value="application/xml"
scope="transport"
type="STRING"/>
<send/>
</inSequence>
<faultSequence/>
</resource>
Try doing the following change at the InvokeSampleREST API.
At the outSequence, set the messageType as follows before the <send> mediator.
<property name="messageType" value="application/xml" scope="axis2"/>