packages feed

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 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