module Network.Smtp.Monad
(
runMailT,
runMailT_,
mailError,
mailPut,
mailPutLn,
nextResponse
)
where
import qualified Data.Set as S
import Control.ContStuff
import Control.Exception.Peel as Ex
import Data.ByteString (ByteString)
import Data.ByteString.Char8 ()
import Data.Enumerator as E
import Data.Enumerator.Binary as EB
import Data.Enumerator.List as EL
import Data.Vector (Vector)
import Network.Smtp.Tools
import Network.Smtp.Types
import System.IO
mailError ::
Monad m =>
SmtpCommand -> String -> Integer -> Vector ByteString -> MailT r m a
mailError cmd errMsg code msgs =
throwError $ SmtpException errMsg cmd code (formatMsgs msgs)
mailPut :: MonadIO m => Enumerator ByteString (MailT r m) () -> MailT r m ()
mailPut enum = do
h <- lift $ getField mailHandle
run (enum $$ EB.iterHandle h) >>= either throwError return
mailPutLn :: MonadIO m => [ByteString] -> MailT r m ()
mailPutLn strs = mailPut $ concatEnums [enumList 16 strs, enumList 1 ["\r\n"]]
nextResponse :: Monad m => MailT r m SmtpResponse
nextResponse = do
let smtpError = throwError $ userError "Connection closed prematurely"
EL.head >>= maybe smtpError return
runMailT :: (Applicative m, Monad m) =>
Handle -> StringMailT (Either SomeException a) m a ->
m (Either SomeException a)
runMailT h c =
let cfg = MailConfig { mailExtensions = S.empty,
mailHandle = h }
in evalStateT cfg . run $ c
runMailT_ :: (Applicative m, MonadIO m) =>
Handle -> StringMailT (Either SomeException a) m a -> m a
runMailT_ h = runMailT h >=> either Ex.throwIO return