【问题标题】:Mule downloads e-mail body as well as attachmentMule 下载电子邮件正文和附件
【发布时间】:2014-06-05 15:58:15
【问题描述】:

如何让 Mule 使用 pop3 只下载附件?我尝试尽可能接近http://www.mulesoft.org/documentation/display/current/POP3+Transport+Reference 的示例,但我不断收到两个文件:一个带有电子邮件正文,一个带有实际附件。这是我正在使用的流程:

<pop3:connector name="pop3Connector" checkFrequency="5000" doc:name="POP3"/>

<expression-transformer name="returnAttachments" doc:name="Expression">
    <return-argument evaluator="attachments-list" expression="*" />
</expression-transformer>

<file:connector name="fileName" doc:name="File">
    <file:expression-filename-parser/>
</file:connector>

<flow name="incoming-orders" doc:name="incoming-orders">
    <pop3s:inbound-endpoint host="pop.gmail.com" port="995" user="myuser%40mydomain" password="mypassword" responseTimeout="10000" doc:name="POP3" transformer-refs="returnAttachments" />
    <collection-splitter doc:name="Collection Splitter"/>
    <file:outbound-endpoint path="C:/popthreetest" outputPattern="#[function:datestamp].dat" doc:name="File">
        <expression-transformer>
            <return-argument expression="payload.inputStream" evaluator="groovy" />
        </expression-transformer>
    </file:outbound-endpoint>                   
</flow>

谢谢!

编辑:

这是基于@David Dossot 回答的最终流程。我有一个额外的复杂性,因为我正在读取一个 JSON 文件,该文件指定附件名称和附件的任意目的地。我包含了replaceAll,因为我收到了关于路径file:///C:\ 中的无效字符的错误。

<pop3:connector name="pop3Connector" checkFrequency="5000" doc:name="POP3"/>

<expression-transformer name="returnAttachments" doc:name="Expression">
    <return-argument evaluator="attachments-list" expression="*" />
</expression-transformer>

<file:connector name="DestinationsFileConnector" doc:name="File" autoDelete="false" streaming="true" validateConnections="true">
    <file:expression-filename-parser/>
</file:connector>
<file:endpoint path="C:/popthreetest/" name="DestinationsFileEndpoint" responseTimeout="10000" doc:name="File" connector-ref="DestinationsFileConnector">
    <file:filename-regex-filter pattern="destinations\.json" caseSensitive="true"/>
</file:endpoint>
<mulerequester:config name="DestinationsMuleRequestorConnector" doc:name="Mule Requester"/>

<flow name="incoming-orders" doc:name="incoming-orders">
    <pop3s:inbound-endpoint host="pop.gmail.com" port="995" user="myusername%40mydomain" password="mypassword" responseTimeout="10000" doc:name="POP3" transformer-refs="returnAttachments" />
    <collection-splitter doc:name="Collection Splitter"/>
    <set-variable variableName="MessagePart" value="#[message.payload]" doc:name="MessagePart"/>
    <logger message="Got #[message.payload.dataSource.name]." level="INFO" doc:name="Logger"/>
    <mulerequester:request config-ref="DestinationsMuleRequestorConnector" resource="DestinationsFileEndpoint" doc:name="GetDestinations"/>
    <json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/>
    <choice doc:name="Choice">
        <when expression="#[message.payload.get(MessagePart.dataSource.name) != null]">
            <set-payload value="#[message.payload.get(MessagePart.dataSource.name)]" doc:name="Destination List"/>
            <foreach doc:name="For Each">
                <logger message="Saving to #[message.payload]." level="INFO" doc:name="Logger"/>
                <set-variable variableName="DestinationPath" value="#[java.nio.file.Paths.get(message.payload).getParent().toString().replaceAll('\\\\', '/')]" doc:name="DestinationPath"/>
                <set-variable variableName="DestinationPattern" value="#[java.nio.file.Paths.get(message.payload).getFileName()]" doc:name="DestinationPattern"/>
                <logger message="Saving to #[DestinationPattern] in #[DestinationPath]." level="INFO" doc:name="Logger"/>
                <set-payload value="#[MessagePart]" doc:name="MessagePart"/>
                <file:outbound-endpoint path="#[DestinationPath]" outputPattern="#[DestinationPattern]" doc:name="File">
                    <expression-transformer> 
                        <return-argument expression="payload.inputStream" evaluator="groovy"/> 
                    </expression-transformer>
                </file:outbound-endpoint>
            </foreach>
        </when>
        <otherwise>
            <logger message="Did not find destination(s) for #[MessagePart.dataSource.name]." level="INFO" doc:name="Logger"/>
        </otherwise>
    </choice>
</flow>

为了完整起见,这里是 JSON 文件:

{
    "attachment-name.txt": [
        "C:/popthreetest/firstDestination.txt"
      , "C:/path/to/secondDestination.txt"
      , "C:\\popthreetest\\destination\\using-backslashes.txt"
    ]
}

【问题讨论】:

    标签: mule email-attachments pop3


    【解决方案1】:

    带附件的电子邮件是由多部分组成的电子邮件,其中附件是部分,但也是正文。因此,Mule 只能下载“整个包”并将不同的部分提供给您。

    您应该能够根据部分名称过滤collection-splitter 之后的正文部分。

    或者,您可以使用 MEL 表达式删除集合的第一个元素,通常是主体(Mule 在内部使用这种技术来设置消息负载:https://github.com/mulesoft/mule/blob/mule-3.x/transports/email/src/main/java/org/mule/transport/email/transformers/EmailMessageToString.java#L50

    【讨论】:

    • 如果我查看 message.payload.dataSource.name 不为空,是否足够?也就是说,可能有一些不是附件也有名字的东西吗?我实际上正在检查具有特定名称的附件,所以我认为它不会影响我,但是将来阅读此答案的其他人可能想知道。
    猜你喜欢
    • 1970-01-01
    • 2013-02-11
    • 2021-01-01
    • 1970-01-01
    • 2014-05-25
    • 2020-06-10
    • 2018-07-24
    • 2021-09-29
    • 1970-01-01
    相关资源
    最近更新 更多