Отправка электронной почты с несколькими вложениями не работает в mule ESB с использованием set-attachment

<flow name="SendmailFlow" >
    <http:listener config-ref="HTTP_Listener_Configuration" path="${sendmail.path}" doc:name="HTTP"/>
    <!--  http:inbound-endpoint exchange-pattern="request-response"
        host="${sendmail.host}" port="${sendmail.port}" path="${sendmail.path}" doc:name="HTTP" /-->

    <logger message="logging #[payload]" level="INFO" doc:name="Logger" />

    <json:json-to-object-transformer
        returnClass="com.rsa.esbcommons.mailsender.MailData" doc:name="JSON to Object" />

    <foreach collection="#[payload.getAttachments()]" doc:name="For Each Attachment in MailData">           
        <set-attachment attachmentName="#[payload.getFilename()]" value="#[payload.getBase64AttachmentContent()]"
            contentType="#[payload.getContentType()]" doc:name="Create Attachment" />
    </foreach>  

    <smtp:outbound-endpoint user="${smtp.user}" password="${smtp.password}" host="${smtp.host}" from="${smtp.from}" responseTimeout="10000"
        doc:name="SMTP" mimeType="text/html" transformer-refs="MailDataToEmailTransformer StringToEmail" />
    <custom-transformer class="com.rsa.esbcommons.mailsender.MailResponseMessageTransformer" doc:name="MailResponseTransformer"/>
    <json:object-to-json-transformer sourceClass="com.rsa.esbcommons.mailsender.BaseResponse" doc:name="Sendmail response to JSON"/>

</flow>

Здесь проблема заключается в том, что вложение не удается, когда set-attachment используется в цикле foreach, который указан выше. Это для отправки нескольких вложений по электронной почте. Можем ли мы использовать set-attachment в цикле foreach? Пожалуйста, помогите заранее, спасибо


person user872297    schedule 30.09.2015    source источник
comment
Какая полезная нагрузка перед переходом к foreach? Действительно ли он содержит вложения в этот момент, чтобы использовать их в качестве коллекции для foreach?   -  person afelisatti    schedule 30.09.2015
comment
Цикл Foreach содержит список объектов MailAttachment. Payload - это объект типа MailAttachment pojo, имеющий следующие поля filename; Тип содержимого; base64AttachmentContent; Значения установлены правильно, но подключение не выполняется.   -  person user872297    schedule 01.10.2015
comment
Если полезная нагрузка уже является списком, вам не следует добавлять атрибут коллекции. Попробуйте удалить его.   -  person afelisatti    schedule 01.10.2015


Ответы (3)


Это старый пост, но я предлагаю свое решение тем, у кого такая же проблема.

Проблема здесь в том, что после предложения foreach сообщение mule восстанавливает свое исходное состояние (пустые outboundAttachments). Вы должны создать временную переменную потока и перезаписывать ее на каждой итерации текущим message.outboundAttachments. Наконец, за пределами каждой области вы должны установить message.outboundAttachments, копирующую из временной переменной. Вот код, который вам стоит попробовать.

<flow name="SendmailFlow" >
<http:listener config-ref="HTTP_Listener_Configuration" path="${sendmail.path}" doc:name="HTTP"/>

    <json:json-to-object-transformer
        returnClass="com.rsa.esbcommons.mailsender.MailData" doc:name="JSON to Object" />

    <set-variable variableName="attaches" value="#[new java.util.HashMap()]" />

    <foreach collection="#[payload.getAttachments()]" doc:name="For Each Attachment in MailData">           
        <set-attachment attachmentName="#[payload.getFilename()]" value="#[payload.getBase64AttachmentContent()]"
            contentType="#[payload.getContentType()]" doc:name="Create Attachment" />

        <expression-component><![CDATA[java.util.Set keys = message.outboundAttachments.keySet();
        for(Object key:keys){flowVars.attaches.put(key, message.outboundAttachments.get(key));
        }]]>
        </expression-component>
    </foreach>

    <expression-component>
    <![CDATA[
    message.outboundAttachments.putAll(flowVars.attaches);
    ]]>
    </expression-component>

<smtp:outbound-endpoint user="${smtp.user}" password="${smtp.password}" host="${smtp.host}" from="${smtp.from}" responseTimeout="10000"
        doc:name="SMTP" mimeType="text/html" transformer-refs="MailDataToEmailTransformer StringToEmail" />
    <custom-transformer class="com.rsa.esbcommons.mailsender.MailResponseMessageTransformer" doc:name="MailResponseTransformer"/>
    <json:object-to-json-transformer sourceClass="com.rsa.esbcommons.mailsender.BaseResponse" doc:name="Sendmail response to JSON"/>

</flow>`

И я не уверен, следует ли вам удалить строку для ссылки трансформатора электронной почты. Это сработало для меня.

person J.Antonio Rubio    schedule 12.05.2017

Вы можете использовать set-attachment в компоненте foreach. в этом нет проблемы. У вас возникла проблема, связанная с чем-то другим. Попробуйте поставить отладку и посмотреть, что происходит. Лучше проверьте свои MEL-выражения, правильно ли они возвращают значения (сохраните регистратор для печати значений). проверьте ссылки ниже для получения дополнительной помощи

Как добавить несколько почтовых вложений в smtp с помощью Mule ESB

https://dzone.com/articles/handling-file-attachments

person RamakrishnaN    schedule 30.09.2015
comment
‹Foreach collection = # [payload.getAttachments ()] doc: name = Для каждого вложения в MailData› ‹set-attachmentName = # [payload.getFilename ()] value = # [payload.getBase64AttachmentContent ()] contentType = # [ payload.getContentType ()] doc: name = Create Attachment / ›‹/foreach› Эта часть не работает. - person user872297; 01.10.2015

Мое решение очень похоже на решение Дж. Антонио Рубио, но я немного упростил выражение внутри foreach:

<json:json-to-object-transformer
    returnClass="com.rsa.esbcommons.mailsender.MailData" doc:name="JSON to Object" />

<set-variable variableName="attaches" value="#[new java.util.HashMap()]" />

<foreach collection="#[payload.getAttachments()]" doc:name="For Each Attachment in MailData">           
    <set-attachment attachmentName="#[payload.getFilename()]" value="#[payload.getBase64AttachmentContent()]"
        contentType="#[payload.getContentType()]" doc:name="Create Attachment" />

    <expression-component><![CDATA[flowVars.attaches.putAll(message.outboundAttachments);]]>
    </expression-component>
</foreach>

<expression-component>
<![CDATA[
message.outboundAttachments.putAll(flowVars.attaches);
]]>
</expression-component>

person AndrWeisR    schedule 03.04.2020