在mule添加附件到电子邮件的示例

时间:2014-01-20 13:56:02

标签: email smtp mule

我想问一下如何在Mule(3.4.0)中添加文件作为附件?

我尝试了很多解决方案,并搜索了很多但没有找到任何好处。

这就是我现在所拥有的(在发布之前的最后一次尝试):

<sub-flow name="sendBackMail" doc:name="sendBackMail">
    <set-attachment attachmentName="changed.xml" value="#[payload]" contentType="text/xml" doc:name="Attachment"/>
    <logger message="Attachment ok" level="INFO" doc:name="Logger"/>
    <file:file-to-byte-array-transformer doc:name="File to Byte Array"/>
    <logger message="Attachment ok. Message: #[message]" level="INFO" doc:name="Logger"/>
    <smtps:outbound-endpoint host="${mailSMTP}" port="${mailSendPort}" 
        user="${mailUser}" password="${mailPass}" to="${receiver}" 
        from="${mailUser}" responseTimeout="60000"  doc:name="SMTP" 
        connector-ref="SMTP"  mimeType="text/xml" subject="msp2bass" >
    </smtps:outbound-endpoint>
</sub-flow>

它发送邮件但我得到xml文件的内容作为邮件正文。

我应该做什么/改变,以便邮件作为附件发送。我从另一个服务器获取文件,在其上执行XSLT然后我应该将其发送到一些邮件。

我应该提供更多信息吗?

谢谢!

修改

我如何调用bean:

<spring:bean id="SetAttachment" name="SetAttachment" class="si.irose.msp.cust.bass.SetAttachment">
</spring:bean>

<component doc:name="Java">
    <spring-object bean="SetAttachment"/>
</component>

Java类:

package si.irose.msp.cust.bass;

import org.mule.api.MuleEventContext;
import org.mule.api.MuleMessage;
import org.mule.api.lifecycle.Callable;

public class SetAttachment implements Callable{ 
    private MuleMessage mule;
    private String name;
    @Override
    public Object onCall(MuleEventContext eventContext) throws Exception {
        mule = eventContext.getMessage();
        String tryit="routeid";
        for (int i=0;i<mule.getInvocationPropertyNames().toArray().length;i++) {
            if (mule.getInvocationPropertyNames().toArray()[i].equals(tryit)) {
                name=mule.getInvocationProperty(mule.getInvocationPropertyNames().toArray()[i].toString()).toString();
                break;
            }
        }
        mule.addOutboundAttachment(name, mule.getInvocationProperty(name), "text/xml");
        return null;
    }
}

2 个答案:

答案 0 :(得分:1)

好的问题已经解决了。

当您从文件入站读取或使用quartz(字符串或文件)生成时,您可以直接添加“附件”但是如果您执行XSLT转换然后尝试通过smtp发送该有效负载,那么您需要添加“对象”字符串“附件前的变压器。

最终工作解决方案:

<sub-flow name="sendBackMail" doc:name="sendBackMail">
    <object-to-string-transformer doc:name="Object to String"/>
    <set-attachment attachmentName="changed.xml" value="#[payload]" contentType="text/xml" doc:name="Attachment"/>
    <logger message="Attachment ok" level="INFO" doc:name="Logger"/>
    <file:file-to-byte-array-transformer doc:name="File to Byte Array"/>
    <logger message="Attachment ok. Message: #[message]" level="INFO" doc:name="Logger"/>
    <smtps:outbound-endpoint host="${mailSMTP}" port="${mailSendPort}" 
        user="${mailUser}" password="${mailPass}" to="${receiver}" 
        from="${mailUser}" responseTimeout="60000"  doc:name="SMTP" 
        connector-ref="SMTP"  mimeType="text/xml" subject="msp2bass" >
    </smtps:outbound-endpoint>
</sub-flow>

如果你做任何其他工作而不是XSLT,我还没有检查你需要申请什么变压器,所以如果有人希望为此添加一些知识,那么请这样做并添加评论。

答案 1 :(得分:0)

您需要在set-payload之前使用smtps:outbound-endpoint将电子邮件的正文设置为您想要的内容,否则它将包含与set-attachment附加的相同值。

同时删除file:file-to-byte-array-transformer:目前还不清楚它的用途。