{-# LANGUAGE OverloadedStrings #-} module Mail ( send ) where import Data.Text (Text) import qualified Data.Text as T import qualified Data.Text.Lazy as LT import Data.Text.Lazy.Builder (toLazyText, fromText) import Data.Either (isLeft) import Control.Exception (SomeException, try) import Control.Arrow (left) import qualified Network.Mail.Mime as Mime import Model.Mail (Mail) import qualified Model.Mail as Mail send :: Mail -> IO (Either Text ()) send mail = do result <- left (T.pack . show) <$> (try (Mime.renderSendMail . getMimeMail $ mail) :: IO (Either SomeException ())) if isLeft result then putStrLn ("Error sending the following email:" ++ (show mail)) else return () return result getMimeMail :: Mail -> Mime.Mail getMimeMail mail = let fromMail = Mime.emptyMail . address . Mail.from $ mail in fromMail { Mime.mailTo = map address . Mail.to $ mail , Mime.mailParts = [ [ Mime.plainPart . strictToLazy . Mail.plainBody $ mail , Mime.htmlPart . strictToLazy . Mail.htmlBody $ mail ] ] , Mime.mailHeaders = [("Subject", Mail.subject mail)] } address :: Text -> Mime.Address address addressEmail = Mime.Address { Mime.addressName = Nothing , Mime.addressEmail = addressEmail } strictToLazy :: Text -> LT.Text strictToLazy = toLazyText . fromText