mime-mail-ses (empty) → 0.0.0
raw patch · 4 files changed
+135/−0 lines, 4 filesdep +basedep +base64-bytestringdep +bytestringsetup-changed
Dependencies added: base, base64-bytestring, bytestring, cereal, crypto-api, cryptohash, http-enumerator, mime-mail, old-locale, time
Files
- LICENSE +30/−0
- Network/Mail/Mime/SES.hs +78/−0
- Setup.hs +2/−0
- mime-mail-ses.cabal +25/−0
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c)2011, Michael Snoyman++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Michael Snoyman nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Network/Mail/Mime/SES.hs view
@@ -0,0 +1,78 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE DeriveDataTypeable #-}+module Network.Mail.Mime.SES+ ( sendMailSES+ , renderSendMailSES+ , SES (..)+ , SESException (..)+ ) where++import Data.ByteString (ByteString)+import Network.Mail.Mime (Mail, renderMail')+import qualified Data.ByteString.Lazy as L+import Network.HTTP.Enumerator+import Data.Time.Format (formatTime)+import System.Locale (defaultTimeLocale)+import Data.Time (getCurrentTime)+import qualified Data.ByteString.Char8 as S8+import Crypto.HMAC+import Crypto.Hash.SHA256 (SHA256)+import Data.ByteString.Base64 (encode)+import qualified Data.Serialize as S+import Control.Exception (Exception, throwIO)+import Data.Typeable (Typeable)+import Control.Monad (unless)++data SES = SES+ { sesFrom :: ByteString+ , sesTo :: [ByteString]+ , sesAccessKey :: ByteString+ , sesSecretKey :: ByteString+ }++renderSendMailSES :: SES -> Mail -> IO ()+renderSendMailSES ses mail = renderMail' mail >>= sendMailSES ses++sendMailSES :: SES -> L.ByteString -> IO ()+sendMailSES ses msg = do+ now <- getCurrentTime+ let date = S8.pack $ format now+ sig = makeSig date $ sesSecretKey ses+ req' <- parseUrl "https://email.us-east-1.amazonaws.com"+ let auth = S8.concat+ [ "AWS3-HTTPS AWSAccessKeyId="+ , sesAccessKey ses+ , ", Algorithm=HmacSHA256, Signature="+ , sig+ ]+ let req = req'+ { queryString = qs+ , requestHeaders =+ [ ("Date", date)+ , ("X-Amzn-Authorization", auth)+ ]+ }+ res <- withManager $ httpLbs req+ unless (statusCode res == 200) $ throwIO $ SESException res+ where+ qs =+ ("Action", Just "SendRawEmail")+ : ("Source", Just $ sesFrom ses)+ : ("RawMessage.Data", Just $ encode $ S8.concat $ L.toChunks msg)+ : zipWith mkDest [1 :: Int ..] (sesTo ses)+ mkDest num addr = (S8.pack $ "Destinations.member." ++ show num, Just addr)+ format = formatTime defaultTimeLocale "%a, %e %b %Y %H:%M:%S %z"++makeSig :: ByteString -> ByteString -> ByteString+makeSig payload key =+ encode+ $ S.encode+ $ hmac' (MacKey key) payload+ `asTypeOf` x+ where+ x :: SHA256+ x = undefined++data SESException = SESException Response+ deriving (Show, Typeable)+instance Exception SESException
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ mime-mail-ses.cabal view
@@ -0,0 +1,25 @@+Name: mime-mail-ses+Version: 0.0.0+Synopsis: Send mime-mail messages via Amazon SES+Homepage: http://github.com/snoyberg/mime-mail-ses+License: BSD3+License-file: LICENSE+Author: Michael Snoyman+Maintainer: michael@snoyman.com+Category: Web+Build-type: Simple+Cabal-version: >=1.2++Library+ Exposed-modules: Network.Mail.Mime.SES+ Build-depends: base >= 4 && < 5+ , crypto-api >= 0.6 && < 0.7+ , cereal >= 0.3 && < 0.4+ , base64-bytestring >= 0.1 && < 0.2+ , cryptohash >= 0.7 && < 0.8+ , bytestring >= 0.9 && < 0.10+ , time >= 1.1 && < 1.3+ , old-locale+ , http-enumerator >= 0.6 && < 0.7+ , mime-mail >= 0.3 && < 0.4+ ghc-options: -Wall