在RING请求地图上使用Slurp后,如何获取电子邮件请求的一部分



我正在尝试解析从戒指请求地图中获取的电子邮件。我在请求映射中获得一个身体对象,然后使用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--

现在如何获得此消息的特定细节,例如内容或主题。除了Slurp外,还有其他方法可以解析它吗?否则我必须使用边界参数进行纯弦横文?

大概该请求包含的密钥不仅仅是:body。正如您所说,您正在寻找"内容","主题"等。因此,请使用:

(keys req) 

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

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

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

如果不是:body的键,那么您将不得不更仔细地查看:body的值。这是一个带有readLine Java方法的码头输入流,您可以反复调用(通过Clojure Interop)在内容中读取。Jetty Web服务器正在为输入的Java数据对象而不是Clojure数据结构提供服务,因此您需要使用API读取数据。

通常,戒指中间件用于将其提取到添加到请求映射中的params中。我不知道RFC822消息有任何此类中间件,因此您可能必须自己滚动。

您可以手动进行解析,但是我建议使用库为您做。我想大多数Java电子邮件库都可以使用RFC822流并将其变成某种Message对象。还有一个邮政,一个包裹Javamail API的Clojure库,尽管我不确定它是否会公开解析消息的函数。

最新更新