mule in action翻译17 : 3.5 使用EMAIL传输
email常被看成是主要用来进行个人之间通讯的,但它不仅仅是一个会话机制。email可用来转发监控警告,发送订单收据,协调调度。想一下当你在网站注册时、在亚马逊买书时,是不是经常会收到自动发送的邮件?这就是email传输的例子。本节中探讨如何使用email传输处理并生成这些消息。先看使用IMAP接收这些消息,然后看如何使用SMTP发送消息。
3.5.1 使用IMAP接收email
IMAP连接器允许你使用IMAP协议从邮件服务器接收邮件。IMAP --Internet Message Access Protocol
获取邮件的流行的方式,多数邮件服务器和客户端都支持IMAP。 IMAP是和不提供常规集成机制的应用进行集成的方便方式。例如一个遗留系统周期性的生成状态邮件,但不提供任何类型的可编程API。有时email是应用集成的更好的方式。比如当你需要以编程方式回应电子邮件确认时。这种情况下使用IMAP endpoint非常合适。
表3.4 列出IMAP一般的配置属性。
Prancing Donkey最近购买了一个由Frozen North Freezing公司制造的制冷系统。
该制冷系统有这么个功能:当某个环境指标超过阈值时会向某个地址发送邮件。Prancing Donkey想使用
这个功能驱动一些附属功能。例如,希望当这些事件发生时维护人员会受到短信通知。
他们也想发送数据到一个复杂事件处理系统, 以用来推断什么时候会可能发生灾难性事件。
他们联合使用IMAP传输、JMS topic、文件传输来实现这些功能。如下面列表及3.14图所示。
Listing 3.18 Dispatch cooling emails to a JMS topic
<jms:activemq-connector name="jmsConnector" specification="1.1" brokerURL="${jms.url}" /> <!-- 注释1 配置IMAP连接器 --> <imap:connector name="imapConnector" deleteReadMessages="true" checkFrequency="60000" /> <flow name="dispatchCoolingAlerts"> <!-- 配置IMAP inbound endpoint,指定邮件服务器详细信息 --> <imap:inbound-endpoint host="${imap.host}" port="${imap.port}" user="cooling" password="password"> </imap:inbound-endpoint> <!-- 这个all 路由器会分发到多个endpoint --> <all> <file:outbound-endpoint path="./data/cooling/reports"> <!-- 表达式转换器用来从mule消息中提取邮件附件 --> <expression-transformer expression="#[message.inboundAttachments.report]" /> </file:outbound-endpoint> <jms:outbound-endpoint topic="cooling.alerts"> <!--注释2 转换email为String形式 --> <email:email-to-string-transformer /> </jms:outbound-endpoint> </all> </flow>
all 路由器可以把同个消息发送到多个endpoint,第5章深入讨论。现在用它保存邮件的附件
(本例是制冷报告的PDF)到一个归档目录,然后把email消息发送到JMS topic。某些协议是
支持附件的比如SOAP 和 HTTP 。本例中你可以使用附件计算器来提取附件,如列表3.18中一样。
注释1处,是显示定义IMAP连接器。设置checkFrequency为10分钟(单位毫秒)。
设置deleteReadMessages为true,消息被读取后将会在服务器上删除。
注释2处,注意email的命名空间。email命名空间包含消息处理器,这里用的email-to-email
String转换器,这些处理器简化了邮件消息处理。
最佳实践 使用backupFolder和backupEnabled属性时要注意。mule将为它处理的每个
消息创建一个文件夹。在邮件压力大的环境下可能导致文件系统问题比如文件系统地方inode被耗尽。
3.5.2 使用SMTP发送邮件
SMTP传输让你可以使用一个outbound endpoint发送邮件消息。这在多种情况下是有用的。你已经看到了Prancing Donkey公司的制冷系统使用SMTP发送警告数据。你现在对机动接受购物确认邮件、论坛订阅邮件没有疑问了。在完成一个长耗时处理后发送通知送邮件的方式的是比较有用的,比如备份完成时进行通知。
来看如何配置SMTP连接器和endpoint。
列表3.5 列出了配置SMTP的常用属性。一般可以通过这些属性指定生产的邮件头信息。
来回顾一下本章开头时提到的 Arnor Accounting 的例子。列表3.14 中当收到 Arnor Accounting 应用的回调时分发一个JMS消息。列表3.15 中添加了一个对JMS topic的订阅者,以记录事件。现在添加另外一个订阅者,当支出报表别处理后发送email给Prancing Donkey 会计人员。
Listing 3.19 Using an SMTP endpoint to send an email
<flow name="sendExpenseReportEmails"> <!--注释1 订阅expenses.status topic--> <jms:inbound-endpoint topic="expenses.status" exchange-pattern="one-way"/> <!--配置 SMTP outbound endpoint--> <smtp:outbound-endpoint from="[email protected]" host="${smtp.host}" port="${smtp.port}" subject="Expense Report Processed" to="[email protected]"> <!--把消息payload转为email--> <email:string-to-email-transformer/> </smtp:outbound-endpoint> </flow>
注释1处 配置JMS endpoint,当消息发送到 expenses.status topic时,这里的JMS endpoint会受到通知。
这些消息的payload将转换为email,并通过SMTP outbound endpoint发送到[email protected] 。