diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -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.
diff --git a/Network/Mail/Mime/SES.hs b/Network/Mail/Mime/SES.hs
new file mode 100644
--- /dev/null
+++ b/Network/Mail/Mime/SES.hs
@@ -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
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/mime-mail-ses.cabal b/mime-mail-ses.cabal
new file mode 100644
--- /dev/null
+++ b/mime-mail-ses.cabal
@@ -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
