0

我有来自 Yahoo 邮件网络服务的 sxtracted json resonse。之后,我使用 play json 库进行了解析。

现在我无法迭代它并构造带有发件人姓名、主题、ccList 等的邮件对象列表。

我要构建的邮件对象是: List(EmailMessage(subject, recvdDate,body1,sender,recipientsList))

我浏览了play website 上的文档。但是作为scala的学习者很难理解它们。有人可以帮助我如何使用案例类来实现这一目标。

我得到了网络服务的响应:

{
    "result": {
        "folder": {
            "folderInfo": {
                "fid": "Sent",
                "name": "Sent"
            },
            "total": 3,
            "unread": 0,
            "size": 943522,
            "isSystem": true
        },
        "total": 3,
        "code": [],
        "message": [
            {
                "mid": "2_0_0_2_3196_ACfai2IAACqmUwNFtgAAAKAUN2U",
                "receivedDate": 1392723382,
                "subject": "test mail",
                "xapparentlyto": "",
                "hasBlockedImages": false,
                "flags": {
                    "isReplied": 0,
                    "isFlagged": 0,
                    "isRead": 1,
                    "isDraft": 0,
                    "isForwarded": 0,
                    "isHam": 0,
                    "isSpam": 0,
                    "hasAttachment": 0,
                    "isRecent": 1,
                    "inAddressBook": 0
                },
                "from": {
                    "email": "rajeevkumar.kallempudi@yahoo.com",
                    "name": "Rajeev Kumar Kallempudi"
                },
                "to": [
                    {
                        "email": "rajeevprasanna@gmail.com",
                        "name": "rajeevprasanna@gmail.com"
                    }
                ],
                "replyto": [
                    {
                        "email": "rajeevkumar.kallempudi@yahoo.com",
                        "name": "Rajeev Kumar Kallempudi"
                    }
                ],
                "cc": [],
                "bcc": [],
                "domainkey": false,
                "messageId": "<1392723382.76715.YahooMailNeo@web160105.mail.bf1.yahoo.com>",
                "inReplyTo": "",
                "references": "",
                "sender": "rajeevkumar.kallempudi@yahoo.com",
                "part": [
                    {
                        "partId": "HEADER",
                        "type": "x-unknown",
                        "subtype": "",
                        "typeParams": "",
                        "disposition": "",
                        "dispParams": "",
                        "encoding": "7bit",
                        "filename": "",
                        "size": 1474,
                        "contentId": "",
                        "isTruncated": false,
                        "hasBlockedImages": false,
                        "referencedInline": false
                    }                     
                ]
            },
            {
                "mid": "2_0_0_2_2463_ACfai2IAAAdpUwM1NwAAAD0sJOA",
                "receivedDate": 1392719159,
                "subject": "passage1",
                "xapparentlyto": "",
                "hasBlockedImages": false,
                "flags": {
                    "isReplied": 0,
                    "isFlagged": 0,
                    "isRead": 1,
                    "isDraft": 0,
                    "isForwarded": 0,
                    "isHam": 0,
                    "isSpam": 0,
                    "hasAttachment": 0,
                    "isRecent": 1,
                    "inAddressBook": 0
                },
                "from": {
                    "email": "rajeevkumar.kallempudi@yahoo.com",
                    "name": "Rajeev Kumar Kallempudi"
                },
                "to": [
                    {
                        "email": "rajeevkumar.kellmpudi@yahoo.com",
                        "name": ""
                    }
                ],
                "replyto": [
                    {
                        "email": "rajeevkumar.kallempudi@yahoo.com",
                        "name": "Rajeev Kumar Kallempudi"
                    }
                ],
                "cc": [],
                "bcc": [],
                "domainkey": false,
                "messageId": "<1392719159.63976.YahooMailNeo@web160106.mail.bf1.yahoo.com>",
                "inReplyTo": "",
                "references": "",
                "sender": "rajeevkumar.kallempudi@yahoo.com",
                "part": [
                    {
                        "partId": "HEADER",
                        "type": "x-unknown",
                        "subtype": "",
                        "typeParams": "",
                        "disposition": "",
                        "dispParams": "",
                        "encoding": "7bit",
                        "filename": "",
                        "size": 1949,
                        "contentId": "",
                        "isTruncated": false,
                        "hasBlockedImages": false,
                        "referencedInline": false
                    },
                    {
                        "partId": "TEXT",
                        "subtype": "alternative",
                        "type": "multipart",
                        "typeParams": "boundary=\"-827237569-990831377-1392719159=:63976\"",
                        "disposition": "",
                        "dispParams": "",
                        "encoding": "7bit",
                        "filename": "",
                        "size": 11623,
                        "contentId": "",
                        "isTruncated": false,
                        "hasBlockedImages": false,
                        "referencedInline": false
                    }                     
                ]
            } 
        ]
    },
    "error": null
}
4

1 回答 1

1

If you just query Yahoo's messages you won't get the content of emails, so you should use a query that looks more like this. Please note that this will query all of an account's messages, including read or archived ones.

select
  message.subject,
  message.receivedDate,
  message.from,
  message.to,
  message.cc,
  message.bcc,
  message.part.text
from ymail.msgcontent
where (fid,mids) in (
  select
    folder.folderInfo.fid,
    mid
  from ymail.messages
)

Once you have that you just need to use the JSON pick element features described in Play's documentation. It should look something like this:

import java.util._

case class EmailMessage(
  subject      : String,
  receivedDate : Date,
  body         : String,
  sender       : String,
  recipients   : List[String]
)

def yahooToEmailMessage(json:JsValue) = {

  val subject = json / "result" / "message" / "subject"
  val body = json / "result" / "message" / "part" / "text"
  val ts = (json / "result" / "message" / "receivedDate").toLong

  val receivedDate = new Date(ts * 1000L)

  val sender = getRecipient(json / "result" / "message" / "to")
  val to  = getRecipients(json / "result" / "message" / "to")
  val cc  = getRecipients(json / "result" / "message" / "cc")
  val bcc = getRecipients(json / "result" / "message" / "bcc")

  val recipients = to ::: cc ::: bcc

  EmailMessage(
    subject,
    receivedDate,
    body,
    sender,
    recipients
  )
}

def getRecipient(recipient:JsValue):List[String] = {

  val name  = recipient / "name"
  val email = recipient / "email"

  name + " <" + email + ">"
}

def getRecipients(array:JsArray):List[String] = {
  array.foldLeft(List[String]()) {
    (list,recipient) => list ::: List(getRecipient(recipient))
  }
}
于 2014-02-18T19:11:47.500 回答