packages feed

email-0.1: Network/EmailSend/SendMail.hs

module Network.EmailSend.SendMail(sendMessageSendMail
                                 , SendMailBackend(..)) where

----------------------------------------
---- STDLIB
----------------------------------------
import qualified System.IO as Sio
import qualified System.Process as Spo
import qualified Data.ByteString as BS
import System.Exit (ExitCode(..))

----------------------------------------
---- SITE-PACKAGES
----------------------------------------
import Network.EmailSend (MailBackend(..), SendingReceipt)
import Data.Encoding.UTF8 (UTF8(..))
import Data.Encoding (decodeStrictByteString)

----------------------------------------
---- LOCAL
----------------------------------------

_SENDMAIL_BINARY_ = "/usr/sbin/sendmail"

data SendMailBackend = SendMailBackend String | StdSendMailBackend
instance MailBackend SendMailBackend where
    sendMessage = sendMessageSendMail

sendMessageSendMail :: SendMailBackend -> String -> String -> BS.ByteString -> IO SendingReceipt
sendMessageSendMail (SendMailBackend binary) = sendEmail binary
sendMessageSendMail StdSendMailBackend = sendEmail _SENDMAIL_BINARY_

sendEmail :: String -> String -> String -> BS.ByteString -> IO SendingReceipt
sendEmail binary from to message =
  do (inh, outh, errh, ph) <-
       Spo.runInteractiveProcess binary [to] Nothing Nothing
     Sio.hClose outh
     BS.hPutStr inh message
     Sio.hClose inh
     ret <- Spo.waitForProcess ph
     case ret of
       ExitSuccess -> return Nothing
       ExitFailure code -> return $ Just $ show code