module Network.Mail.Postmark
(postmark)
where
import Data.Aeson
import Data.Aeson.Types
import qualified Data.Attoparsec as A
import qualified Data.Map as M
import qualified Data.ByteString.Lazy as LBS
import qualified Data.ByteString as BS
import Data.Maybe (fromJust)
import Network.HTTP hiding (getRequest)
import Network.HTTP.Base
import Network.HTTP.Headers
import Network.URI (parseURI)
maybeAesonResult (Error _) = Nothing
maybeAesonResult (Success a) = Just a
strictifyBS = BS.concat . LBS.toChunks
postmark token from subject tag body to = do
resp <- simpleHTTP (Request
(fromJust $ parseURI "http://api.postmarkapp.com/email")
POST
[ mkHeader HdrAccept "application/json"
, mkHeader HdrContentType "application/json"
, mkHeader (HdrCustom "X-Postmark-Server-Token") token
, mkHeader HdrContentLength (show $ LBS.length rqbdy)]
rqbdy) >>= getResponseBody
let val = (parseMaybe (.: "Message")) =<< (maybeAesonResult.fromJSON) =<< (A.maybeResult $ A.parse json $ strictifyBS resp)
return $ maybe False (== ("OK"::BS.ByteString)) val
where rqbdy = encode $ M.fromList
[ ("From" :: BS.ByteString, from)
, ("To", to)
, ("Subject", subject)
, ("Tag", tag)
, ("TextBody", body)
]