HaskellでSESを使って添付ファイル付メールを送る

SESでのメール送信に関連するライブラリの紹介記事です。

SESで添付ファイル付メールを送るにはSendRawEmailアクションを使用する。この時メールのフォーマットを組み立てる必要が有るため、自力で全部やるのは厳しい。

次のライブラリを使用した。

  • amazonka-ses, amazonka
    • 包括的なAWSのSDK。その内のSESに対するアクション。
  • mime-mail
    • MIMEを扱うためのライブラリ。これを使いSendRawEmailに送るメールのデータを作成する。
  • heterocephalus
    • 型安全なテンプレートエンジン。本題からはそれるが、メール本文の作成に使用。

mime-mail

Mail 型の値を組み立てて、renderMailでByteStringを作成(renderMail'でboundaryランダム生成)。

Mailの組み立てに幾つかの便利関数が用意されている。

{-# LANGUAGE OverloadedStrings #-}

import Network.Mail.Mime  
import Data.ByteString.Lazy (toStrict)

sample body = do  
  mail <- addAttachment "text/plain" "/path/to/file.txt" $ simpleMail' "to@example.com" "from@example.com" "title" body
  msg <- renderMail' mail
  -- ...

amazonka-ses

APIへのリクエストに必要な環境を設定して、sendRawEmailにメール内容のbytesを渡す。

Discover ではデフォルトの環境変数(AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY)の読み込み、それがなければiamのprofile読み込みを行ってくれる。

import Control.Lens  
import Control.Monad.Trans.AWS  
import Network.AWS.SES  
import Control.Monad  
import Data.ByteString.Lazy (toStrict)  
import System.IO

sample = do  
  -- ...
  lgr <- newLogger Debug stdout
  env <- newEnv Discover <&> set envLogger lgr
  runResourceT . runAWST env . within region $ do
    void $ send $ sendRawEmail (rawMessage (toStrict msg))

region = Oregon  

heterocephalus

多分メールは長いのでテキストファイル作って、compileTextFileに渡す。

{-# LANGUAGE TemplateHaskell #-}

import Text.Heterocephalus (compileTextFile)

renderBody name = $(compileTextFile "sample.txt")

sample.txt

hello #{name}  
sample $ renderBody "nakaji-dayo"