1

これに似たメールを解析したい

Random Info: ........
From: email@domain.com
Other Info: .......
Subject: ima subject
Some More Info: .....

This is a message.

しかし、この電子メールのすべての情報は必要ありません。「差出人」、「件名」、およびメッセージ自体のみ。このようなメッセージを解析するにはどうすればよいですか? より具体的には、不要なデータをスキップするにはどうすればよいですか?

ここに私がこれまでに持っているコードがあります

{-# LANGUAGE OverloadedStrings #-}

module MailParser where

import qualified Data.Text as T
import Data.Attoparsec.Text

type From    = Address
type Message = T.Text
type Subject = T.Text
type Local   = T.Text
type Domain  = T.Text

data Address = Address Local Domain
data Mail = Mail From Subject Message

addressParser :: Parser Address
addressParser = do
    _ <- string "From: "
    local  <- takeWhile1 (/= '@')
    _ <- char '@'
    domain <- takeWhile1 (/= '\n')
    return $ Address local domain

subjectParser :: Parser T.Text
subjectParser = do
    _ <- string "Subject: "
    takeWhile1 (/= '\n')

messageParser :: Parser Message
messageParser = do
    _ <- char '\n'
    takeText

mailParser :: Parser Mail
mailParser = do
    -- skip unwanted info
    from <- addressParser
    -- skip unwanted info
    subject <- subjectParser
    -- skip unwanted info
    message <- messageParser
    return $ Mail from subject message
4

1 に答える 1

1

パーサーでテキストを無視する代わりに、メールを通常どおりに解析してから、関心のあるヘッダーのみを投影するという別のアプローチがあります。

-- After parsing, say we end up with this data.
data Email = Email { headers :: [Header], message :: Text }

data Header = Header { label :: Text, value :: Text }

-- Helper to find headers in an Email.
findHeader :: Text -> Email -> Maybe Header
findHeader x = find ((==x) . label) . headers

-- Project the Email's "Subject" header.
subject :: Email -> Maybe Header
subject = findHeader "Subject"

-- Project the Email's "From" header.
from :: Email -> Maybe Header
from = findHeader "From"

また、hsemailhsemail-nsは、Parsec 電子メール パーサーを定義しています。

于 2015-12-31T17:36:54.437 に答える