如何在响铃请求图上使用slurp后获取邮件请求的消息部分?

时间:2016-11-25 03:59:29

标签: clojure

我正在尝试解析来自响铃请求地图的电子邮件。 我在请求图中得到一个body对象,然后我使用slurp来读取对象。所以,当我(slurp (:body req))时,我得到了这个输出:

Date: Fri, 25 Nov 2016 09:06:30 +0630
From: divya.nagar@juspay.in
To: localhost:8080
Cc: cccc
Subject: okay this is subject
Content-Type: multipart/alternative; boundary=T0IDt0S-7950392
--T0IDt0S-7950392
Content-Type: text/plain; charset=UTF-8
kjhdjkdshjk sivya nagar
--T0IDt0S-7950392
Content-Type: text/html; charset=UTF-8
kjhdjkdshjk sivya nagar
--T0IDt0S-7950392--

现在,如何获取此消息的特定详细信息,例如内容或主题。除了啜食之外,还有其他方法可以解析它吗?或者我必须使用边界参数进行普通的字符串遍历?

2 个答案:

答案 0 :(得分:1)

据推测,请求包含的密钥多于:body。正如你所说,你正在寻找'内容'主题'所以使用:

(keys req) 

查找邮件中可用的所有关键字。下次您可以使用其中一个或多个而不是:body

假设您发现密钥为:sender:receiver,并且您对它们感兴趣,则可以通过解构其值来解析消息:

(let [{:keys [sender receiver]} req]
  (println "sender is" sender)) 

如果除:body之外的其他键不符合您的要求,那么您必须更仔细地查看:body的值。它是一个带有readLine Java方法的Jetty输入流,您可以重复调用(通过Clojure interop)来读取内容。 Jetty Web Server提供类型化的Java数据对象而不是Clojure数据结构,因此您需要使用API​​读取数据。

答案 1 :(得分:0)

通常,环中间件用于将正文提取到params中,并添加到请求映射中。我不知道RFC822消息的任何此类中间件,因此您可能需要自己动手。

您可以手动进行解析,但我建议您使用库来为您完成。我想大多数Java电子邮件库都能够获取RFC822流并将其转换为某种Message对象。还有postal,一个包装JavaMail API的Clojure库,虽然我不确定它是否公开了解析消息的函数。