Skip to main content

#Payload.name0 discussing

Hi,

I have a dynamic payload,

Would like to send the email with dynamic attachments while looping through the payload array.

My sample payload below

{

"attachments": [{

"fileType": "txt",

"fileName": "textattachment.txt",

"values": "This is the First email text attachment for NG"

}

{

"fileType": "txt",

"fileName": "sectextattachment.txt",

"values": "This is the Secondemail text attachment for NG"

}

]

}

 

Attachment payload will be dynamic and some time it can have single attachment and some time it has multiple attachments with txt ,csv types.

In single email I want to have all the attachments of payload

How I can loop through this payload and send the attachments.

Is it possible to Payload Map inside Send connector attachment section?.

 

Thanks in advance

--

Naveen G

1 answer
  1. Feb 1, 2022, 10:40 PM

    I just saw this question, I am sure you might have resolved it. Just adding my response in case anyone else looking for.

     

    //Create an empty map

    <set-variable value="#{}" doc:name="Set Variable" doc:id="4174b647-2b19-4803-bd16-f88cb7e910d1" variableName="fileList"/>

     

    //iterate over attachement list

    <foreach doc:name="For Each" doc:id="c166af5e-5c74-4157-90a4-e23cea3102f5" collection="#payload.attachment">

    <file:read doc:name="Read" doc:id="330f2166-d2b1-43f8-be7c-de132f92b7c7" config-ref="File_Config" path="#payload.name" target="tempAttach" />

    <ee:transform doc:name="Transform Message" doc:id="6610f4eb-3ce2-4832-9ef5-72d3f9492bff">

    <ee:message>

    </ee:message>

    <ee:variables>

    <ee:set-variable variableName="fileList"><![CDATA[%dw 2.0

    import * from dw::core::Binaries

    output application/java

    ---

    vars.fileList ++ {

    (payload.name) : toBase64(vars.tempAttach)

    }]]></ee:set-variable>

    </ee:variables>

    </ee:transform>

    </foreach>

     

    ------------------------------------------

     

    in SMTP connector use following to iterate the map and add attachement

    %dw 2.0

    output application/java

    ---

    vars.fileLIst mapObject ((value, key, index) -> 

    {

       (key) : value

    })

0/9000

I'm able to send attachments in email sent thru postman but i'm not able to open the files other than text document. Images or excel documents are getting corrupted.

 

Below is my code

<flow name="EmailNotification" doc:id="f82a581f-d482-4563-9b4b-7d77dac6bc79" >

<http:listener doc:name="Listener" doc:id="62399e67-1571-4853-adbf-a6792bf6fc47" config-ref="HTTP_Listener_config" path="/notification"/>

<ee:transform doc:name="Transform Message" doc:id="5f9a39dd-f29c-4426-aa35-96af12e7d8d0" >

<ee:message >

<ee:set-payload ><![CDATA[%dw 2.0

output application/json

var payloadParts=payload pluck($) default []

---

payloadParts[0] pluck($) default []]]></ee:set-payload>

</ee:message>

</ee:transform>

<scatter-gather doc:name="Scatter-Gather" doc:id="a6ea54cf-44fd-4e51-95fe-b42d2972c77b" >

<route >

<flow-ref doc:name="Extract Files" doc:id="89aa790f-6598-44b2-b654-8eada52a764a" name="ExtractFilesV2"/>

</route>

<route >

<flow-ref doc:name="Extract Email Info" doc:id="1fa6ced4-388d-4d51-a348-e0cbea8150d7" name="ExtractEmailInfo"/>

</route>

</scatter-gather>

<email:send doc:name="Send" doc:id="ad4a1837-9f8b-403b-ac16-521cd88e3d81" config-ref="Email_SMTP" fromAddress='XXXXXX' subject='#payload."1".payload.emailInfo.subject'>

<email:to-addresses>

<email:to-address value="XXXXXX" />

</email:to-addresses>

<email:body contentType='#payload."1".payload.emailInfo.contentType' encoding="UTF-8">

<email:content ><![CDATA[#payload."1".payload.emailInfo.message]]></email:content>

</email:body>

<email:attachments ><![CDATA[#payload."0".payload]]></email:attachments>

</email:send>

</flow>

 

1st version of extracting files from the REST call: with this version, the content is sent as the string and that is causing the issue as the file is corrupted. only plain text documents are opening correctly

<flow name="ExtractFiles" doc:id="092f386c-6db8-4739-9566-9974842a6abe">

<ee:transform doc:name="Transform Message" doc:id="f9b19507-fe7f-4b76-9080-5625ce9aa08d" >

<ee:message >

<ee:set-payload ><![CDATA[%dw 2.0

output application/json

---

payload filter (value, index) -> (value.headers."Content-Disposition".name=='file') ]]></ee:set-payload>

</ee:message>

</ee:transform>

<ee:transform doc:name="Transform Message" doc:id="50de2910-0d54-43ba-8380-927ad1b01323">

<ee:message>

<ee:set-payload><![CDATA[%dw 2.0

output application/java

---

payload map (payload01, indexOfPayload) -> {

'$(payload01.headers."Content-Disposition".filename)': payload01

} ]]></ee:set-payload>

</ee:message>

</ee:transform>

<ee:transform doc:name="Transform Message" doc:id="0515439f-7344-4db7-a1e7-0a540af4563e">

<ee:message>

<ee:set-payload><![CDATA[%dw 2.0

output application/java

---

payload reduce ((fileName, obj={}) -> obj ++ fileName)]]></ee:set-payload>

</ee:message>

</ee:transform>

</flow>

 

2nd version of extracting files from the REST call: i'm converting the payload content to binary and i'm still having issue opening the attached file from email and it is corrupted. Also have issues with supported data formats issue with the second approach

https://docs.mulesoft.com/mule-runtime/4.3/dataweave-formats

 

<flow name="ExtractFilesV2" doc:id="03d5a23c-7315-4bfc-9b91-7ba7e54a21a5">

<ee:transform doc:name="Transform Message" doc:id="10e95afb-68fb-48e4-a49c-f3abd286652a">

<ee:message>

<ee:set-payload><![CDATA[%dw 2.0

output application/json

---

payload filter (value, index) -> (value.headers."Content-Disposition".name=='file') ]]></ee:set-payload>

</ee:message>

</ee:transform>

<ee:transform doc:name="Transform Message" doc:id="a9779246-4e6f-49fa-9eee-0c0b60dfa257">

<ee:message>

<ee:set-payload><![CDATA[%dw 2.0

import java!emailnotification::ContentUtil

output application/java

---

payload map (payload01, indexOfPayload) -> {

'fileName': payload01.headers."Content-Disposition".filename,

'content': payload01.content,

'contentType': ContentUtil::getContentType(payload01.headers."Content-Type")

} ]]></ee:set-payload>

</ee:message>

</ee:transform>

<ee:transform doc:name="Transform Message" doc:id="4ee72e07-6738-4969-bacb-2ee2e2b106b9">

<ee:message>

<ee:set-payload><![CDATA[%dw 2.0

import java!emailnotification::ContentUtil

output application/java

---

payload reduce ((val, acc = {}) -> acc ++ (( { (val.fileName) : ( ContentUtil::getBytes(val.content) write val.contentType ) } )))]]></ee:set-payload>

</ee:message>

</ee:transform>

</flow>

 

Appreciate any help in solving the issue. Thanks.

5 answers
0/9000
6 answers
0/9000